Dan*_*ieu 7 c# field properties
在 C# 中,可以使用没有字段的属性吗?
编辑以澄清:
private string _name;
public string Name
{
    get { return _name; }
    set { _name value; }
}
Run Code Online (Sandbox Code Playgroud)
看起来它们总是成对的,有没有我们根本不使用该字段的情况?
Pet*_*iho 11
所有属性都必须有一个字段,假设它们是存储值 (*) 的简单属性。然而,该语言(从版本 3.0 开始)提供了一种隐式声明字段的方法。例如:
public int Value { get; set; }
Run Code Online (Sandbox Code Playgroud)
这将声明一个Value以支持它的隐式字段命名的属性,并且 getter 和 setter 都是公共的。您可以在 getter 或 setter 上包含可访问性关键字,以限制对属性的访问。例如:
public int Value { get; private set; }
Run Code Online (Sandbox Code Playgroud)
在这种情况下,只有所属类型可以调用 setter,但任何类都可以调用 getter。
C# 的下一版本将具有处理这些“自动属性”的附加功能,允许您为它们提供简洁的初始化语法。现在,您必须在构造函数中初始化它们。
编辑:根据您编辑的问题,似乎值得解决这个具体问题:“是否存在我们根本不使用该字段的情况?”
答案是,完全没有任何领域参与的情况并不常见。但这是可能的,并且属性不使用字段作为属性的存储的情况并不少见。例如,想象一个Rectangle具有属性的对象Area:
class Rectangle
{
    public double Width { get; private set; }
    public double Height { get; private set; }
    public double Area { get { return Width * Height; } }
}
Run Code Online (Sandbox Code Playgroud)
显然有涉及到的领域(其中两个),但没有一个领域专门致力于Area属性的字段。
另一个例子是财产委托。例如,在 WinFormsForm子类中,通常通过属性公开特定的控件值:
class MyForm : Form
{
    public string EditText
    {
        get { return textBox1.Text; }
        set { textBox1.Text = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)
再次,textBox1这里使用了该字段。但它实际上代表的是财产本身以外的东西。该属性正在使用字段引用的对象的成员。
我希望这足以为您阐明字段和属性之间的关系。如果需要,请随时要求进一步说明。
(*) 请注意,属性的唯一真正规则是它们至少具有 getter 或 setter 之一,并且这些方法可以执行您想要的任何操作。我假设我们在这里讨论的是简单的基于值的属性。