链接构造函数没有按预期更新变量
问题描述:
我创建了一个类似下面的类。正如你可以看到我创造,我想链的几个构造函数使用: 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);
或verbose
和canWrite
任何其他组合进行初始化,他们仍然false
虽然。在这种情况下,我们将看到控制台中没有任何内容显示,即使在初始化类时我指示了true
。
我在这种情况下做错了什么?
答
您希望(错误地)方法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的其他东西。
您需要提供一个可以真正重现问题的例子。因为它不足以证明你的问题。 – Servy
“虽然”他们仍然是'虚假',何时,何地以及如何获取这些信息? – Quantic
相关:http://stackoverflow.com/q/1814953/215552 –