Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.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# 通过在基类成员中创建的派生类对象…访问继承的私有基类成员_C#_Inheritance - Fatal编程技术网

C# 通过在基类成员中创建的派生类对象…访问继承的私有基类成员

C# 通过在基类成员中创建的派生类对象…访问继承的私有基类成员,c#,inheritance,C#,Inheritance,如果x和y是私有的,我无法理解为什么类a中的m()可以通过b类和b类对象访问x和y。我知道当b从a继承时,b从a接收私有成员,即使它们不能被b使用。但令我感到奇怪的是,b成员不能使用x和y,除a以外的类不能通过b类和b类对象获取变量,而m()可以通过b类和b类对象访问x和y 有人能用我错过的一般规则来解释这一点吗?或者,有人能解释一下编译器是如何将基成员“给予”给派生类的吗 class a { private int x; private static int y; s

如果x和y是私有的,我无法理解为什么类a中的m()可以通过b类和b类对象访问x和y。我知道当b从a继承时,b从a接收私有成员,即使它们不能被b使用。但令我感到奇怪的是,b成员不能使用x和y,除a以外的类不能通过b类和b类对象获取变量,而m()可以通过b类和b类对象访问x和y

有人能用我错过的一般规则来解释这一点吗?或者,有人能解释一下编译器是如何将基成员“给予”给派生类的吗

class a
{
    private int x;
    private static int y;

    static void m()
    {
        b bobj = new b();
        int mm = bobj.x;
        int rr = b.y;


    }

    void n()
    {
        b bobj = new b();
        int mm = bobj.x;
        int rr = b.y;
    }
}

class b : a
{
    private int u;
    private static int v;

    static void o()
    {

    }

    void p()
    {

    }
}
如果x和y是私有的,我无法理解为什么类a中的m()可以通过b类和b类对象访问x和y

类声明中的代码可以访问该类声明的任何私有成员——就这么简单。因此
a
中的代码无法访问
b
中声明的私有变量,但它可以通过
a
的实例访问
a
中声明的私有变量,该实例恰好也是
b
的实例

请注意,这一行:

int rr = b.y;
有效地转化为

int rr = a.y;
y
仅由
a
声明-如果它确实是由
b
声明的,它将无法访问

有关更多详细信息,请参见C#4语言规范的第3.5节

如果x和y是私有的,我无法理解为什么类a中的m()可以通过b类和b类对象访问x和y

类声明中的代码可以访问该类声明的任何私有成员——就这么简单。因此
a
中的代码无法访问
b
中声明的私有变量,但它可以通过
a
的实例访问
a
中声明的私有变量,该实例恰好也是
b
的实例

请注意,这一行:

int rr = b.y;
有效地转化为

int rr = a.y;
y
仅由
a
声明-如果它确实是由
b
声明的,它将无法访问


参见C 4语言规范的第3.5部分,详细说明。

< P>这是从C++语言继承的规则。< /P>
private
protected
对类而不是对象进行操作。因此,例如,如果您有一个
银行
对象,其成员可以访问任何其他
银行
的私人数据,尽管这可能看起来违反直觉或危险

<>因为C++广泛使用指针运算和无限类型,所以在同一进程中执行任何代码之前,没有可靠的方法来保护进程内的数据。p> 但是,如果您只需要对象级别的保护以防止意外访问,那么可以通过定义接口和仅在银行之间传递接口来帮助实现这一点。而
银行
对象仍可以执行以下操作:

void TransferMoneyFrom(IBank otherBank, decimal theirAccountNumber,
                        decimal receivingAccountNumber, int amount)
{
    ((Bank)otherBank).PrivateProperty = whatever;
}
…由于需要显式类型转换或使用反射,因此不太可能意外发生


(请注意,C#通常会使您更容易有意地访问某个其他类的私有成员,而您没有该类的源代码(通过名称,使用反射)如果这种类型的供应商认为这是一个不利因素,他们可以使用混淆器来使这更困难。这仍然不能保护混淆对象以任何方式来保护其他实例。)

< P>这是从C++语言继承的规则。

private
protected
对类而不是对象进行操作。因此,例如,如果您有一个
银行
对象,其成员可以访问任何其他
银行
的私人数据,尽管这可能看起来违反直觉或危险

<>因为C++广泛使用指针运算和无限类型,所以在同一进程中执行任何代码之前,没有可靠的方法来保护进程内的数据。p> 但是,如果您只需要对象级别的保护以防止意外访问,那么可以通过定义接口和仅在银行之间传递接口来帮助实现这一点。而
银行
对象仍可以执行以下操作:

void TransferMoneyFrom(IBank otherBank, decimal theirAccountNumber,
                        decimal receivingAccountNumber, int amount)
{
    ((Bank)otherBank).PrivateProperty = whatever;
}
…由于需要显式类型转换或使用反射,因此不太可能意外发生


(请注意,C#通常会使您更容易有意地访问某个其他类的私有成员,而您没有该类的源代码(通过名称,使用反射)。如果该类型的供应商认为这是一个缺点,他们可以使用模糊器使其更加困难。这仍然无法保护模糊对象以任何方式对抗其自身的其他实例。)

不确定问题出在何处
x
y
仅在
a
的成员内部或由其访问,即使它们是由基类继承和使用的。不确定问题出在哪里
x
y
仅在
a
的成员内部或由其访问,即使它们是由基类继承和使用的。@MareInfinitus:
base.b
没有任何意义-
b
是类型名。我建议你写你想检查它是否真的有意义的代码…就在这里!斯基特先生的回答恰到好处。谢谢大家@MareInfinitus:但是当您尝试使用
bobj
时,这些将无效当然…@MareInfinitus:
base.b
没有任何意义-
b
是类型名称。我建议你写你想检查它是否真的有意义的代码…就在这里!斯基特先生的回答恰到好处。谢谢大家@MareInfinitus:但是当你试图使用
bobj
时,这些是无效的。。。