目前,我正在考虑C#中的数据封装,我有点困惑。几年前,当我开始学习C++编程时,我的教授告诉我:“创建一个类并隐藏它的数据成员,这样它就不能直接从外部操作。”
示例:您正在解析XML文件,并将解析的数据存储到解析器类中的一些数据成员中。
现在,当我看着C#时。您拥有这些属性。此功能使类的内部状态/内部数据对外部可见。不再有封装。对吗?
private string _mystring;
public string MyString
{
get {return _mystring;}
set {_mystring = value;}
}在我看来,让数据成员成为公共成员和拥有公共属性没有区别,公共属性有getter和setter,您可以在其中传递私有数据成员。
有人能帮我解释一下吗?
谢谢
发布于 2010-09-18 06:04:44
私有数据由属性本身封装。访问数据的唯一方法是通过属性。
在您的上述情况下,几乎没有理由使用该属性。但是,如果您以后需要添加一些验证,您可以在不破坏API的情况下,即::
private string _mystring;
public string MyString
{
get {return _mystring;}
set
{
if (IsAcceptableInput(value))
_mystring = value;
}
}请记住,在.NET中,属性实际上只是两个方法的更清晰的语法-一个方法用于属性get部分,另一个方法用于属性集部分。它提供了与C++中的一对方法相同的封装,但使用起来(可以说)是更好的语法。
发布于 2010-09-18 06:09:34
那么,房产并不是狂野的西部,你第一眼就会看到它们。OOP的不幸之处在于,您的许多方法都是getter和setter方法,而属性只是简化这一点的一种方式。此外,您还可以控制您希望该属性允许某人执行的操作。您可以将属性设置为可读但不可写,如下所示:
private string _mystring;
public string MyString
{
get {return _mystring;}
}或者,正如Reed所提到的,您可以使用set方法进行任意复杂度的转换或检查。例如,像这样的
private long myPrime;
public long Prime {
get { return myPrime; }
set {
if (prime(value) {
myPrime = prime;
}
else {
//throw an error or do nothing
}
}
}您通常拥有从封装中获得的所有价值,并使用一些语法糖来简化一些常见的任务。你可以在其他语言中做同样的事情,只是看起来不同而已。
发布于 2010-09-18 06:04:09
属性的好处是,稍后,您可以决定向setter方法添加验证等,或者让getter方法执行一些计算或缓存,并且不需要更改已调用属性的代码-因为类的接口保持稳定
https://stackoverflow.com/questions/3739369
复制相似问题