在C#中,你是否可以使用一个没有字段的属性?

7
在C#中,你可以使用一个没有字段的属性吗?
澄清编辑:
private string _name;

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

看起来它们总是成对出现的,是否存在我们根本不使用该字段的情况呢?


当然,有些属性是沙漠、沼泽地等。即使一块土地上没有田地,你仍然可以使用它。开玩笑的,我不确定你在问什么,能否详细说明一下? - cost
当然,我会编辑主要部分。 - Dan Beaulieu
如果它只返回一个常量,那么就没有字段,例如。 - Mike Zboray
3个回答

10

所有属性都必须有一个字段,假设它们是用于存储值的简单属性(*)。然而,语言(截至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,并且这些方法可以执行任何您想要的操作。我假设我们在这里谈论简单的基于值的属性。


感谢您的澄清...所以如果我理解正确,总是有一个字段,只是不总是明确定义的。在自动属性的情况下,C#编译器会自动添加字段? - Dan Beaulieu
1
我认为这是一种非常令人困惑的回答方式。属性并不需要任何字段。使用自动实现的属性,编译器会生成一个字段。 - Mike Zboray
@dbeaulieu 但是对于第二个问题的答案也是“不”。 - Mike Zboray
@mike z,我原本以为答案是肯定的,因为在自动属性的情况下,C#编译器会隐式地推断出一个字段?这是错误的吗? - Dan Beaulieu
1
值得注意的是,自动属性是在C# 3.0中引入的;在此之前,您必须为getter和setter定义后备变量。 - Elliot Rodriguez
显示剩余3条评论

2

属性不一定需要有字段。

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

1
我认为即使在这种情况下,也会在幕后生成一个隐含的字段。 - GeorgiG

1
如果你问的是我想象中的问题,答案是肯定的,你只需在属性声明中加入get;set;。C#会为你封装一个变量。
编辑:例子
//no need for field declaration
public string Name
{
    get;
    set;
}

属性不是使用字段来返回(get)和设置值(set)的吗? - Dan Beaulieu
@dbeaulieu它使用了一个内部创建的字段,你不需要自己创建它。 - Mark Giaconia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接