我想知道那些宣布的Getters和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;
}

答案

属性用于封装一些数据。您可以使用一个平原:

public string MyField

但是,您的班级所有外部用户都可以访问此字段。人们可以以您没想到的方式插入非法价值观或更改价值。

通过使用属性,您可以封装数据的访问方式。C#有一个不错的语法,用于将字段变成属性:

string MyProperty { get; set; }

这称为自动实施属性。当需要时,您可以将财产扩展到:

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)。

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

来自: stackoverflow.com