如何使字段只在课外读取

时间:2012-11-15 15:44:50

标签: c# .net access-modifiers

我有以下课程(示例):

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 受保护的内部,我可以在课堂外更改此值 如果我numberOfTeeth 内部,我可以在课堂外更改此值 如果我numberOfTeeth 受保护,我就无法访问它 如果我将numberOfTeeth 公开,我可以在课堂外更改此值。

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

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

4 个答案:

答案 0 :(得分:8)

使用私人设定器创建属性:

public int NumberOfTeeth
{
 get; private set;
}

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

答案 1 :(得分:2)

你做不到。您可以将该字段设置为只读,并创建一个返回其值的方法。您还可以使用公共getter和受保护的setter创建自动属性:

public int NumberOfTeeth { get; protected set; }

答案 2 :(得分:0)

public class Dog
{
    public int numberOfTeeth { get; private set; }

    public Dog() 
    {   
        countTeeth(); 
    }
}

答案 3 :(得分:0)

您应该创建字段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
    }
}