5

我有以下课程(示例):

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 private,我将无法访问它。
如果我设置numberOfTeeth protected internal,我可以在类外更改这个值。
如果我做numberOfTeeth internal,我可以在课堂外更改这个值。
如果我设置numberOfTeeth protected,我将无法访问它。
如果我numberOfTeeth 公开,我可以在课堂外更改此值。

我也尝试将其设为只读,但随后无法将其设置在构造函数之外。

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

4

4 回答 4

9

使用私有设置器创建属性:

public int NumberOfTeeth
{
 get; private set;
}

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

于 2012-11-15T15:47:06.130 回答
2

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

public int NumberOfTeeth { get; protected set; }
于 2012-11-15T15:46:54.770 回答
1

您应该创建该字段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
    }
}
于 2012-11-15T15:47:40.243 回答
0
public class Dog
{
    public int numberOfTeeth { get; private set; }

    public Dog() 
    {   
        countTeeth(); 
    }
}
于 2012-11-15T15:47:39.037 回答