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

Ale*_*der 5 c# private-members

让我们看看这堂课:

    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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

为什么我可以访问私人领域?

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

Dar*_*rov 9

为什么我可以访问私人领域?

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


das*_*ght 4

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

\n

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

\n
\n

3.5.1 声明的可访问性

\n

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

\n
    \n
  • Public,通过在成员声明中包含 public 修饰符来选择。public的直观含义是\xe2\x80\x9c访问不受限\xe2\x80\x9d。
  • \n
  • 受保护,通过在成员声明中包含受保护修饰符来选择。protected 的直观含义是 \xe2\x80\x9c 访问仅限于包含类或从包含类\xe2\x80\x9d 派生的类型。\n-Internal,通过在成员声明中包含内部修饰符来选择。Internal的直观含义是\xe2\x80\x9c访问仅限于本程序\xe2\x80\x9d。
  • \n
  • 受保护的内部(意味着受保护或内部),通过在成员声明中同时包含 protected 和内部修饰符来选择。protected internal 的直观含义是 \xe2\x80\x9c 访问仅限于该程序或从包含类 \xe2\x80\x9d 派生的类型。
  • \n
  • Private,通过在成员声明中包含 private 修饰符来选择。private的直观含义是\xe2\x80\x9c访问仅限于包含类型\xe2\x80\x9d。
  • \n
\n
\n

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

\n

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

\n