使用 {set; get;} 而不是 {get; set;}

本文关键字:get set 使用 | 更新日期: 2023-09-27 18:35:27

在C#及其表亲语言中,我们总是使用

public string SomeString { get; set;}

但是您也可以使用(我最近才发现这一点,并且在玩弄编译器时)

public string SomeString { set; get; }

我没有接受过任何正式的编程培训,一切都是自我追求的。我一直在不假思索地使用{ get; set; }就像我们使用1 + 1 = 2 { get; set; }顺序只是一个惯例还是有必要维持这个顺序,或者它是过去 C 历史时代的残余,就像我们定义从正极端子流向负极端子的传统电流的方式,

使用 {set; get;} 而不是 {get; set;}

而实际上恰恰相反?

这纯粹是一种约定。它们以哪种顺序出现没有区别。

没有区别。

这就像你首先在类主体中实现了 getter,然后在它之后实现了 setter。这些函数仍将执行完全相同的操作:

public String getSomeString() { return someString; }
public void setSomeString(String value) { someString=value; }

它们是否按该顺序编写

public void setSomeString(String value) { someString=value; }
public String getSomeString() { return someString; }

或相反。不会吧?

但是,我建议在您的代码中坚持一个顺序。熵越少越好:)

没有区别。

根据 C# 语言规范 http://msdn.microsoft.com/en-us/library/ms228593.aspx 10.7.2 访问器(第 324 页)

属性的访问器声明指定可执行文件与读取和写入该属性关联的语句。

访问器声明:

get-accessor-declaration   set-accessor-declaration
set-accessor-declaration   get-accessor-declaration

如图所示,它指出任一订单具有相同的效果

内部获取和设置是这样的方法

private PropertyType Get() {}
private Set(value as PropertyType) {} 

由于方法声明的顺序并不重要,因此这里也会出现同样的情况。

MSDN:

get 访问器的主体类似于方法的主体。它必须返回属性类型的值。


set 访问器类似于返回 void 的方法。它使用一个名为 value 的隐式参数,其类型是属性的类型。

{ get; set; }只是一个快捷方式,因此您不必为要公开的每个字段编写getter和setter。和你写的时候一样

public string GetSomeString() { }
public void SetSomeString(string value) { } 

有关系,你先写哪一个?当然不是。

只是一个约定,您可以在定义参数时使用以下任何一项:

public string SomeString { get; set; }
public string SomeString2 { set; get; }
    
public string someString2;
public string SomeString21
{
    get { return someString2; }
    set { someString2 = value; }
}
public string SomeString22
{
    set { someString2 = value; }
    get { return someString2; }
}
public string SomeString23
{
    set { someString2 = value; }
}
public string SomeString24
{
    get { return someString2; }
}

正如其他人已经指出的那样,没有区别,这只是一种约定。但为了证明这一点,您可以看到编译器实际上是如何处理您的代码的,给定以下内容:

public class C 
{
    public string SomeString { get; set;}
    public string SomeString2 { set; get; }
}

这将被视为:

public class C
{
    [CompilerGenerated]
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    private string <SomeString>k__BackingField;
    [CompilerGenerated]
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    private string <SomeString2>k__BackingField;
    public string SomeString
    {
        [CompilerGenerated]
        get
        {
            return <SomeString>k__BackingField;
        }
        [CompilerGenerated]
        set
        {
            <SomeString>k__BackingField = value;
        }
    }
    public string SomeString2
    {
        [CompilerGenerated]
        get
        {
            return <SomeString2>k__BackingField;
        }
        [CompilerGenerated]
        set
        {
            <SomeString2>k__BackingField = value;
        }
    }
}

如您所见,在这两个属性中,编译器都会生成一个新的BackingField,并且两个属性的主体完全相同。

引用。