Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中获取变量的正确语法#_C# - Fatal编程技术网

C# C中获取变量的正确语法#

C# C中获取变量的正确语法#,c#,C#,如果您只在对象初始化时设置变量,但希望其他对象能够读取变量,而不是在初始化后设置变量,那么C#中的正确语法是什么 据我所知,它看起来像这样: class Test { private string name; public string Name { get { return name; } } public Test() { this.name = "Hello World!"; } } 这是正确的方法吗?您可以使用readonly关键字-它只允许在类初始化期间设置值: cl

如果您只在对象初始化时设置变量,但希望其他对象能够读取变量,而不是在初始化后设置变量,那么C#中的正确语法是什么

据我所知,它看起来像这样:

class Test
{
 private string name;
 public string Name { get { return name; } }

 public Test() {
  this.name = "Hello World!";
 }

}

这是正确的方法吗?

您可以使用readonly关键字-它只允许在类初始化期间设置值:

class Test
{
     private readonly string name;
     public string Name { get { return name; } }

     public Test
     {
         this.name = "Hello World!";
     }
}
即使是同一类的方法也不能改变
name
的值

使用C#6,您甚至可以编辑变量名和只读关键字:

class Test
{ 
    public string Name { get; }

    public Test()
    {
        this.Name = "my readonly value";
    }
}

您的实现看起来是正确的,但可以更简单地表达出来

public string Name {get;} = "Hello World!";
在现代C#中,您可以执行以下操作:

class Test
{
    public string Name { get; }
    public Test(string name) 
    {
         Name = name;
    }
}
您的getter正在返回私有字段,但我的版本正在使用.NET的自动备份功能。同样在我的版本中,backing字段是只读的,所以即使在类中也不能更改它。如果您确实需要,您可以使用:

class Test
{
    public string Name { get; private set; }
    //...
}

使用最新版本的C#还有其他设置方法,但我更喜欢在构造函数中显式地说明这一点

> P>这是正确的方法,但是,您可能需要考虑使用<代码> Read Ong/Cuth>关键字,这样可以防止在构造函数之外修改<代码>名称>代码>变量。 像这样:

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
 }

}
更简单的实现是使用
只读自动属性
,但这并不阻止在构造函数之外进行修改:

class Test
{
  public string Name {get; private set;}

  public Test()
  {
     Name = "Hello World!";
  }

  public Test(string name)
  {
     Name = name;
  }

}
如果您使用的是C#6:


您可以执行以下操作:

class Test
{
    public readonly string Name = "Hello World!";

    public Test()
    {
    }
}


@贾索尼文斯:嗯,他在问正确的语法,现在你已经改正了;)@TimSchmelter查看未决变更:-/另请参见和等。哦,当然还有语言文档。我只是这样写答案,太好了!还应该说明构造函数可以将
名称
作为参数。OP并没有说它不能被注入,只是说它以后不能被改变。@TimSchmelter更新。还包括一个关于
的提示,用于消除范围歧义。@TimSchmelter-Oops。实际上打算使用自动属性初始值设定项。。。。。使用C#6时,向下投票的原因是什么?公共字段是糟糕的编码实践。在您的示例中,我看不出公共字符串名称{get;private set;}有什么区别,只是您可以使用其他功能扩展getter和setter,但这取决于您的需要。你能举一些例子,为什么这不是一个好的做法吗?请阅读这里的答案:-这是为什么使用属性而不是字段的合理解释,所以我同意你的评论。
class Test
{
    public readonly string Name = "Hello World!";

    public Test()
    {
    }
}
class Test
{
    public readonly string Name;

    public Test(string name)
    {
        this.Name = "Hello World!";
    }
}