Ste*_*ane 3 c# syntax object-initializers
我可以以某种方式获得对使用对象初始化器创建的实例的引用
var x = new TestClass
{
Id = 1,
SomeProperty = SomeMethod(this)
}
Run Code Online (Sandbox Code Playgroud)
"this"应该指向我正在创建的新TestClass实例.但它显然是指代码所在的类的实例.
我不是在问这是否是一个很好的方法.我知道我可以这样做:
var x = new TestClass {Id= x};
x.SomeProperty = SomeMethod(this);
Run Code Online (Sandbox Code Playgroud)
我有一个复杂的场景,在对象初始化器中引用新实例会使生活更轻松.
这有可能吗?
没有办法绕过它,C#规范明确地说"对象或集合初始化程序不可能引用正在初始化的对象实例."
至于为什么这是不可能的,我怀疑没有很好的方法来实现它.我们想要一些相当于的语法糖
var temp = new TestClass();
temp.Id = 1;
temp.SomeProperty = SomeMethod(temp);
x = temp;
Run Code Online (Sandbox Code Playgroud)
我们只需要temp在初始化程序中引用一个关键字,但没有一个是容易获得的.我们无法使用,this因为它已经意味着初始化器之外的东西.应SomeProperty = this.SomeMethod(this)等同于temp.SomeProperty = this.SomeMethod(temp)或temp.SomeProperty = temp.SomeMethod(temp)?第二个是一致的,但如果我们需要第一个会发生什么呢?
我们可以尝试使用x,但是如果新对象立即分配给变量,我们只能选择一个名称.但是,我们现在无法引用x初始化器内部的旧值,相当于temp.SomeProperty = SomeMethod(x).
我们可以重用value属性setter中的关键字.这听起来不错,因为value如果你认为属性getter是set_SomeProperty(value)方法的语法糖,那么已经代表缺少的参数.使用它来引用对象初始化程序中缺少的变量看起来很有希望.但是,我们可以在属性设置器中创建此对象,在这种情况下value已经在使用,我们需要能够做到temp.SomeProperty = SomeMethod(value).
看起来我们必须为此目的创建一个新的关键字,也许newthis.但是,这是对语言的重大更改,因为任何具有变量调用的代码newthis都不再起作用.Microsoft通常需要一个非常好的理由来引入重大更改,因此最好禁止访问正在初始化的对象.