1

如标题:有什么区别:

private readonly string name = "ourName";

private string name { get { return "ourName" } }
4

6 回答 6

6

第一个版本是对象状态的一部分——它只是一个字段。它仍然可以在构造函数体内进行更改,也是。

第二个版本只是一个属性——它实际上是一个每次调用它都返回相同值的方法,并不是对象状态的一部分。(不涉及任何领域。)

于 2013-05-03T20:45:14.313 回答
2

第一个是字段。二是财产。该字段将值“ourName”保存为本地状态。该属性提供了一种无状态访问文字“ourName”的方法。

您可以在构造函数中设置字段并改变字段的状态。您还可以将字段传递给构造函数中方法的一个refout参数。

这些关于该财产的陈述均不属实。您可以对属性做的所有事情都是通过调用底层get_name()方法读取返回的值(它总是返回相同的文字值“ourName”。此外,考虑这些示例以了解如何使用字段大小写与属性对比:

public class ExampleWithField
{ 
    public ExampleWithField(){ 
        this.name = "Not our name"; // the value will be "Not our name"
    }
    private readonly string name = "ourName";

}

public class ExampleWithFieldAndRefParam
{ 
    public ExampleWithFieldAndRefParam(){ 
        SetRefValue(ref this.name); // the value will be "Not our nameourName"
    }
    static void SetRefValue(ref string value){ value = "Not our name" + value; }
    private readonly string name = "ourName";

}

public class ExampleWithFieldAndOutParam
{ 
    public ExampleWithFieldAndOutParam(){ 
        SetOutValue(out this.name); // the value will be "Not our name"
    }
    static void SetOutValue(out string value){ value = "Not our name"; }
    private readonly string name = "ourName";

}
public class ExampleWithProperty
{ 
    public ExampleWithProperty(){ 
        this.name = "Not our name"; // this will not compile.
    }
    private string name { get { return "ourName"; } }
}
于 2013-05-03T20:45:23.793 回答
1

此外,如果您使用反射或序列化,它的行为会有所不同,即:GetProperties() 方法在第一种情况下不会返回该字段,并且该字段不会在最后一种情况下被序列化。

于 2013-05-03T20:50:49.620 回答
0

readonly 字段可以在构造函数中初始化/设置。只有 get 的属性像函数一样工作。一般情况下不能设置

于 2013-05-03T20:45:27.550 回答
0

字段可以readonly由构造函数分配。没有方法的属性set不能被任何东西分配。

于 2013-05-03T20:45:38.027 回答
0

这是一个只能在声明期间设置的字段声明:

readonly string name = "abc";

或在类构造函数内部。

另一方面,属性就像方法的语法糖。(即 get 用于 getFoo() 而 set 用于 setFoo(object value)。

所以下面这行实际上被编译成一个方法:

string name { get { return "xyz"; } }

这就是为什么您不能将属性用作值outref参数的原因

于 2013-05-03T20:47:59.423 回答