链接构造函数没有按预期更新变量

问题描述:

我创建了一个类似下面的类。正如你可以看到我创造,我想链的几个构造函数使用: this()链接构造函数没有按预期更新变量

class RTTutils 
{ 
    #region Variables 

    private bool verbose = false; 
    private bool canWrite = false; 

    private int x; 
    private int y; 

    public RTTutils() 
    { 
     x = 5; 

     y = 5; 

     RTTCalc(); 
    } 

    public RTTutils(int samples, bool verbose) : this() 
    { 
     this.verbose = verbose; 
     this.samples = samples; 
    } 

    public RTTutils(int samples, bool verbose, bool canWrite) : this() 
    { 
     this.verbose = verbose; 
     this.samples = samples; 
     this.canWrite = canWrite; 
    } 

    public RTTutils(int samples) : this(samples, false, false) 
    { 
    } 

    public RTTutils(bool verbose) : this() 
    { 
     this.verbose = verbose; 
    } 

    private void RTTCalc() 
    { 
     if (this.verbose) 
      Console.WriteLine("Test"); 
    } 

我试图用

RTTutils rttcalculator = new RTTutils(true); 

verbosecanWrite任何其他组合进行初始化,他们仍然false虽然。在这种情况下,我们将看到控制台中没有任何内容显示,即使在初始化类时我指示了true

我在这种情况下做错了什么?

+2

您需要提供一个可以真正重现问题的例子。因为它不足以证明你的问题。 – Servy

+0

“虽然”他们仍然是'虚假',何时,何地以及如何获取这些信息? – Quantic

+0

相关:http://stackoverflow.com/q/1814953/215552 –

您希望(错误地)方法RTTCalc中使用的布尔类字段具有您在带参数的构造函数中设置的值。但是,无参数构造函数在这些赋值之前执行。

不要在无参数构造函数中调用RTTCalc。提供静态工厂方法:

class RTTutils 
{ 
    private bool verbose = false; 
    private bool canWrite = false; 

    private RTTutils() 
    { 
     sampleList.Add(100); // First sample should be 100 
     optionChosen.Add("E"); 

     x = 5; 
     y = 5; 

     System.IO.File.Delete(this.path); 
    } 

    private RTTutils(bool verbose) : this() 
    { 
     this.verbose = verbose; 
    } 

    private void RTTCalc() 
    { 
     if (this.verbose) 
      Console.WriteLine("Test"); 
    }  

    public static RTTutils Create(bool verbose) 
    { 
     RTTutils result = new RTTutils(verbose); 
     result.RTTCalc(); 
     return result; 
    } 
} 

鉴于上面的代码,我重写了它,并初始化verbose和canWrite,如预期的那样。

类Foo {

private bool _verbose = false; 
    private bool _canWrite = false; 
    private int _samples; 
    private int x; 
    private int y; 


    public Foo(int samples, bool verbose, bool canWrite) 
    { 
     _verbose = verbose; 
     _canWrite = canWrite; 
     _samples = samples; 
     x = 5; 
     y = 5; 

     RTTCalc(); 
    } 
    public Foo() : this(0, false, false) { } 

    public Foo(int samples) : this(samples, false, false) { } 

    public Foo(int samples, bool verbose) : this(samples, verbose, false) { } 


    private void RTTCalc() 
    { 
     Console.WriteLine($"V={_verbose}, S={_canWrite}"); 
     Console.ReadKey(); 
    } 

} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Foo test1 = new Foo(1, true, false); 
     Foo test2 = new Foo(1, true); 
     Foo test3 = new Foo(); 

    } 
} 

这是否对你的工作?如果没有,那么你正在做的事情是你的代码中没有显示影响verbose和canWrite的其他东西。