NET 中的 Getter 和 Setter 声明

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

第一

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;
}
470444 次浏览

第一个和第二个最后都会生成 喜欢第三个。但是,当您有属性的语法时,不要使用第三个。

最后,如果在 getset中没有工作要做,那么使用第一个。

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

// more code == more bugs

为了找点乐子,想想这个:

public string A { get; private set; }

这样就简单多了,不是吗?public修饰符在 getset上都是 暗示,但是它可以被覆盖。当然,对于定义属性本身时使用的任何修饰符,这都是相同的规则。

第一个是默认值,当没有什么特殊的返回或写入。 第二和第三基本上是相同的,第三是一个有点扩展版本的第二

让我们从3开始。这不起作用。 public getMyProperty()没有返回类型。

数字1和数字2实际上是相同的东西。数字1在编译之后变成了2。

所以1和2是相同的东西。对于2,你可以在你的模型中有一些验证或者缓存。

除此之外,他们变得一样。

有了这个,您就可以在 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 => GetValue();

第一个是“ short”表单——当您不想使用 getter 和 setter 做一些花哨的事情时,可以使用它。以这种形式执行方法或类似的东西是不可能的。

第二种和第三种形式几乎相同,尽管第二种形式被压缩成一行。样式表不鼓励使用这种形式,因为它看起来有些奇怪,并且不符合 C’样式指南。

如果我希望使用 getters/setter 来做一些特殊的事情,我会使用第三种形式,例如使用一个惰性结构。

第一

string _myProperty { get; set; }

这在.NET 世界中被称为 汽车财产。它只是 # 2的语法糖。

第二名

string _myProperty;


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

这是通常的方法,如果需要在属性中执行任何验证或额外的代码,就需要使用这种方法。例如,在 WPF 中,如果需要激发属性更改事件。如果没有,只需使用 auto 属性,它基本上是标准的。

3

string _myProperty;


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


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

这里的 this关键字是多余的。完全不需要。这些只是获取和设置的方法,而不是属性,就像 Java 处理事情的方法一样。

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

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

按照约定,不应该对需要很长时间的操作使用属性。

澄清一下,在第3个示例中,_ myProperty 实际上并不是一个属性。它是一个包含 get 和 set 方法的字段(如前所述,get 和 set 方法应该指定返回类型)。

在 C # 中,在大多数情况下应该避免使用第三种方法。只有当要返回的类型是数组,或者 get 方法做了大量工作而不仅仅是返回一个值时,才会真正使用它。后者实际上并不必要,但是为了清晰起见,一个做了大量工作的属性的 get 方法是有误导性的。