考虑以下代码:
private string _text = null;
private string[] _values = null;
public string Text { get { return _text; } }
public string[] Values { get { return _values; } }
这能完成什么只有公众成员不能完成的事情?
考虑以下代码:
private string _text = null;
private string[] _values = null;
public string Text { get { return _text; } }
public string[] Values { get { return _values; } }
这能完成什么只有公众成员不能完成的事情?
通过使用属性而不是公共字段,您可以隐藏实现。
如果在某些时候您需要更改 Text 和 Values 属性返回的内容,您可以在不更改类 API 的情况下更改行为。
此外,此习惯用法将外部对公开数据的访问限制为只读。
这是使值只读,尽管我更倾向于这样写:
public string Text { get; private set;}
public string[] Values { get; private set; }
此代码将允许外部实体读取您的值,而您的代码在内部可以修改支持字段。
您可以使用自动属性来简写:
public string Text { get; private set; }
public string[] Values { get; private set; }
使用公共字段,您将无法同时防止外部修改和支持内部修改。
即使您想将字段公开为外部可写,我仍然建议将事物封装在属性中 - 您永远不知道是否需要在不破坏外部合同的情况下在内部支持某些内容(set/get 中的自定义代码为您提供空间做这个)。
更不用说大多数数据绑定框架看不到字段,只有属性。
和只能在定义它们的类中设置,但它们的值可以通过属性访问_text
。_values
在您的示例中,它将属性设置为只读,但也有其他用途。
public string Text { get { return _text; } }
如果您想在内部进行一些操作return_text
,然后针对 proeperty 返回它,Text
您可以使用类似的方法。
public string Text { get { return _text.ToUpper(); } }
这是字段封装
封装有时被称为面向对象编程的第一支柱或原则。根据封装原则,类或结构可以指定其每个成员对类或结构之外的代码的可访问性。可以隐藏不打算从类或程序集外部使用的方法和变量,以限制编码错误或恶意攻击的可能性。
考虑以下示例:
// private field
private DateTime date;
// Public property exposes date field safely.
public DateTime Date
{
get
{
return date;
}
set
{
// Set some reasonable boundaries for likely birth dates.
if (value.Year > 1900 && value.Year <= DateTime.Today.Year)
{
date = value;
}
else
throw new ArgumentOutOfRangeException();
}
}
在此示例中,有一个私有字段date
通过 property 公开Date
。现在,如果您想设置日期的边界,那么您可以看到属性的设置部分。