我有两个类,我试图从另一个类调用类的私有方法。
Program.cs
namespace TestIdentity
{
internal class Program
{
private static int y = 10;
static void Main(string[] args)
{
Func<Task<int>> getter = async () => await Get();
Test test = new Test();
test.SolveAsync(getter).Wait();
}
private static async Task<int> Get()
{
Console.WriteLine("Private value y : " + y);
await Task.Delay(1000);
return 1;
}
}
}
Test.cs
namespace TestIdentity
{
internal class Test
{
public async Task SolveAsync(Func<Task<int>> func)
{
int x = await func();
Console.WriteLine("hello : " + x);
}
}
}
我想知道测试类中的SolveAsync方法如何访问Program类的私有方法及其私有属性。
简短的回答:Test类本身不能看到私有函数和字段,但是您提供了引用作为参数。委托是一个(类型安全的)指针。你的Func<Task<int>> getter
是一个专门的委托。因此,您创建了一个指向私有函数Get
的指针。这个指针在你的SolveAsync
函数中作为参数给出。
SolveAsync
只调用位于给定内存地址的代码块,而不知道它属于Program
类。
另一个例子:
class Program
{
static void Main(string[] args)
{
int x = 2;
MyMath.Pow2Override(ref x);
Console.WriteLine($"x = {x}");
}
}
static class MyMath
{
public static void Pow2Override(ref int x)
{
x *= x;
}
}
这里我们调用Pow2Override
,它可以访问一个局部变量。即使是Program
类也不能在Main
函数之外看到x
。这也是可行的,因为我们提供了引用(对应的内存地址)。