【问题标题】:Closure access to private constructor in C#在 C# 中关闭对私有构造函数的访问
【发布时间】:2014-12-10 17:26:52
【问题描述】:

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

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

【问题讨论】:

  • 我认为这与关闭无关。它只是一个方法调用。
  • @CriketerOnSO 问题是关于如何将闭包转换为方法调用。

标签: c# closures


【解决方案1】:

在这种情况下,编译器根本不需要创建一个类——它可以只创建一个静态方法:

public static Func<SomeClass> GetFactoryMethod()
{
    return __GeneratedMethod;
}

private static SomeClass __GeneratedMethod()
{
    return new SomeClass();
}

即使它确实需要生成一个类 - 例如如果GetFactoryMethod() 有一个由 lambda 表达式捕获的参数 - 它将生成一个 nested 类,并且嵌套类可以访问其封闭类的私有成员:

public class Foo
{
    private Foo() {}

    public class Bar
    {
        public Foo MakeNewFoo()
        {
            return new Foo(); // This is absolutely fine
        }
    }
}

【讨论】:

    猜你喜欢
    • 2021-04-17
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多