首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#中使用属性的数据封装

C#中使用属性的数据封装
EN

Stack Overflow用户
提问于 2010-09-18 06:01:23
回答 7查看 11.4K关注 0票数 6

目前,我正在考虑C#中的数据封装,我有点困惑。几年前,当我开始学习C++编程时,我的教授告诉我:“创建一个类并隐藏它的数据成员,这样它就不能直接从外部操作。”

示例:您正在解析XML文件,并将解析的数据存储到解析器类中的一些数据成员中。

现在,当我看着C#时。您拥有这些属性。此功能使类的内部状态/内部数据对外部可见。不再有封装。对吗?

代码语言:javascript
复制
private string _mystring;
public string MyString
{
  get {return _mystring;}
  set {_mystring = value;}
}

在我看来,让数据成员成为公共成员和拥有公共属性没有区别,公共属性有getter和setter,您可以在其中传递私有数据成员。

有人能帮我解释一下吗?

谢谢

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-09-18 06:04:44

私有数据由属性本身封装。访问数据的唯一方法是通过属性。

在您的上述情况下,几乎没有理由使用该属性。但是,如果您以后需要添加一些验证,您可以在不破坏API的情况下,即::

代码语言:javascript
复制
private string _mystring;
public string MyString
{
  get {return _mystring;}
  set 
  {
      if (IsAcceptableInput(value))
         _mystring = value;
  }
}

请记住,在.NET中,属性实际上只是两个方法的更清晰的语法-一个方法用于属性get部分,另一个方法用于属性集部分。它提供了与C++中的一对方法相同的封装,但使用起来(可以说)是更好的语法。

票数 15
EN

Stack Overflow用户

发布于 2010-09-18 06:09:34

那么,房产并不是狂野的西部,你第一眼就会看到它们。OOP的不幸之处在于,您的许多方法都是getter和setter方法,而属性只是简化这一点的一种方式。此外,您还可以控制您希望该属性允许某人执行的操作。您可以将属性设置为可读但不可写,如下所示:

代码语言:javascript
复制
private string _mystring;
public string MyString
{
  get {return _mystring;}
}

或者,正如Reed所提到的,您可以使用set方法进行任意复杂度的转换或检查。例如,像这样的

代码语言:javascript
复制
private long myPrime;
public long Prime {
   get { return myPrime; }
   set { 
     if (prime(value) {
        myPrime = prime;
     }
     else {
        //throw an error or do nothing
     }
   }
}

您通常拥有从封装中获得的所有价值,并使用一些语法糖来简化一些常见的任务。你可以在其他语言中做同样的事情,只是看起来不同而已。

票数 2
EN

Stack Overflow用户

发布于 2010-09-18 06:04:09

属性的好处是,稍后,您可以决定向setter方法添加验证等,或者让getter方法执行一些计算或缓存,并且不需要更改已调用属性的代码-因为类的接口保持稳定

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3739369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档