我知道这应该是一个超级简单的问题,但我已经在这个概念上挣扎了一段时间。
我的问题是,如何在c#中使用链构造函数?
我第一次上面向对象编程课,所以我还在学习。我不明白构造函数链接是如何工作的,如何实现它,甚至为什么它比没有链接的构造函数更好。
我希望你能给我一些解释的例子。
那么怎么把它们拴起来呢?
我知道这句话是:
public SomeClass this: {0}
public SomeClass
{
someVariable = 0
}
但是你怎么处理3个,4个等等?
再说一次,我知道这是一个初学者的问题,但我很难理解,我不知道为什么。
我希望下面的例子能对构造函数链接有所启发。
以我这里的用例为例,你希望用户传递一个目录给你的
构造函数时,用户不知道要传递什么目录,并决定让
您可以分配默认目录。您可以进一步分配一个您认为的默认目录
将工作。
顺便说一句,我在这个例子中使用了LINQPad,以防你想知道*. dump()是什么。干杯
void Main()
{
CtorChaining ctorNoparam = new CtorChaining();
ctorNoparam.Dump();
//Result --> BaseDir C:\Program Files (x86)\Default\
CtorChaining ctorOneparam = new CtorChaining("c:\\customDir");
ctorOneparam.Dump();
//Result --> BaseDir c:\customDir
}
public class CtorChaining
{
public string BaseDir;
public static string DefaultDir = @"C:\Program Files (x86)\Default\";
public CtorChaining(): this(null) {}
public CtorChaining(string baseDir): this(baseDir, DefaultDir){}
public CtorChaining(string baseDir, string defaultDir)
{
//if baseDir == null, this.BaseDir = @"C:\Program Files (x86)\Default\"
this.BaseDir = baseDir ?? defaultDir;
}
}
你可以使用标准语法(像使用方法一样)在类内部选择重载:
class Foo
{
private int id;
private string name;
public Foo() : this(0, "")
{
}
public Foo(int id, string name)
{
this.id = id;
this.name = name;
}
public Foo(int id) : this(id, "")
{
}
public Foo(string name) : this(0, name)
{
}
}
然后:
Foo a = new Foo(), b = new Foo(456,"def"), c = new Foo(123), d = new Foo("abc");
还请注意:
可以使用base(…)链接到基类型上的构造函数。
您可以在每个构造函数中放入额外的代码
默认值(如果你不指定任何东西)是base()
“为什么?”:
代码减少(总是一件好事)
必须调用非默认的基构造函数,例如:
SomeBaseType(int id): base(id){…}
注意,你也可以以类似的方式使用对象初始化器,尽管(不需要写任何东西):
SomeType x = new SomeType(), y = new SomeType { Key = "abc" },
z = new SomeType { DoB = DateTime.Today };
所有这些答案都很好,但我想对构造函数的初始化稍加说明。
class SomeClass {
private int StringLength;
SomeClass(string x) {
// this is the logic that shall be executed for all constructors.
// you dont want to duplicate it.
StringLength = x.Length;
}
SomeClass(int a, int b): this(TransformToString(a, b)) {
}
private static string TransformToString(int a, int b) {
var c = a + b;
return $"{a} + {b} = {c}";
}
}
尽管这个例子没有这个静态函数也可以解决,但是静态函数允许更复杂的逻辑,甚至可以从其他地方调用方法。
我希望下面的例子能对构造函数链接有所启发。
以我这里的用例为例,你希望用户传递一个目录给你的
构造函数时,用户不知道要传递什么目录,并决定让
您可以分配默认目录。您可以进一步分配一个您认为的默认目录
将工作。
顺便说一句,我在这个例子中使用了LINQPad,以防你想知道*. dump()是什么。干杯
void Main()
{
CtorChaining ctorNoparam = new CtorChaining();
ctorNoparam.Dump();
//Result --> BaseDir C:\Program Files (x86)\Default\
CtorChaining ctorOneparam = new CtorChaining("c:\\customDir");
ctorOneparam.Dump();
//Result --> BaseDir c:\customDir
}
public class CtorChaining
{
public string BaseDir;
public static string DefaultDir = @"C:\Program Files (x86)\Default\";
public CtorChaining(): this(null) {}
public CtorChaining(string baseDir): this(baseDir, DefaultDir){}
public CtorChaining(string baseDir, string defaultDir)
{
//if baseDir == null, this.BaseDir = @"C:\Program Files (x86)\Default\"
this.BaseDir = baseDir ?? defaultDir;
}
}