18

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

int x { get; }
readonly int x;
4

6 回答 6

25

回答您的问题:readonly和 {get; }:

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

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

于 2010-07-27T15:18:28.230 回答
12

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

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

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

每次调用它都会返回一个不同的数字。(是的,这是对属性的可怕滥用)。

于 2010-07-27T15:19:01.927 回答
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支持变量的 -only 属性readonly是真正的只读属性。

于 2010-07-27T15:25:13.037 回答
3

其他答案有点过时了……</p>

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

基本上,它被编译为带有readonly私有支持字段的仅获取属性。(有关详细信息,请参阅https://softwareengineering.stackexchange.com/q/372462/81745 )

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

于 2019-10-10T08:39:46.297 回答
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);
    }
}
于 2019-12-28T17:08:08.087 回答
-1

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

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

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

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

于 2010-07-27T15:21:20.227 回答