Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么可以调用受保护的或私有的CSharp方法/变量?_C#_.net - Fatal编程技术网

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();
    }
}
在我的构造函数中,我正在调用
其他对象的privateprotected内容为什么会这样?我一直认为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;}
}

为什么会有人投反对票?这似乎是一个很好的问题,有一个很好的代码示例(我承认我还没有测试过,但我假设它所声称的是什么?而且和私有实体总是依赖于(间接的)一些外部活动,否则它的意义会少一些,不是吗?如果没有从外部世界使用,任何对象都会少用。