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

时间:2013-10-14 11:28:13

标签: c#

在C#及其堂兄语言中,我们总是使用

public string SomeString { get; set;}

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

public string SomeString { set; get; }

我没有任何正式的编程培训,一切都是自我思考的。我一直在使用{ get; set; }而不是像我们一样1 + 1 = 2 { get; set; }只是一个约定的顺序,还是维持这个顺序的必要条件,或者它是过去时代的遗留C历史就像我们定义传统电流从正极到负极流动的方式实际上是相反的?

7 个答案:

答案 0 :(得分:8)

这纯粹是一种惯例。它们出现在哪个顺序没有区别。

答案 1 :(得分:4)

没有区别。

就像你在类体中首先实现了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; }

或相反。不是吗?

但我建议您在代码中坚持一个订单。较少的熵总是更好:)

答案 2 :(得分:2)

没有区别。

根据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

如图所示,它表明任何一个订单具有相同的效果

答案 3 :(得分:2)

Internally Get and Set are methods喜欢这个

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

由于方法声明的顺序并不重要,同样的情况就在这里。

MSDN:

  

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


  

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

答案 4 :(得分:1)

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

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

重要的是,你先写的是哪一个?当然不是。

答案 5 :(得分:1)

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

        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; }
    }

答案 6 :(得分:0)

正如其他人已经指出的那样,没有区别,这只是一个约定。但是要证明这一点,您可以看到编译器实际上如何对待您的代码,如下所示:

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,并且两个属性的主体完全相同。

reference