在C#中,你可以使用没有字段的属性吗?
编辑以澄清:
private string _name;
public string Name
{
get { return _name; }
set { _name value; }
}
似乎他们总是配对,是否存在我们根本不使用该领域的情况?
答案 0 :(得分:2)
所有属性都必须有一个字段,假设它们是存储值(*)的简单属性。但是,语言(as of version 3.0)提供了一种隐式声明字段的方法。例如:
public int Value { get; set; }
这将声明一个名为Value
的属性,其隐式字段支持它,getter和setter都是public。您可以在getter或setter上包含accessibility关键字以限制对该属性的访问。例如:
public int Value { get; private set; }
在这种情况下,只有拥有类型可以调用setter,但任何类都可以调用getter。
下一版本的C#将具有处理这些“自动属性”的附加功能,允许您为它们提供简明的初始化语法。现在,您必须在构造函数中初始化它们。
编辑:根据您编辑的问题,似乎值得解决这个具体问题:“是否存在我们根本不使用该字段的情况?”
答案是, no 字段根本不参与。但这是可能的,并且对于属性来说不是 uncommon 而不使用字段作为属性的存储。例如,假设Rectangle
对象具有Area
属性:
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,这些方法可以做任何你想做的事情。我假设我们在这里讨论简单的基于价值的属性。
答案 1 :(得分:1)
如果你问我认为你是什么,答案是肯定的,你只需要得到;组;在财产声明中。 C#为你封装了一个变量。
编辑:示例
//no need for field declaration
public string Name
{
get;
set;
}
答案 2 :(得分:1)
属性不需要有字段
public string Version
{
get
{
return "1.3.Awesome";
}
}