尽管我同意低估一个糟糕的问题,但是有一个(另一个)资源注意到下面的编译基本相同,这真的很糟糕吗?
有没有办法判断是否正在设置属性
MyClass myClass = new MyClass() { Value = 5 };
或者
MyClass myClass = new MyClass();
myClass.Value = 5;
在我的应用程序中,我需要使用更喜欢使用对象初始化器语法,但我还需要只在对象构造期间出现的setter逻辑。
我认为答案是否定的,因为(据我所知)第一个基本上是第二个的捷径。但是否则我将不得不在设置器中放置逻辑,该逻辑应该只运行一次或改变我的初始化语法 - 这两者听起来都不具吸引力。
答案 0 :(得分:2)
完全没有区别。检查基础IL:
// Code size 30 (0x1e)
.maxstack 3
.locals init ([0] class MyProj.MyClass myClass,
[1] class MyProj.MyClass myClass2)
IL_0000: nop
IL_0001: newobj instance void MyProj.MyClass::.ctor()
IL_0006: dup
IL_0007: ldc.i4.5
IL_0008: callvirt instance void MyProj.MyClass::set_Value(int32)
IL_000d: nop
IL_000e: stloc.0
IL_000f: newobj instance void MyProj.MyClass::.ctor()
IL_0014: stloc.1
IL_0015: ldloc.0
IL_0016: ldc.i4.5
IL_0017: callvirt instance void MyProj.MyClass::set_Value(int32)
IL_001c: nop
IL_001d: ret
这是为以下代码生成的:
MyClass myClass = new MyClass() { Value = 5 };
MyClass myClass2 = new MyClass();
myClass.Value = 5;
对象初始值设定项只是语法糖,它们是为了在您使用对象时简化对象的构造而创建的。
但是,您可以查看以下帖子,了解使用对象初始化程序的好处:
答案 1 :(得分:0)
只有定义了setter才能使用初始值设定项。这只是一个简化:
var m = new MyClass();
m.MyInt = 3;
除此之外,你根本不应该依赖于此,但是你应该确保你的setter实际上正在做正确的事情(例如验证新值)。但是,如果要确保仅在初始化期间设置属性,为什么不使用readonly-property:
class MyClass
{
privarte readonly int _myInt;
public int MyInt { get { return this._myInt; } }
public MyClass(int theValue)
{
this._myInt = theValue;
}
}
现在你只能按如下方式实例化你的类:
var m = newMyClass(3);
如果设置者被调用或者它甚至已经过时,那么就会产生所有担忧。