如何使字段只在课外读取

我有以下类(示例):

public class Dog { int numberOfTeeth; public Dog() { countTeeth(); } private void countTeeth() { this.numberOfTeeth = 5; //this dog has seen better days, apparently } } 

在我创建狗对象后,它应该计算出牙齿的数量。 我希望能够访问该值,而无法在类本身之外修改它。

 Dog d = new Dog(); int dogTeeth = d.numberOfTeeth; //this should be possible d.numberOfTeeth = 10; //this should not 

但是,我无法弄清楚哪个访问修饰符会让我这样做。 我已经尝试了以下所有方法:

如果我将numberOfTeeth 私有 ,则无法访问它。
如果我将numberOfTeeth 保护为internal ,我可以在类之外更改此值。
如果我将numberOfTeeth 内部 ,我可以在类之外更改此值。
如果我使numberOfTeeth 受到保护 ,我无法访问它。
如果我将numberOfTeeth 公开 ,我可以在类之外更改此值。

我也尝试将其设为readonly,但后来无法在构造函数之外设置它。

是否有任何访问修饰符可以让我这样做? 或者是否有其他方法可以实现这种保护?

使用私有setter创建属性:

 public int NumberOfTeeth { get; private set; } 

请注意,我将其更改为Pascal Case以匹配大多数.NET样式标准。

你不能这样做。 您可以将该字段设置为只读,并创建一个返回其值的方法。 您还可以使用公共getter和受保护的setter创建一个auto-property:

 public int NumberOfTeeth { get; protected set; } 
 public class Dog { public int numberOfTeeth { get; private set; } public Dog() { countTeeth(); } } 

您应该将该字段private并创建只读(无设置器) public属性:

 public class Dog { private int numberOfTeeth; public int NumberOfTeeth {get {return numberOfTeeth;}} public Dog() { countTeeth(); } private void countTeeth() { this.numberOfTeeth = 5; //this dog has seen better days, apparently } }