2009-07-08 85 views
5

对象初始化之外的构造函数break封装吗?C#对象初始化选项

鉴于:

class MyClass 
{ 
    public string _aString; 
} 

不应该_aString构件是专用的和经由到构造函数的调用(构造这里省略)实例:

MyClass test = new MyClass("test"); 

代替对象初始化的替代方法:

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

哇! 5个答案在任何时间!感谢大家。 此代码来自一本关于C#的书。我很好奇这是否是最佳做法。 – 2009-07-08 23:26:58

回答

6

“不对对象初始化构造函数中断外封装?”

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

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

5

通常认为暴露公共fi字段......在某些情况下它可能是可接受的,例如,如果该字段被标记为readonly(这意味着它必须在构造函数中设置)。相反,你应该让这个私人领域,并通过一个属性,它可能会或可能不会是只读的,这取决于其目的暴露它:

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

这取决于该变量的目的。如果程序员只能在初始化时设置变量,但之后无法访问变量,那么我将使用私有变量。如果您希望班级用户随时可以设置/读取变量,请将其公开。

0

当你有
public string _aString;
真的,当你因为这是已经曝光的初始化这个值无关紧要。所以,当我们想谈论初始化时,我们应该将这个字符串移入属性。比谈论封装是有道理的。
所以,想象我们有一些字符串。最初有两种初始化方法。一个是在构造函数内部执行,第二个是惰性初始化(当请求这些数据时初始化)。

0

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

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

        } 
} 
1

如果你认为属性作为getter和setters,我不相信它会打破封装。但是你应该注意到你没有使用一个Property,你已经使用了一个实例变量。事实上,我不相信它会像你的榜样那样工作。检查这一个:

class MyClass { 
    private string aString; 

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

在这种情况下,您通过它的存取访问私人领域。这就像使用无参数构造函数并稍后设置值。

+1

直接设置公共字段在对象初始化器中是一个好的方法(从语言语义角度来看,不是正确的设计)。 – 2009-07-08 23:17:21

0

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

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

相同

MyClass test = new MyClass(); 
test._aString = "Test"; 
0

要显示在C#类的对象公众不但从“面向对象编程中的”点打破“封装”。

从“良好实践”的角度来看,这不是一件好事,因为如果您更改更新此值(检查,...)的行为,它允许外部代码使用此类。