2012-01-04 6 views
9

я хочу вызвать конструктор внутри класса, как: общественного класса Myclass() {Как вызвать конструктор внутри класса?

public MyClass(){ 
     //...... 
    } 

    public MyClass(int id):this(){ 
     //...... 
    } 

    private void Reset(){ 
     //..... 
     this = new MyClass(id); //here I want to call constructor 
     //...... 
    } 
} 

, но он не работает. Возможно ли и как я могу это сделать, если да?

+2

Зачем вам это нужно? Вы не можете изменить указатель 'this' таким образом внутри метода экземпляра и не хотите этого делать. –

ответ

10

Вы не можете. Но то, что вы можете сделать, - это разделить логику конструктора на метод Initialize, который может вызвать сброс.

public MyClass(){ 
    //...... 
    } 

    public MyClass(int id):this(){ 
     Initialize(id); 
    } 

    private void Initialize(int id){ 
    //.... 
    } 

    private void Reset(){ 
     //..... 
     Initialize(id); 
     //...... 
    } 
} 
3

Нет, это невозможно. Вы не можете назначить это.

Вы можете однако позволить Reset() вернуть новый экземпляр MyClass поэтому код вызывающего абонента мог сказать:

public class MyClass 
{ 
    public MyClass Reset() 
    { 
     return new MyClass(); 
    } 
} 

MyClass c = new MyClass(); 
c = c.Reset(); 

Или вы могли бы реализовать метод Reset таким образом, что все поля инициализируются к значениям по умолчанию.

+0

Мне нравится идея Reset(), возвращающая новый экземпляр, в этом случае, вероятно, должен быть 'static'. –

+2

Если новый экземпляр был возвращен, он больше не перезагружает ничего. Он возвращает только что созданный экземпляр класса. Вид вводит в заблуждение. –

+0

Верно, возможно, 'Create()' будет лучшим именем метода. –

14

Простой ответ: вы не можете.

Чуть более сложный ответ: Переместить вашу логику инициализации в отдельный метод, который может вызываться из конструктора и ваш Reset() метод:

public class MyClass 
{ 
    public int? Id { get; } 

    public MyClass() 
    { 
     Initialize(); 
    } 

    public MyClass(int id) 
    { 
     Initialize(id); 
    } 

    public Reset() 
    { 
     Initialize(); 
    } 

    private Initialize(int? id = null) 
    { 
     // initialize values here instead of the constructor 
     Id = id; 
    } 
} 
+1

Это совершенно лаконично и ясно и очень помогло моему собственному пониманию. – secretwep

2

Вы можете вызов конструктор для класса внутри класса (на самом деле это часто делается с фабричными методами):

public class MyClass 
{ 
    public static MyClass Create() 
    { 
     return new MyClass(); 
    } 
} 

Но вы не можете изменить значение this ссылки внутри класса. Вместо этого вы должны использовать метод Reset(), чтобы вернуть поля к значениям по умолчанию.

1

В классе вы не можете переназначить this (хотя стоит отметить, что в рамках структуры это совершенно законно). Вопрос, однако, в том, 0 должен. Я предполагаю, что ваша цель - установить все значения полей в определенное состояние, так как другие люди уже сказали, что вы можете либо вернуть метод Reset к новому экземпляру, либо вы можете разбить свою логику на метод Clear() и вызвать это вместо.