.NET 中的 getter 和 Setter 声明

本文关键字:Setter 声明 getter 中的 NET | 更新日期: 2023-09-27 18:25:13

我想知道那些getters和setters的声明之间有什么区别,是否有首选方法(以及为什么(。第一个可以由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;
}

.NET 中的 getter 和 Setter 声明

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

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

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

好吧,第一个和第二个最终都会生成类似于第三个的东西。但是,当您具有属性语法时,不要使用第三个语法。

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

最后,第一个和第二个只是某种形式的语法糖,但为什么要编写比必要的代码更多。

// more code == more bugs

只是为了找点乐子,请考虑一下:

public string A { get; private set; }

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

有了这个,你可以在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();

1st

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的做事方式一样。

澄清一下,在您的第三个示例中,_myProperty实际上不是一个属性。这是一个带有 get 和 set 方法的字段(如前所述,get 和 set 方法应指定返回类型(。

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

第一个是默认的,当没有什么特别的东西要返回或写入时。2nd 和 3rd 基本相同,其中 3rd 是 2nd

第一个是"简短"形式 - 当你不想对你的getter和setter做一些花哨的事情时,你可以使用它。不可能以这种形式执行方法或类似的东西。

第二种

和第三种形式几乎相同,尽管第二种形式被压缩为一行。stylecop不鼓励这种形式,因为它看起来有些奇怪,不符合C'风格指南。

如果我希望将我的getter/setters用于特殊的事情,例如使用惰性结构等,我会使用第三种形式。