请考虑以下代码:
private string _text = null;
private string[] _values = null;
public string Text { get { return _text; } }
public string[] Values { get { return _values; } }
如果仅仅让公众成员不这样做,那会是什么呢?
答案 0 :(得分:10)
通过使用属性而不是公共字段,您可以隐藏实现。
如果在某些时候您需要更改Text和Values属性返回的内容,则可以在不更改类的API的情况下更改行为。
此外,这个习惯用法将对暴露数据的外部访问限制为只读。
答案 1 :(得分:6)
这是为了使值只读,但我更倾向于这样写:
public string Text { get; private set;}
public string[] Values { get; private set; }
答案 2 :(得分:5)
此代码允许外部实体读取您的值,而您的代码可以在内部修改支持字段。
您可以使用自动属性进行简写:
public string Text { get; private set; }
public string[] Values { get; private set; }
使用公共字段,您将无法防止外部修改并同时支持内部修改。
即使您希望将字段公开为外部可写,我仍然建议将该事件封装在属性中 - 您永远不知道是否需要在不破坏外部合同的情况下在内部支持某些内容(set / get中的自定义代码给出你可以做到这一点)。
更不用说大多数数据绑定框架都看不到字段,只看到属性。
答案 3 :(得分:2)
_text
和_values
只能在定义它们的类中设置,但可以通过属性访问它们的值。
答案 4 :(得分:2)
在您的示例中,它将属性设置为只读,但也有其他用途。
public string Text { get { return _text; } }
如果你想在return_text
内部进行一些操作,然后针对proeperty Text
返回它,你可以这样做。
public string Text { get { return _text.ToUpper(); } }
这是字段Encapsulation
封装有时被称为第一支柱或 面向对象编程原理。根据原则 对于封装,类或结构可以指定每个的可访问性 它的成员是在类或结构之外的代码。方法和 不打算从类外部使用的变量 或隐藏装配以限制编码错误的可能性或 恶意攻击。
考虑以下示例:
// 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
,它通过属性Date
公开显示。现在,如果要设置日期的边界,则可以看到属性的设置部分。