使用 { get; 实现只读属性}

Implementing read-only properties with { get; }

为什么这个运行:

  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;
    }

  }

要么将私人 setter 添加到您的 属性:

public string Colour{ get; private set;}

或者添加一个只读的支持字段:

private string _colour;
public string Colour{ get return this._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;
}

我认为您正在寻找的是这个,它通过仅向外界公开 GET 来保护您的内部变量。为了额外的安全,您可以将 _colour 标记为只读,这样它就不能在 class 本身内更改(在实例化之后),但我认为这太过分了。如果你的苹果变老需要变成棕色怎么办?!

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;
    }

}

您的代码对 Visual Studio 2015 附带的 C# 6 有效。不适 对该语言的早期版本或 Visual Studio 有效。从技术上讲,您可以在 VS 2013 中安装 Roslyn 的旧预发布版本,但现在 VS 2015 已发布,不值得这么麻烦。

如果出现此问题,要么是您使用了错误版本的 Visual Studio 来编译 C# 6 代码,要么是您尝试使用错误的开发环境从命令行编译代码 - 即,你的 PATH 指向旧的编译器。也许你打开了 'Developer Command Prompt for 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;
}

请注意,第二个选项不是真正只读的,class 的其他成员仍然可以修改 属性

注意

您可以使用 Visual Studio 2015 来定位 .NET 4.5。语言和运行时 。真正的要求是编译器必须匹配语言版本