我理解在C#闭包中如何允许访问在与匿名方法相同的作用域中声明的私有变量,以便在不同作用域中调用该方法时这些变量可用。
但私人建筑师怎么样?此代码有效:
class Program
{
static void Main(string[] args)
{
var someClassFactory = SomeClass.GetFactoryMethod();
var someclass = someClassFactory();
}
}
class SomeClass
{
private SomeClass()
{
}
public static Func<SomeClass> GetFactoryMethod()
{
return () => new SomeClass();
}
}
当编译器为闭包创建一个类时,它如何引用私有构造函数,或者在客户端代码调用匿名方法时允许它被访问?
答案 0 :(得分:5)
在这种情况下,编译器根本不需要创建一个类 - 它只能创建一个静态方法:
public static Func<SomeClass> GetFactoryMethod()
{
return __GeneratedMethod;
}
private static SomeClass __GeneratedMethod()
{
return new SomeClass();
}
即使 需要生成一个类 - 例如如果GetFactoryMethod()
有一个由lambda表达式捕获的参数 - 它将生成一个嵌套的类,并且嵌套类可以访问其封闭类的私有成员:
public class Foo
{
private Foo() {}
public class Bar
{
public Foo MakeNewFoo()
{
return new Foo(); // This is absolutely fine
}
}
}