您能区分对象初始化期间的属性集和单独的一个集吗?

时间:2017-07-10 14:25:37

标签: c# constructor

尽管我同意低估一个糟糕的问题,但是有一个(另一个)资源注意到下面的编译基本相同,这真的很糟糕吗?

有没有办法判断是否正在设置属性

MyClass myClass = new MyClass() { Value = 5 };

或者

MyClass myClass = new MyClass();
myClass.Value = 5;

在我的应用程序中,我需要使用更喜欢使用对象初始化器语法,但我还需要只在对象构造期间出现的setter逻辑。

我认为答案是否定的,因为(据我所知)第一个基本上是第二个的捷径。但是否则我将不得不在设置器中放置逻辑,该逻辑应该只运行一次或改变我的初始化语法 - 这两者听起来都不具吸引力。

2 个答案:

答案 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;

对象初始值设定项只是语法糖,它们是为了在您使用对象时简化对象的构造而创建的。

但是,您可以查看以下帖子,了解使用对象初始化程序的好处:

Is there any benefit of using an Object Initializer?

答案 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);
如果设置者被调用或者它甚至已经过时,那么就会产生所有担忧。