使用{set; get;}代替{get; set;}

6
在C#及其衍生语言中,我们总是使用
public string SomeString { get; set;}

但是您也可以使用(我最近在编译器中试验时发现的)
public string SomeString { set; get; }

我没有接受过任何编程方面的正式培训,一切都是自学。在使用{ get; set; }时,就像我们使用1 + 1 = 2一样毫不费思量。 { get; set; }的顺序是惯例还是必须保持此顺序,或者它只是C语言历史上已经过时的遗物,就像我们定义从正极流向负极的传统电流方向实际上是相反的?

修复你的第二个代码示例;你跳过了变量名。 - Dariusz
2
@Dariusz,修改问题不是比发表评论要求OP编辑更容易吗? - David Arno
3
社区不赞成在问题中编辑代码。请搜索元社区确认。虽然这是一个相当明显的情况,但我并不100%确定这不是一个错误。 - Dariusz
@Dariusz,谢谢,我不知道这一点。我一直在天真地编辑错误的缩进和与问题无关的明显拼写错误。如果这样做是错误的话,最好停止。 - David Arno
@DavidArno 我并不是说我认为你做错了。我只是不喜欢冒险。如果这是一个答案,我也会编辑代码的。 - Dariusz
7个回答

9

这只是一种惯例,它们出现的顺序没有任何影响。


这与您重载 ToString()GetHashCode() 的顺序相当。属性访问器只是 get_varname/set_varname 方法的快捷方式。 - Brad Christie
小心“只是快捷方式”的说法。我不能编写一个名为get_X()的方法,然后将其引用为X。属性的概念存在于CLR中,因此X成为带有“我是属性”元数据的get_X()。 - David Arno
1
抱歉,我并没有暗示有直接的相关性,只是提供了一些幕后的见解。 - Brad Christie

5

没有区别。

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

没有区别。

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

The accessor-declarations of a property specify the executable statements associated with reading and writing that property.

accessor-declarations:

get-accessor-declaration   set-accessor-declaration
set-accessor-declaration   get-accessor-declaration
如图所示,它说明任何一种顺序都具有相同的效果。

2

内部 Get 和 Set 是像这样的方法

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

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

MSDN:

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


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


1

{ get; set; } 只是一个快捷方式,这样你就不必为想要公开的每个字段编写getter和setter。这与您编写时相同

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

写哪一个先并不重要,当然。


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

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,而且两个属性的内容完全相同。

参考资料


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接