你能在C#中使用没有字段的属性吗?

时间:2014-12-03 01:34:32

标签: c# properties field

在C#中,你可以使用没有字段的属性吗?

编辑以澄清:

private string _name;

public string Name
{
    get { return _name; }
    set { _name value; }
}

似乎他们总是配对,是否存在我们根本不使用该领域的情况?

3 个答案:

答案 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";
    }
}