2013-05-03 96 views

回答

6

第一个版本是对象的状态的一部分 - 它只是一个领域。它仍然可以在构造函数体内进行更改。

第二个版本是只是一个属性 - 它实际上是一种方法,每次调用它时都会返回相同的值,并且不是对象状态的真正部分。 (没有涉及的领域。)

+0

这是理由t优雅,比MSDN更好解释@ [MSDN](http://msdn.microsoft.com/en-us/library/acdd6hb7(v = vs.71).aspx) – dekdev 2013-05-03 20:52:02

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

只读字段可以初始化/在构造函数中。 属性设置只得到这样的功能的作品。不能在普通情况下,设定

0

一个readonly场可以通过构造函数赋值。的属性没有set方法无法分配给任何东西。

0

这是一个字段声明只能申报期间设置:

readonly string name = "abc"; 

或类的构造函数里面。

另一方面,属性就像方法中的语法糖。 (即获得是对的getFoo()和集是setFoo(对象的值)

所以以下行实际上是编译成一个单一的方法:

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

这就是为什么你不能使用属性值到outref参数

1

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