readonly和prop没有setter有什么区别?

时间:2013-05-03 20:42:26

标签: c#

如标题所示:有什么区别:

private readonly string name = "ourName";

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

6 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分: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"; } }
}

答案 2 :(得分:1)

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

答案 3 :(得分:0)

readonly字段可以在构造函数中初始化/设置。 只有功能才能获得的属性。不能设置常见的情况

答案 4 :(得分:0)

构造函数可以为readonly字段分配。无法通过任何方式分配没有set方法的属性。

答案 5 :(得分:0)

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

readonly string name = "abc";

或在类构造函数内部。

另一方面,属性就像方法的语法糖。 (即get为getFoo(),set为setFoo(对象值)。

因此以下行实际上编译为单个方法:

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

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