.NET中的Getter和Setter声明

时间:2013-07-26 12:17:28

标签: c# .net visual-studio-2010

我想知道那些getter和setter声明之间的区别是什么,以及是否有一个首选方法(以及为什么)。第一个可以由Visual Studio自动生成。其他人怎么样?感谢

第一

string _myProperty { get; set; }

第二

string _myProperty;

public string myProperty
{
    get { return _myProperty; }
    set { _myProperty = value; }
}

第三

string _myProperty;

public string getMyProperty()
{
  return this._myProperty;
}

public void setMyProperty(string value)
{
  this._myProperty = value;
}

8 个答案:

答案 0 :(得分:178)

属性用于封装一些数据。你可以使用普通字段:

public string MyField

但是您的班级的所有外部用户都可以访问此字段。人们可以插入非法值或以您不期望的方式更改值。

通过使用属性,您可以封装数据的访问方式。 C#有一个很好的语法,可以将字段转换为属性:

string MyProperty { get; set; }

这称为auto-implemented property。当需要时,您可以将您的财产扩展到:

string _myProperty;

public string MyProperty
{
    get { return _myProperty; }
    set { _myProperty = value; }
}

现在,您可以添加验证setter中的值的代码:

set
{
    if (string.IsNullOrWhiteSpace(value))
        throw new ArgumentNullException();

    _myProperty = value;
}

属性也可以为getter和setter提供不同的访问器:

public string MyProperty { get; private set; }

通过这种方式,您可以创建一个可供所有人阅读的属性,但只能由类本身进行修改。

您还可以为getter添加完全自定义的实施:

public string MyProperty
{
    get
    {
        return DateTime.Now.Second.ToString();
    }
}

当C#编译自动实现的属性时,它会生成中间语言(IL)。在您的IL中,您会看到get_MyPropertyset_MyProperty方法。它还会创建一个名为<MyProperty>k_BackingField的后备字段(通常这在C#中是非法的名称,但在IL中它是有效的。这样您就不会在生成的类型和您自己的代码之间产生任何冲突)。但是,您应该使用C#中的官方属性语法。这在C#中创造了更好的体验(例如使用IntelliSense)。

按照惯例,您不应该将属性用于需要很长时间的操作。

答案 1 :(得分:12)

嗯,第一个和第二个都生成之类的东西到最后的第三个。但是,如果您拥有属性的语法,请不要使用第三个。

最后,如果您在getset中无需做任何工作,请使用第一个。

最后,第一个和第二个只是某种形式的语法糖,但为什么编码超过了必要的。

// more code == more bugs

为了获得一点乐趣,请考虑一下:

public string A { get; private set; }

现在更直接的是不是吗? publicget上的set修饰符隐含,但可以覆盖它。对于定义属性本身时使用的任何修饰符,这当然都是相同的规则。

答案 2 :(得分:9)

第一

string _myProperty { get; set; }

这在.NET世界中称为Auto Property。这只是#2的语法糖。

第二

string _myProperty;

public string myProperty
{
    get { return _myProperty; }
    set { _myProperty = value; }
}

这是通常的方法,如果您需要在您的财产中进行任何验证或额外代码,则需要这样做。例如,在WPF中,如果您需要触发Property Changed Event。如果你不这样做,只需使用auto属性,这几乎是标准的。

3

string _myProperty;

public string getMyProperty()
{
    return this._myProperty;
}

public string setMyProperty(string value)
{
    this._myProperty = value;
}

此处的this关键字是多余的。根本不需要。这些只是获取和设置而不是属性的方法,比如Java的做事方式。

答案 3 :(得分:4)

有了这个,您可以在getset范围内执行一些代码。

private string _myProperty;
public string myProperty
{
    get { return _myProperty; }
    set { _myProperty = value; }
}

您还可以使用自动属性:

public string myProperty
{
    get;
    set;
}

.Net Framework将为您管理。这是因为它是一个很好的实践,并且很容易做到。

您还可以控制这些范围的可见性,例如:

public string myProperty
{
    get;
    private set;
}

public string myProperty2
{
    get;
    protected set;
}

public string myProperty3
{
    get; 
}

更新

现在在C#中,您可以初始化属性的值。样本:

public int Property { get; set; } = 1;

如果也可以定义它并使其成为只读,没有设置。

public int Property { get; } = 1;

最后,您可以定义箭头功能。

public int Property { get; } => GetValue();

答案 4 :(得分:2)

为了澄清,在你的第三个例子中,_myProperty实际上并不是一个属性。它是一个带有get和set方法的字段(正如已经提到的,get和set方法应该指定返回类型)。

在C#中,大多数情况下应避免使用第三种方法。如果您想要返回的类型是数组,或者get方法执行了大量工作而不是仅返回值,那么您才真正使用它。后者并不是真正必要的,但为了清楚起见,属性的get方法做​​了很多工作会产生误导。

答案 5 :(得分:1)

让我们从3开始。那不行。 public getMyProperty()没有返回打字。

数字1和2实际上是相同的东西。 2是编译后的数字1。

所以1和2是相同的东西。如果有两个,您可以在模型中进行一些验证或缓存。

除此之外,它们变得相同。

答案 6 :(得分:0)

第一个是默认值,当没有什么特别的东西可以返回或写入时。 第二个和第三个基本相同,其中第三个是第二个

的更多扩展版本

答案 7 :(得分:0)

第一个是“短”形式 - 当你不想对你的吸气剂和制定者做一些奇特的事情时,你会使用它。在这种形式下不可能执行某种方法或类似的方法。

第二种和第三种形式几乎完全相同,尽管第二种形式被压缩成一行。这种形式不受stylecop的影响,因为它看起来有些奇怪,并且不符合C'样式指针。

如果我希望将我的getter / setter用于特殊的东西,我会使用第三种形式,例如使用懒惰的构造左右。