为什么在传递与方法 C# 的参数相同的类型时,类的私有字段可见

本文关键字:字段 类型 方法 为什么 参数 | 更新日期: 2023-09-27 18:35:24

让我们看看这个类:

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

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

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

为什么在传递与方法 C# 的参数相同的类型时,类的私有字段可见

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

因为您位于定义私有字段的同一类中。

如有

疑问,请检查语言规范。

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

3.5.1 声明的可访问性

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

  • Public,通过在成员声明中包含 public 修饰符来选择。公众的直观含义是"访问不受限制"。
  • 受保护
  • ,通过在成员声明中包含受保护的修饰符来选择它。受保护的直观含义是"仅限于包含类或从包含类派生的类型"。-内部,通过在成员声明中包含内部修饰符来选择。内部的直观含义是"仅限于此程序的访问"。
  • 受保护
  • 的内部(表示受保护的或内部的),通过在成员声明中同时包含受保护修饰符和内部修饰符来选择它。受保护的内部的直观含义是"仅限于此程序或从包含类派生的类型的访问权限"。
  • 私有
  • ,通过在成员声明中包含私有修饰符来选择。私有的直观含义是"仅限于包含类型的访问"。

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

。不,这根本不是一个坏做法:这正是私人领域的目的!

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

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

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


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

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

查看范围可能对您有用。

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

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

私有字段可在类型内部访问。ComputeDistanceToOtherClusterCLINK是同一calss的成员。因此,私有字段应该可以从方法主体访问。