如果您只在对象的初始化时设置变量,但希望其他对象能够读取变量而不是在初始化后设置它,那么C#中的正确语法是什么?
根据我的理解,它看起来像这样:
class Test
{
private string name;
public string Name { get { return name; } }
public Test() {
this.name = "Hello World!";
}
}
这是正确的方法吗?
答案 0 :(得分:2)
这是正确的方法,但是,您可能需要考虑使用readonly
关键字,因为这样可以防止在构造函数之外修改name
变量。
像这样:
class Test
{
private readonly string name;
public string Name { get { return name; } }
public Test()
{
name = "Hello World!";
}
public Test(string name)
{
this.name = name; //You use this to set scope to the object to disambiguate name
}
}
更简单的实现是使用readonly automatic property
,但这并不妨碍构造函数之外的修改:
class Test
{
public string Name {get; private set;}
public Test()
{
Name = "Hello World!";
}
public Test(string name)
{
Name = name;
}
}
如果你正在使用C#6:
class Test
{
public string Name {get;} = "Hello World!";
public Test()
{
}
public Test(string name)
{
Name = name;
}
}
答案 1 :(得分:1)
您的实施看起来是正确的,但可以表达得更简单
public string Name {get;} = "Hello World!";
答案 2 :(得分:0)
在现代C#中你可以这样做:
class Test
{
public string Name { get; }
public Test(string name)
{
Name = name;
}
}
你的getter正在返回私有字段,但我的版本正在使用.NET的自动备份功能。同样在我的版本中,后备字段是只读的,因此即使在类中也不能更改它。如果您确实需要,可以使用:
class Test
{
public string Name { get; private set; }
//...
}
还有其他方法可以使用最新版本的C#进行设置,但我更倾向于在构造函数中明确说明。
答案 3 :(得分:-1)
您可以使用readonly关键字 - 它只允许在类初始化期间设置值:
class Test
{
private readonly string name;
public string Name { get { return name; } }
public Test
{
this.name = "Hello World!";
}
}
即使同一类的方法也不能改变name
的值。
使用C#6,你甚至可以省略变量名和readonly关键字:
class Test
{
public string Name { get; }
public Test()
{
this.Name = "my readonly value";
}
}
答案 4 :(得分:-1)
您可以执行以下操作:
class Test
{
public readonly string Name = "Hello World!";
public Test()
{
}
}
或
class Test
{
public readonly string Name;
public Test(string name)
{
this.Name = "Hello World!";
}
}