bbi*_*ill 53 c# constructor object-initializers
我最近在C#中学习了对象初始化程序,但是现在我想知道它在与构造函数冲突时是如何工作的.
public class A
{
public bool foo { get; set; }
public A()
{
foo = true;
}
public A(bool bar)
{
foo = bar;
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时会发生什么?
public class B
{
a = A() {foo = false};
b = A(true) {foo = false};
}
Run Code Online (Sandbox Code Playgroud)
构造函数中的默认值是一个bool
开始为true并且可以更改的好方法吗?
public A(bar=true)
{
foo = bar;
}
Run Code Online (Sandbox Code Playgroud)
Pau*_*sik 45
从文档:
编译器通过首先访问默认实例构造函数然后处理成员初始化来处理对象初始值设定项.
这意味着在最简单的情况下(命名对象初始化),它基本上是简写(或语法糖),用于调用默认构造函数然后调用属性setter(s).在匿名类型的情况下,实际上需要这种初始化而不仅仅是糖.
对于你的问题的第二部分:它更多的是风格问题,但如果你有一个关键属性,我不会创建一个默认值的构造函数.使客户端代码显式设置值.我也不确定为什么要做这样的事情:b = A(true) {foo = false};
除非你参加代码混淆比赛,否则这是一个好主意.
但有点谨慎:
...如果在类中将默认构造函数声明为private,则需要公共访问的对象初始值设定项将失败.
juh*_*arr 17
首先是构造函数,然后是对象初始值设定项.记住这一点
a = new A() { foo = false };
Run Code Online (Sandbox Code Playgroud)
和...一样
var temp = new A();
temp.foo = false;
a = temp;
Run Code Online (Sandbox Code Playgroud)
Lee*_*Lee 11
b = new A(true) {foo = false};
Run Code Online (Sandbox Code Playgroud)
实际上是:
A temp = new A(true);
temp.foo = false;
A b = temp;
Run Code Online (Sandbox Code Playgroud)
其他地方temp
是无法访问的变量.始终首先执行构造函数,然后执行任何初始化的属性.