可能重复:
Why are private fields private to the type, not the instance?
考虑以下课程:
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();
}
}
在我的构造函数中,我正在调用otherObject
的私有或受保护的内容。 为什么这可能?我一直认为私有是私有的(暗示只有对象可以调用该方法/变量)或受保护(只能通过重载访问)。
为什么以及何时需要使用此类功能?
我缺少一些OO逻辑/原则吗?
答案 0 :(得分:5)
来自MSDN(C#参考)
private关键字是成员访问修饰符。私人访问是 最低许可访问级别。私人会员仅可访问 在类的主体或声明它们的结构体内。
答案 1 :(得分:3)
回答你的问题:
您可以在克隆方法中使用它。您需要对可能以只读方式公开的成员的写访问权限。像
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;}
}
答案 2 :(得分:2)
这完全符合C#规范。 (这也是Java如何确定可访问性。)
访问权限由您正在访问的表达式的类型应用,而不是您正在访问的对象的身份。
至于它何时有用 - 比较两个相同类型的对象,克隆等......当你在同一个类中“信任”代码时,不必公开公开所有细节。
答案 3 :(得分:2)
对于其他类而言,它不是对象实例的私有,因此,因为您在同一个类中,所以可以访问它的私有方法。
您可以将其用于对象克隆,例如
答案 4 :(得分:1)
访问修饰符由类决定,而不是由对象决定。如果要从其他类的方法访问testObject,那么同样的事情是不可能的。
使用它的简单示例是Clone()方法,您必须访问其他对象私有部分才能创建副本。
答案 5 :(得分:1)
私有意味着它只能由同一类中的代码访问。这就是这种情况。你有另一个实例,但它是同一个类。