在C#中关闭私有构造函数的访问权限

时间:2014-12-10 17:26:52

标签: c# closures

我理解在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();
    }
}

当编译器为闭包创建一个类时,它如何引用私有构造函数,或者在客户端代码调用匿名方法时允许它被访问?

1 个答案:

答案 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
        }
    }
}