C# Object Initialiser - 对新实例的引用

标签 c# syntax object-initializers

我能以某种方式获得对我正在使用对象初始化器创建的实例的引用吗

var x = new TestClass
           {
                 Id = 1,
                 SomeProperty = SomeMethod(this)
           }

“this”应该指向我正在创建的新 TestClass 实例。但它显然引用了这段代码所在的类的实例。

我不是在问这是否是执行此操作的好方法。 我知道我可以这样做:

var x = new TestClass {Id= x};
x.SomeProperty = SomeMethod(this);

我有一个复杂的场景,在这个场景中,在对象初始化器中引用新实例会让生活变得更轻松。

这有可能吗?

最佳答案

没有办法解决它,C# 规范明确指出 "It is not possible for an object or collection initializer to refer to the object instance being initialized."

至于为什么不可能,我怀疑只是没有很好的方法来实现它。我们想要一些语法糖等同于

var temp = new TestClass();
temp.Id = 1;
temp.SomeProperty = SomeMethod(temp);
x = temp;

我们只需要一个关键字来引用初始化器中的temp,但没有一个是容易获得的。我们不能使用 this 因为它已经意味着初始化器之外的东西。 SomeProperty = this.SomeMethod(this) 是否应该等同于 temp.SomeProperty = this.SomeMethod(temp)temp.SomeProperty = temp.SomeMethod(temp) ?第二个是一致的,但是如果我们需要第一个会发生什么?

我们可以尝试使用 x,但如果新对象立即分配给变量,我们只能选择一个名称。但是,我们现在不能在初始化程序中引用 x 的旧值,这相当于 temp.SomeProperty = SomeMethod(x)

我们可以重用属性 setter 中的 value 关键字。这听起来不错,因为如果您将属性 getter 视为 set_SomeProperty(value) 方法的语法糖,则 value 已经代表缺少的参数。用它来引用对象初始值设定项中缺少的变量看起来很有希望。但是,我们可以在属性 setter 中创建此对象,在这种情况下 value 已被使用,我们需要能够执行 temp.SomeProperty = SomeMethod(value).

看起来我们必须为此目的创建一个新关键字,也许是 newthis。然而,这是对该语言的重大更改,因为任何具有名为 newthis 的变量的代码都不再有效。 Microsoft 通常需要一个非常好的理由来引入重大更改,因此最好禁止访问正在初始化的对象。

关于C# Object Initialiser - 对新实例的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3564626/

相关文章:

c - C 中的语法 else if

c# - 组合列表初始化器和对象初始化器

C#:如何从 GAC 加载程序集?

c# - 寻找 .NET 配置框架

list - 每次递增都会创建一个子列表的 Lisp 程序

PHP:变量后的双方括号?

c# - 我在使用 C# 对象初始值设定项时做错了什么?

ruby - 你如何从初始化方法调用类方法?

c# - "Inheritance"属性 : what does it do?

c# - 寻路 - 索引越界