C# 为什么可以调用受保护的或私有的CSharp方法/变量?
可能重复:C# 为什么可以调用受保护的或私有的CSharp方法/变量?,c#,.net,C#,.net,可能重复: 考虑以下类别: public class Test { protected string name; private DateTime dateTime; public Test(string name) { this.name = name; this.dateTime = DateTime.Now; } public Test(Test otherObject) { th
考虑以下类别:
public class Test
{
protected string name;
private DateTime dateTime;
public Test(string name)
{
this.name = name;
this.dateTime = DateTime.Now;
}
public Test(Test otherObject)
{
this.name = otherObject.name;
this.dateTime = otherObject.GetDateTime();
}
private DateTime GetDateTime()
{
return dateTime;
}
public override string ToString()
{
return name + ":" + dateTime.Ticks.ToString();
}
}
在我的构造函数中,我正在调用其他对象的private或protected内容为什么会这样?我一直认为private是真正私有的(意味着只有对象才能调用该方法/变量)或受保护的(只能通过重载访问)
为什么以及何时必须使用这样的功能?
我是否缺少一些OO逻辑/原则?访问修饰符是由类决定的,而不是由对象决定的。若要从其他类的方法访问testObject,同样的事情是不可能的
使用该方法的一个简单示例是Clone()方法,在该方法中,您必须访问其他对象的私有部分才能创建副本。private意味着它只能由同一类中的代码访问。这里就是这样。您确实有另一个实例,但它是同一个类。From(C#Reference)
private关键字是成员访问修饰符。私人访问是最重要的
最小允许访问级别。只能访问私人成员
在声明它们的类或结构体中
这完全符合C#规范。(这也是Java决定可访问性的方式。)
访问是由您正在访问的express类型应用的,而不是由您正在访问的对象的标识应用的
至于什么时候有用-比较两个相同类型的对象,克隆等等。。。当您“信任”同一类中的代码时,不必公开所有详细信息是很方便的。它对于其他类是私有的,而不是对象的实例,因此,由于您在同一类中,您可以访问它的私有方法
您可以将其用于对象克隆,例如回答您的问题:
例如,您可以在克隆方法中使用它。您需要对可能以只读方式公开的成员进行写访问的位置。像
class MyClass : ICloneable
{
public object Clone()
{
var clone = (MyClass)MemberwiseClone();
clone.Value = this.Value; // without the way private works, this would not be possible
return clone;
}
public int Value{ get; private set;}
}
为什么会有人投反对票?这似乎是一个很好的问题,有一个很好的代码示例(我承认我还没有测试过,但我假设它所声称的是什么?而且和私有实体总是依赖于(间接的)一些外部活动,否则它的意义会少一些,不是吗?如果没有从外部世界使用,任何对象都会少用。