这个对象初始化模式叫什么?

19

我正在审查一些代码,其中有一个对象初始化模式我不认识 - 有人能告诉我这种模式叫什么(以及在哪里找到使用文档)吗?

obj.myType = (myVar = new MyType());

如果有所影响,具体使用情况如下:

protected MyType myVar;
protected readonly MyComplexType myComplexType;

protected void Page_Init(object sender, EventArgs e)) {
    ...
    myComplexType.myType = (myVar = new MyType());
    ...
}

1
其中一个例子是懒加载字段:get { return fld ?? (fld = new C()); }。一旦你习惯了这种方式,它就是一种简洁的快捷方式。 - usr
2
我会称这种模式为“糟糕的代码”。 - Mick
1个回答

19

这只是将同一个值赋值两次——一次给myVar,一次给myComplexType.myType

等价于:

var tmp = new MyType();
myVar = tmp;
myComplexType.myType = tmp;

(在某些复杂情况下可能会有类型转换,但我不认为在这种特定情况下会有任何类型转换。)

当然,您不需要使用额外的局部变量。此代码是“某种程度上等效”的,但涉及从myVar读取,因此不是完全等效,但更可能是您要使用的:

myVar = new MyType();
myComplexType.myType = myVar;

这种情况没有特定的名称,而在表达式中使用赋值语句的结果相对较少,最常见的例子是:

string line;
while ((line = reader.ReadLine()) != null)
{
    ...
}

1
那么我猜就没有使用它的理由了? - smoksnes
6
这是将相同的值赋给两个变量的一种简短方式......你是否喜欢使用它而不是冗长的方式是另一回事。 - Jon Skeet
1
我更喜欢可读性,所以对于像这样罕见的模式,我必须同意@smoksnes的看法。 - Mark Cooper
C# 对此的处理与其他语言有所不同吗?在大多数语言中,a = b = c; 等同于 b=c; a=b;,这会产生差异,如果 a = c 是合法赋值,但 a = b 不是(例如,如果 b 的类型比 ac 更广泛)。 - Holger
1
@Holger:不,听起来大部分C#与你所想的语言相同。这里的“等价”代码是利用我们知道myVar类型的事实。很难给出在所有情况下都完全等效的代码,而不使答案变得非常混乱。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接