2012-01-04 36 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'指针,你也不应该这样做。 – 2012-01-04 16:27:01

回答

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'。 – 2012-01-04 16:30:52

+2

如果新实例返回,它不再重置任何东西。它返回一个新创建的类的实例。有点误导。 – 2012-01-04 16:33:13

+0

确实,可能'Create()'是更好的方法名称。 – 2012-01-04 16:37:27

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 2013-12-07 04:29:43

2

可以调用类里面为你的类的构造函数(事实上,这是经常与工厂方法完成):

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

但你不能改变类内部的this参考价值。您应该让您的“重置()”方法将字段设置为其默认值。

1

在一类,你不能重新分配this(虽然这是值得注意的是,结构内是完全合法)。但问题是,你是否应该应该。我假设你的目标是将所有字段值设置为特定状态,因为其他人已经说过你可以让你的Reset方法返回一个新实例,或者你可以将你的逻辑分解成一个Clear()方法并调用它代替。

相关问题