2014-12-10 2 views
3

Я понимаю, как в закрытиях C# разрешен доступ к закрытым переменным, объявленным в той же области, что и анонимный метод, поэтому эти переменные доступны, когда метод вызывается в другой области.Закрытие доступа к частному конструктору в 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

Я не думаю, что это не имеет ничего делать с закрытием. Это просто вызов метода. – CriketerOnSO

+0

@CriketerOnSO Вопрос о том, как замыкание транслируется в вызов метода. – Servy

ответ

5

В этом случае компилятор не нужно создать класс на всех - он может просто создать статический метод:

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

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

Даже когда делает нужно создать класс - например, если GetFactoryMethod() имел параметр, который был захвачен лямбда-выражения - это будет генерировать вложенную класс, и вложенные классы имеют доступ к закрытым членам их вмещающих классов:

public class Foo 
{ 
    private Foo() {} 

    public class Bar 
    { 
     public Foo MakeNewFoo() 
     { 
      return new Foo(); // This is absolutely fine 
     } 
    } 
} 
Смежные вопросы