这些陈述是否意味着同样的事情?
int x { get; }
readonly int x;
回答您的问题:readonly和 {get; }:
在int x { get; }
(无法编译,因为无法设置 x - 我认为您需要public int x { get; private set; }
)您的代码可以不断更改 x
在readonly int x;
中,x 在构造函数或内联中初始化,然后永远不会改变。
readonly int x;
在类上声明一个只读字段。该字段只能在构造函数中分配,并且其值在类的生命周期内不能更改。
int x { get; }
声明了一个只读的自动实现属性,并且在这种形式下无效(因为您无法设置该值)。普通的只读属性不保证每次调用时都返回相同的值。该值可以在类的整个生命周期中更改。例如:
public int RandomNumber
{
get { return new Random().Next(100); }
}
每次调用它都会返回一个不同的数字。(是的,这是对属性的可怕滥用)。
不,这些陈述并不意味着同样的事情。该属性的完整版本将有一个支持变量:
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
是真正的只读属性。
其他答案有点过时了……</p>
在较新版本的 C# 中,您可以分配一个默认值来int x { get; } = 33;
更改内容。
基本上,它被编译为带有readonly
私有支持字段的仅获取属性。(有关详细信息,请参阅https://softwareengineering.stackexchange.com/q/372462/81745 )
我看到的另一个区别是您在使用接口时不能使用该readonly
版本,因为您只能定义方法和属性。
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);
}
}
从字面上看,没有太大区别,因为您已声明x
为私有(默认)。您总是可以重新编译您的类以使 x 不同。
但是,如果它是公开的,则该定义public int x { get; }
允许您稍后将定义扩展为如下内容:
int x { get {
return DoSomeOperation();
}
}
您可以在不破坏客户的情况下做到这一点。getter 的实现是私有的,客户在不知道它是静态值还是在其get
访问器内部有操作的情况下调用它。