在使用C#时,我最近意识到我可以从Foo
的静态函数调用Foo
对象的私有函数,甚至可以从其他Foo
对象调用。在我了解了访问修饰符的所有内容之后,这对我来说听起来很奇怪。
据我所知,当你做一些属于某种内部过程的事情时,你会把一个函数设为私有。只有对象本身知道何时使用这些函数,因为其他对象不应该/不能控制对象的流。是否有任何理由为什么同一类别的其他对象应该从这个非常简单的规则中排除?
根据要求,举例:
public class AClass {
private void doSomething() { /* Do something here */ }
public void aFunction() {
AClass f = new AClass();
f.doSomething(); // I would have expected this line to cause an access error.
}
}
答案 0 :(得分:23)
private
修饰符强制执行Encapsulation原则。
这个想法是'外部世界'不应该对AClass内部流程进行更改,因为AClass实现可能会随着时间的推移而发生变化(并且您必须更改整个外部世界以修复实现中的差异 - 这几乎是不可能的)
当AClass的实例访问其他AClass实例的内部时 - 您可以确保两个实例始终知道AClass的实现细节。如果改变了AClass进程内部的逻辑 - 你所要做的就是改变AClass的代码。
但是,在其他一些语言中,private
适用于实例级别,但在C#中则不然。
答案 1 :(得分:12)
当你将一个成员设为私有时,它对其他类而言是私有的,而不是类本身。
例如,如果您有一个需要访问另一个实例的私有成员的Equals方法,它会很有用:
public class AClass
{
private int privateMemberA;
// This version of Equals has been simplified
// for the purpose of exemplifying my point, it shouldn't be copied as is
public override bool Equals(object obj)
{
var otherInstance = obj as AClass;
if (otherInstance == null)
{
return null;
}
return otherInstance.privateMemberA == this.privateMemberA;
}
}
答案 2 :(得分:2)
Private
成员只能访问该类范围内的所有其他成员。如果由多个实例或一个实例完成,则无关紧要。
你试图重新定位成员只能从this.
调用,因此不允许从外部世界调用它们(从实例的角度来看),但它们被允许在您输入实例范围后调用。这在C#中根本不可能。
尽管......会是一个不错的功能:)
答案 3 :(得分:2)
private关键字是成员访问修饰符。私人访问是 最低许可访问级别。私人会员仅可访问 在类的主体或声明它们的结构体内 (...)
更多:
同一主体中的嵌套类型也可以访问这些私有成员。
因此,以下代码将完美运行。
class Foo
{
private void PrivateMethod()
{
}
class FooBaby
{
public static void MethodB()
{
Foo foo = new Foo();
foo.PrivateMethod();
}
}
}
关于“为什么”类具有访问修饰符而不是对象的问题,它是OOP中隐藏信息的方式之一(了解有关Encapsulation (object-oriented programming)的更多信息。
我还建议你阅读这些章节:
。
答案 4 :(得分:0)
private意味着您只能从类本身访问它。它是静态的还是没有区别。虽然这条规则也不例外......
了Christoph
答案 5 :(得分:0)
您可以访问私有方法的原因是因为您在AClass
例如,如果您在内部创建BClass
并创建AClass
,则无法访问私有方法
public class AClass
{
private void doSomething() { /* Do something here */ }
public void aFunction()
{
AClass f = new AClass();
f.doSomething(); // we are inside AClass so we can access
}
}
public class BClass
{
private void doSomething() { /* Do something here */ }
public void aFunction()
{
AClass f = new AClass();
f.doSomething(); // Will not compile because we are outside AClass
}
}
所以基本上......
公开 - 如果您可以看到该课程,那么您可以看到方法
私人 - 如果您是该课程的一部分,那么您可以看到该方法,否则不会。