C#对象初始化选项

时间:2009-07-08 23:06:46

标签: c# object constructor initialization

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

假设:

class MyClass 
{  
    public string _aString;  
}

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

 MyClass test = new MyClass("test");

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

MyClass test = new MyClass { _aString = "Test" };

8 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:5)

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

class MyClass
{
    private string _aString;
    public string AString
    {
        get { return _aString; }
        // uncomment to make the property writable
        //set { _aString = value; }
    }
}

答案 2 :(得分:1)

如果您将Properties视为getter和setter,我认为它不会破坏封装。但是你应该注意到你没有使用Property,你已经使用了一个实例变量。事实上,我不相信它会像你的榜样一样。检查一下:

class MyClass {
    private string aString;

    public string AString {
        get { return aString; }
        set {aString = value; }
    }
}
MyClass test = new MyClass {
    AString = "test"
};

在这种情况下,您通过它的访问者访问私有字段。这就像使用无参数构造函数并稍后设置值一样。

答案 3 :(得分:0)

这取决于变量的用途。如果程序员应该只能在初始化时设置变量,但之后没有访问它,那么我会使用私有变量。如果您希望类用户能够随时设置/读取变量,请将其公开。

答案 4 :(得分:0)

当你有 public string _aString;
初始化此值时无关紧要,因为这已经暴露。因此,当我们想谈论初始化时,我们应该将此字符串移动到属性中。比谈论封装有意义。
所以,想象一下我们有一些字符串。初始化有两种方法。一个是在构造函数内部执行,第二个是延迟初始化(在某些请求此数据时初始化)。

答案 5 :(得分:0)

是,通过构造函数初始化,并添加属性以允许(或不)访问数据。

class MyClass {
private string _aString;
string MyProperty {
                    get { return this._aString; }
                    // you can make this  private or protected
                    set { this._aString = value; } 

                  }
}

答案 6 :(得分:0)

如果您询问新对象初始化速记是否破坏了封装,那么答案是否定的。您只能使用新方法设置公开范围的成员。

MyClass test = new MyClass { _aString = "Test" };

相同
MyClass test = new MyClass();
test._aString = "Test";

答案 7 :(得分:0)

在C#类中显示public对象不会从“面向对象编程”的角度打破“封装”。

从“良好实践”的角度来看,这不是一件好事,因为如果你改变更新这个值的行为(check,...),它允许外部代码使用这个类。< / p>