在空白处使用什么以便添加";x〃;变量,而不创建另一个A对象

本文关键字:变量 创建 对象 另一个 什么 quot 添加 空白处 | 更新日期: 2023-09-27 18:00:49

我必须使用this关键字才能将3个类中存在的x的所有3个值相加。

不允许我在方法M1中创建类A的实例。

class Program
{
    static void Main(string[] args)
    {
        C c = new C();
        int op = c.M1();
        Console.WriteLine(c.x);
        Console.WriteLine();     
    }
}
public class A
{
    public int x = 10;
}
public class B:A
{
    public int x = 100;
}
public class C:B
{
    public int x = 1000;
    public int M1()
    {
        return (x + base.x + _____ ); 
        //What to use in the blank space in order to 
        //add the "x" variable from class A without 
        //creating another object of A
    }
}

}

在空白处使用什么以便添加";x〃;变量,而不创建另一个A对象

将当前实例(this(强制转换为A。你可以使用

((A)this).x

这是你的方法的完整代码,我将如何定义它

public int M1()
{
    return (x + ((B)this).x + ((A)this).x ); 
}

您可以使用

public int M1()
{
    return (x+base.x+((A)this).x);
}

但如果你在反编译器中查看C类的构造函数

// method line 3
.method public hidebysig specialname rtspecialname 
       instance default void '.ctor' ()  cil managed 
{
  // Method begins at RVA 0x210c
  // Code size 18 (0x12)
  .maxstack 8
  IL_0000:  ldarg.0 
  IL_0001:  ldc.i4 1000
  IL_0006:  stfld int32 stringy.C::x
  IL_000b:  ldarg.0 
  IL_000c:  call instance void class stringy.B::'.ctor'()
  IL_0011:  ret 
} // end of method C::.ctor

你会看到,C的构造函数会调用B的构造函数,类似地,B的构造函数也会调用A的构造函数,所以基的实例确实存在,不需要创建另一个对象实例。为了更清楚地证明这一点,这里是方法M1在IL 中的样子

// method line 4
.method public hidebysig 
       instance default int32 M1 ()  cil managed 
{
    // Method begins at RVA 0x2120
  // Code size 21 (0x15)
  .maxstack 8
  IL_0000:  ldarg.0 
  IL_0001:  ldfld int32 stringy.C::x
  IL_0006:  ldarg.0 
  IL_0007:  ldfld int32 stringy.B::x
  IL_000c:  add 
  IL_000d:  ldarg.0 
  IL_000e:  ldfld int32 stringy.A::x
  IL_0013:  add 
  IL_0014:  ret 
} // end of method C::M1

stringy是命名空间。顺便说一句,你应该声明像这样的子类

public class B:A
{
  public new int x = 100;
}

如果您想在基类中隐藏字段x。