C#对象初始化选项

Sco*_*ies 5 c# constructor initialization object

在构造函数之外的对象初始化是否打破封装?

鉴于:

class MyClass 
{  
    public string _aString;  
}
Run Code Online (Sandbox Code Playgroud)

_aString成员不应该是私有的,并且通过调用构造函数来实例化(此处省略了构造函数):

 MyClass test = new MyClass("test");
Run Code Online (Sandbox Code Playgroud)

而不是对象初始化的替代方法:

MyClass test = new MyClass { _aString = "Test" };
Run Code Online (Sandbox Code Playgroud)

Tim*_*vis 6

"在构造函数破解封装之外不进行对象初始化吗?"

好吧,不.正如您正确指出的那样,您只能初始化当前范围内已经可访问的属性.(公共,内部等)

这种初始化实际上只是构造一个类并为属性赋值的一些语法糖,它对于匿名类和Linq select子句非常有用.


Tho*_*que 5

暴露公共字段通常被认为是不好的做法......在某些情况下可能是可以接受的,例如,如果字段被标记为readonly(这意味着它必须在构造函数中设置).相反,您应该将此字段设为私有并通过属性公开它,该属性可能是也可能不是只读的,具体取决于其用途:

class MyClass
{
    private string _aString;
    public string AString
    {
        get { return _aString; }
        // uncomment to make the property writable
        //set { _aString = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)