所有属性都必须有一个字段,假设它们是用于存储值的简单属性(*)。然而,语言(截至3.0版本)提供了一种隐式声明字段的方式。例如:
public int Value { get; set; }
这将声明一个名为Value
的属性,具有隐式字段来支持它,并且getter和setter都是public。您可以在getter或setter上包含访问权限关键字以限制对属性的访问。例如:
public int Value { get; private set; }
在这种情况下,只有拥有类型才能调用setter,但任何类都可以调用getter。
C#的下一个版本将具有处理这些“自动属性”的附加功能,允许您为它们提供简洁的初始化语法。目前,您必须在构造函数中初始化它们。
编辑:根据您编辑后的问题,似乎值得回答这个具体问题:“是否存在不使用字段的情况?”
答案是,通常情况下并不会完全没有涉及到字段。但是这是可能的,并且对于某个属性而言,不使用字段作为存储属性也并不罕见。例如,想象一个带有“Area”属性的“Rectangle”对象:
class Rectangle
{
public double Width { get; private set; }
public double Height { get; private set; }
public double Area { get { return Width * Height; } }
}
显然,这里涉及到字段(其中两个),但没有专门用于“Area”属性的字段。
另一个例子是属性委托。例如,在WinForms
Form
子类中,通常通过属性公开特定控件的值:
class MyForm : Form
{
public string EditText
{
get { return textBox1.Text; }
set { textBox1.Text = value; }
}
}
再次强调,这里使用了textBox1
字段。但它实际上代表的不是属性本身,而是该字段所引用对象的成员。
我希望这样可以充分澄清字段和属性之间的关系。如果需要进一步澄清,请随时提问。
(*) 注意,属性的唯一真正规则是它们必须至少有一个getter或setter,并且这些方法可以执行任何您想要的操作。我假设我们在这里谈论简单的基于值的属性。