Implementing read-only properties with { get; }

本文关键字:get with read-only properties Implementing | 更新日期: 2023-09-27 18:04:18

为什么不运行:

  class Program
  {
    static void Main(string[] args)
    {
      Apple a = new Apple("green");
    }
  }
  class Apple
  {
    public string Colour{ get; }
    public Apple(string colour)
    {
      this.Colour = colour;
    }
  }

Implementing read-only properties with { get; }

你的代码在Visual Studio 2015自带的c# 6中有效。对于该语言或Visual Studio的早期版本无效。从技术上讲,你可以在VS 2013中安装一个旧的预发布版本的Roslyn,但现在VS 2015已经发布了,这就不值得麻烦了。

出现此问题,要么是使用错误版本的Visual Studio来编译c# 6代码,要么是试图使用错误的开发环境从命令行编译代码-即,您的PATH指向旧的编译器。也许你打开了"2013年开发者命令提示符"而不是2015年?

你应该使用Visual Studio 2015编译你的代码,或者确保你的路径变量指向最新的编译器。

如果你必须使用Visual Studio 2013或更早的版本,你必须修改代码以使用旧的语法,例如:

public readonly string _colour;
public string Colour { get {return _colour;}}
public Apple(string colour)
{
    _colour=colour;
}

public string Colour {get; private set;}
public Apple(string colour)
{
    Colour=colour;
}
注意,第二个选项不是真正的只读,类的其他成员仍然可以修改属性

注意

你可以使用Visual Studio 2015来瞄准。net 4.5。语言和运行时是两码事。真正的要求是编译器必须匹配语言版本

为你的属性添加一个私有setter:

public string Colour{ get; private set;}

或者添加一个只读的后台字段:

private string _colour;
public string Colour{ get return this._colour; }
public Apple(string colour)
{
  this._colour = colour;
}

我认为您正在寻找的是这个,它通过仅向外部世界暴露GET来保护您的内部变量。为了额外的安全,您可以将_color标记为只读,这样就不能在类本身内(在实例化之后)更改它,但我认为这是多余的。如果你的苹果变老了,需要变成棕色呢?

class Program
{
    static void Main(string[] args)
    {
        Apple a = new Apple("green");
    }
}
class Apple
{
    private string _colour;
    public string Colour
    {
        get
        {
            return _colour;
        }
    }
    public Apple(string colour)
    {
        this._colour = colour;
    }
}

这里有几个选项:

// Make the string read only after the constructor has set it
private readonly string colour
public string Colour { get { return colour; } }
public Apple(string colour)
{
  this.colour = colour;
}

// Make the string only readonly from outside but editing from within the class
public string Colour { get; private set; }
public Apple(string colour)
{
  this.Colour= colour;
}