readonly和{get;之间有区别吗? }

时间:2010-07-27 15:16:14

标签: c# readonly-attribute

这些陈述是否意味着同样的事情?

int x { get; }
readonly int x;

6 个答案:

答案 0 :(得分:23)

回答你的问题: readonly和{get;之间的区别}:

int x { get; }(由于无法设置x而无法编译 - 我认为您需要public int x { get; private set; }),您的代码可以不断更改x

readonly int x;中,x在构造函数或内联中​​初始化,然后永远不会更改。

答案 1 :(得分:11)

readonly int x;在类上声明一个只读字段。此字段只能在构造函数中指定,并且它的值不能在类的生命周期内更改。

int x { get; }声明一个只读自动实现的属性,并且在这种形式下无效(因为你无法设置该值)。普通的只读属性不保证每次调用时都返回相同的值。该值可以在整个生命周期中发生变化。例如:

public int RandomNumber
{
    get { return new Random().Next(100); }
}

每次调用它时都会返回不同的数字。 (是的,这是一种可怕的滥用财产)。

答案 2 :(得分:4)

不,这些陈述并不代表同一件事。该属性的完整版本将有一个支持变量:

private int _x;

public int X
{
    get { return _x; }
}

该类中的另一个方法可以修改支持变量,更改属性的值:

private void SomeMethod(int someValue)
{
    _x = someValue * 5;
}

readonly关键字只允许在其声明或构造函数中分配成员变量:

// Both of these compile

private readonly int _x = 1;

public SomeClass()
{
    _x = 5;
}

// This will not compile

private void SomeMethod(int someValue)
{
    _x = someValue * 5;
}

因此,仅get - 仅支持变量标记为readonly的属性是真正的只读属性。

答案 3 :(得分:2)

其他答案有点过时了……

在较新的C#版本中,您可以为int x { get; } = 33;分配一个默认值,以进行更改。

基本上,它被编译为具有readonly私有后备字段的仅获取属性。 (有关更多详细信息,请参见https://softwareengineering.stackexchange.com/q/372462/81745

我看到的另一个区别是使用接口时不能使用readonly版本,因为只能定义方法和属性。

答案 4 :(得分:0)

readonly关键字确保这些变量一旦初始化就不会更改// //等于将变量设为私有并为其设置getter。 例子。

public class PlayerAuthData 
{
    public readonly string emailId, password, userName;
    private string hello;
    public PlayerAuthData(string emailId, string password, string userName)
    {
        this.emailId = emailId;
        this.password = password;
        this.userName = userName;
    }

    public string Hello 
    {
        get { return hello; }
        set { hello = value; }
    }
}

public class AuthManager
{
    void Start()
    {
        PlayerAuthData pad = new PlayerAuthData("a@a.com", "123123", "Mr.A");
        pad.Hello = "Hi there";
        print(pad.Hello);
        print(pad.password);
        print(pad.emailId);
        print(pad.userName);
    }
}

答案 5 :(得分:-1)

从字面上看,没有太大的区别,因为你已宣布x为私有(默认)。你总是可以重新编译你的类,使x变得不同。

但是,如果它是公开的,则定义public int x { get; }允许您稍后将定义扩展为以下内容:

int x { get {
     return DoSomeOperation();
    }
}

您可以在不破坏客户的情况下做到这一点。 getter的实现是私有的,客户端调用它而不知道它是静态值还是在get访问器内有操作。

相关问题