5

让我们看看这堂课:

    public class Cluster
    {
        private List<Point> points; //private field

        public float ComputeDistanceToOtherClusterCLINK(Cluster cluster)
        {
            var max = 0f;
            foreach (var point in cluster.points) // here points field are accessible
            {
                  .......
            }
            return max;
        }
    }

为什么我可以访问私有字段?

我可以使用此功能还是可能是不好的做法?

4

7 回答 7

8

为什么我可以访问私有字段?

因为您在定义私有字段的同一个类中。

于 2012-05-25T13:43:14.583 回答
4

如有疑问,请检查语言规范。

根据 C# 语言规范,第 3.5.1 节:

3.5.1 声明的可访问性

成员声明的可访问性可以是以下之一:

  • Public,通过在成员声明中包含 public 修饰符来选择。public 的直观含义是“访问不受限制”。
  • 受保护的,通过在成员声明中包含受保护的修饰符来选择。protected 的直观含义是“仅限于包含类或从包含类派生的类型的访问”。-Internal,通过在成员声明中包含 internal 修饰符来选择。internal 的直观含义是“访问受限于这个程序”。
  • 受保护的内部(意思是受保护的或内部的),通过在成员声明中同时包含受保护和内部修饰符来选择。protected internal 的直观含义是“访问仅限于此程序或从包含类派生的类型”。
  • Private,通过在成员声明中包含 private 修饰符来选择。private 的直观含义是“仅限于包含类型的访问”。

正如您从上一节中看到的,包含类的所有方法(在您的情况下是Cluster)都可以访问私有字段points

...不,这根本不是一个坏习惯:这正是私有领域的目的!

于 2012-05-25T13:50:15.823 回答
3

Private 表示类范围的私有。令人惊讶的是,您甚至可以访问同一类的另一个对象的私有字段。

public class A
{
    private int _i;

    public bool AreEqual(A otherObject)
    {
        return this._i == otherObject._i;
    }
}

OOP(面向对象编程)的主要方面之一是封装。这意味着一个对象禁止直接访问私有数据(字段)。相反,它提供了公共方法(包括属性 getter 和 setter)来操作和访问其数据。但这也意味着这些方法必须能够访问这些私有字段,否则私有字段将毫无意义。


澄清:但我同意,能够访问另一个对象的私有成员是出乎意料的,并且至少部分违反了封装原则。

于 2012-05-25T13:50:46.577 回答
2

您在类的范围内定义字段,因此该类中的事物可以访问私有字段。这是定义明确的行为,非常有用,而且编程实践也不错。

查看Scope可能对您有用。

于 2012-05-25T13:44:30.730 回答
2

private 关键字使该字段对类私有,而不是对该类的对象实例。因此,该类中的任何代码都可以访问该类类型的任何对象中的该字段(当然,前提是它具有对该对象的引用)。这样做一点也不坏。

于 2012-05-25T13:47:47.597 回答
2

私有字段在定义它的范围内始终是可访问的,并且由于私有变量是在类范围内定义的,因此它是可访问的。

于 2012-05-25T13:48:52.617 回答
2

私有字段可以在类型内部访问。ComputeDistanceToOtherClusterCLINK 是同一个类的成员。所以私有字段应该可以从方法体中访问。

于 2012-05-25T13:55:03.843 回答