是否可以使用C#中没有字段的属性?

是否可以使用C#中没有字段的属性?,c#,properties,field,C#,Properties,Field,在C#中,可以使用没有字段的属性吗 编辑以澄清: private string _name; public string Name { get { return _name; } set { _name value; } } 好像他们总是成对的,有没有一种情况我们根本不使用这个字段?如果你问我认为你是什么,答案是肯定的,你只需要输入get;设置在属性声明中。C#为您封装了一个变量 编辑:示例 //no need for field declaration public str

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

编辑以澄清:

private string _name;

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

好像他们总是成对的,有没有一种情况我们根本不使用这个字段?

如果你问我认为你是什么,答案是肯定的,你只需要输入get;设置在属性声明中。C#为您封装了一个变量

编辑:示例

//no need for field declaration
public string Name
{
    get;
    set;
}

所有属性都必须有一个字段,假设它们是存储值(*)的简单属性。但是,语言()提供了隐式声明字段的方法。例如:

public int Value { get; set; }
public int Value { get; private set; }
这将声明一个名为
Value
的属性,该属性有一个隐式字段作为后盾,getter和setter都是公共的。您可以在getter或setter上包含可访问性关键字,以限制对属性的访问。例如:

public int Value { get; set; }
public int Value { get; private set; }
在这种情况下,只有拥有的类型可以调用setter,但任何类都可以调用getter

C#的下一个版本将具有处理这些“自动属性”的附加功能,允许您为它们提供简洁的初始化语法。现在,您必须在构造函数中初始化它们


编辑:根据您编辑的问题,似乎有必要解决这个具体问题:“是否存在我们根本不使用字段的情况?”

答案是,根本不涉及任何领域是不常见的。但这是可能的,而且属性不使用字段作为属性的存储也并不少见。例如,假设一个
矩形
对象具有
区域
属性:

class Rectangle
{
    public double Width { get; private set; }
    public double Height { get; private set; }
    public double Area { get { return Width * Height; } }
}
class MyForm : Form
{
    public string EditText
    {
        get { return textBox1.Text; }
        set { textBox1.Text = value; }
    }
}
显然涉及到一些字段(其中两个),但没有一个字段专门用于
区域
属性

另一个示例是属性委托的位置。例如,在WinForms
Form
子类中,通常通过属性公开特定的控件值:

class Rectangle
{
    public double Width { get; private set; }
    public double Height { get; private set; }
    public double Area { get { return Width * Height; } }
}
class MyForm : Form
{
    public string EditText
    {
        get { return textBox1.Text; }
        set { textBox1.Text = value; }
    }
}
这里再次使用
textBox1
字段。但它实际上代表的不是财产本身。属性正在使用字段引用的对象的成员

我希望这能为您充分澄清字段和属性之间的关系。如有需要,请随时要求进一步澄清



(*)请注意,属性的唯一真正规则是它们至少有一个getter或setter,这些方法可以执行任何您想要的操作。我假设我们在这里讨论的是简单的基于值的属性。

属性不需要有字段

public string Version
{
    get
    {
      return "1.3.Awesome";
    }
}

当然,有些地产是沙漠、沼泽地等。你可以使用一块地产,即使它没有田地。别开玩笑了,我不知道你在问什么,你能详细说明一下吗?当然,我会编辑main。例如,如果它只返回一个常量,就没有字段。属性不使用返回(get)和值(set)字段吗?@dbeaulieu它使用它内部创建的字段,你不必创建它。谢谢你的澄清。。。所以,如果我理解正确的话,总是有一个字段,它并不总是明确定义的。在自动属性的情况下,C#编译器会自动添加字段?我认为用词来回答这个问题是一种非常混乱的方式。属性在任何方面都不需要字段。对于自动实现的属性,编译器生成一个字段。@mike z我想这取决于问题的措辞。如果它是“我是否需要包含一个带有属性的字段”它是否,如果问题是“每个属性是否都有一个字段”,答案将是肯定的。不幸的是,我的问题不太清楚。@dbeaulieu但第二个问题的答案也是“否”。@mike z,我的印象是答案是肯定的,因为在自动属性的情况下,C#编译器会隐式推断字段???这是错误的吗?