使用 Func<Task 访问另一个类的私有方法<T>>



我有两个类,我试图从另一个类调用类的私有方法。

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。这也是可行的,因为我们提供了引用(对应的内存地址)。

相关内容

  • 没有找到相关文章

最新更新