.NET中的Getter和Setter声明

Wiz*_*Liz 133 .net c# visual-studio-2010

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

1

string _myProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)

第2

string _myProperty;

public string myProperty
{
    get { return _myProperty; }
    set { _myProperty = value; }
}
Run Code Online (Sandbox Code Playgroud)

第3

string _myProperty;

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

public void setMyProperty(string value)
{
  this._myProperty = value;
}
Run Code Online (Sandbox Code Playgroud)

Wou*_*ort 190

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

public string MyField
Run Code Online (Sandbox Code Playgroud)

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

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

string MyProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)

这称为自动实现的属性.如有需要,您可以将您的物业扩展至:

string _myProperty;

public string MyProperty
{
    get { return _myProperty; }
    set { _myProperty = value; }
}
Run Code Online (Sandbox Code Playgroud)

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

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

    _myProperty = value;
}
Run Code Online (Sandbox Code Playgroud)

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

public string MyProperty { get; private set; }
Run Code Online (Sandbox Code Playgroud)

这样,您可以创建一个可供所有人阅读的属性,但只能由类本身进行修改.

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

public string MyProperty
{
    get
    {
        return DateTime.Now.Second.ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • +1.但需要明确的是,`get_MyProperty`和`set_MyProperty`将适用于任何具有getter和/或setter(分别)的属性,无论它是否为auto属性.自动属性之间的唯一区别是自动生成(并且代码中不可访问)支持字段. (3认同)

Mik*_*oud 12

好吧,第一个和第二个都产生类似于最后的第三个.但是,如果您具有属性的语法,请不要使用第三个.

最后,如果您没有工作要做,get或者set使用第一个.

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

// more code == more bugs
Run Code Online (Sandbox Code Playgroud)

只是为了享受一点乐趣,请考虑一下:

public string A { get; private set; }
Run Code Online (Sandbox Code Playgroud)

现在这更直接了不是吗?该public修饰符意味着在这两个getset,但它可以被覆盖.对于定义属性本身时使用的任何修饰符,这当然是相同的规则.

  • 如果你注释掉所有内容,那么你将没有错误!问题解决了.另外,要添加说明:第二个代码块(和第三个代码块,但不要使用它)允许您在实际获取变量值之前执行一些操作.例如,您可以设置一个标志:`isAccessed = true;` (3认同)
  • 感谢快速而明确的回答^ - ^ (2认同)
  • @RussellUhl:我认为"更多代码行==更多错误"的运作假设你仍然可以用更少的行完成你所追求的目标.如果您可以评论整个计划并仍然实现目标,那么这样做可能是个好主意;) (2认同)

And*_*the 9

1

string _myProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)

这在.NET世界中称为自动属性.这只是#2的语法糖.

第2

string _myProperty;

public string myProperty
{
    get { return _myProperty; }
    set { _myProperty = value; }
}
Run Code Online (Sandbox Code Playgroud)

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

3

string _myProperty;

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

public string setMyProperty(string value)
{
    this._myProperty = value;
}
Run Code Online (Sandbox Code Playgroud)

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


Fel*_*ani 5

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

private string _myProperty;
public string myProperty
{
    get { return _myProperty; }
    set { _myProperty = value; }
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用自动属性:

public string myProperty
{
    get;
    set;
}
Run Code Online (Sandbox Code Playgroud)

.Net Framework将为您管理。之所以创建它,是因为它是一个很好的实践,并且易于实现。

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

public string myProperty
{
    get;
    private set;
}

public string myProperty2
{
    get;
    protected set;
}

public string myProperty3
{
    get; 
}
Run Code Online (Sandbox Code Playgroud)

更新资料

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

public int Property { get; set; } = 1;
Run Code Online (Sandbox Code Playgroud)

如果也可以定义它并使它只读,而无需设置。

public int Property { get; } = 1;
Run Code Online (Sandbox Code Playgroud)

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

public int Property { get; } => GetValue();
Run Code Online (Sandbox Code Playgroud)