为什么在传递与方法 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# 语言规范第 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的成员。因此,私有字段应该可以从方法主体访问。