这些陈述是否意味着同样的事情?
int x { get; }
readonly int x;
答案 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
访问器内有操作。