在构造函数之外的对象初始化是否打破封装?
假设:
class MyClass
{
public string _aString;
}
_aString成员不应该是私有的,并且通过调用构造函数来实例化(这里省略了构造函数):
MyClass test = new MyClass("test");
而不是对象初始化的替代方法:
MyClass test = new MyClass { _aString = "Test" };
答案 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>