【问题标题】:Correct syntax for getting variables in C# [duplicate]在 C# 中获取变量的正确语法 [重复]
【发布时间】:2017-03-01 08:27:08
【问题描述】:

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

据我了解,它看起来像这样:

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

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

}

这是正确的方法吗?

【问题讨论】:

标签: c#


【解决方案1】:

这是正确的方法,但是,您可能需要考虑使用 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;
  }

}

【讨论】:

  • 我就是这样写答案的,完美!
  • 还可以证明构造函数可以将Name 作为参数。 OP没说不能注入,只是以后不能改。
  • @TimSchmelter 已更新。还包括关于this 的提示,以消除范围歧义。
  • @TimSchmelter 哎呀。实际上是为了使用自动属性初始化器。
【解决方案2】:

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

public string Name {get;} = "Hello World!";

【讨论】:

【解决方案3】:

在现代 C# 中,您可以这样做:

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

您的 getter 正在返回私有字段,但我的版本正在使用 .NET 的自动支持功能。同样在我的版本中,支持字段是只读的,因此您无法更改它,即使在课堂内也是如此。如果你真的需要,你可以使用:

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

还有其他方法可以设置它,使用最新版本的 C#,但我更喜欢在构造函数中明确说明。

【讨论】:

    【解决方案4】:

    您可以使用 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";
        }
    }
    

    【讨论】:

    • 投反对票的原因是什么?
    【解决方案5】:

    您可以执行以下操作:

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

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

    【讨论】:

    • 公共字段是不好的编码习惯。
    • 我看不出与 public string Name {get; 的区别private set;} 在您的示例中,除了您可以使用其他功能扩展 getter 和 setter 之外,但这取决于您的需要。你能举一些例子,为什么这不是一个好的做法?
    • 在这里阅读答案:stackoverflow.com/questions/480627/…
    • stackoverflow.com/questions/863182/… - 这很合理地解释了为什么使用属性而不是字段,所以我同意你的评论。
    猜你喜欢
    • 2013-01-19
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    相关资源
    最近更新 更多