5

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

public string SomeString { get; set;}

但你也可以使用(我最近才发现这个,同时在编译器上胡闹)

public string SomeString { set; get; }

我没有接受过任何正式的编程培训,一切都是自学的。我一直在{ get; set; }没有任何想法地使用,就像我们使用的那样 只是一个约定1 + 1 = 2的顺序,{ get; set; }还是有必要保持这个顺序,或者它是 C 历史过去时代的一些残余,就像我们定义从正极流向的传统电流的方式一样当它实际上是相反的方式时,负极端子?

4

7 回答 7

8

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

于 2013-10-14T11:28:54.970 回答
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; }

或相反。他们不会吗?

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

于 2013-10-14T11:30:52.790 回答
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

如图所示,任何一个顺序都具有相同的效果

于 2013-10-14T12:14:17.710 回答
2

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

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

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

MSDN:

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


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

于 2013-10-14T12:46:43.570 回答
1

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

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

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

于 2013-10-14T11:37:51.067 回答
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; }
}
于 2013-10-14T11:49:46.817 回答
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,编译器都会生成一个新的,并且两个属性的主体完全相同。

参考资料。_

于 2020-10-06T20:55:14.677 回答