В следующем коде показан пример передачи по ссылке с использованием ключевого слова ref
.
class Program
{
static void Main(string[] args)
{
int c1 = 10;
ClassC c2 = new ClassC(10);
ClassA a = new ClassB();
a.MethodA(ref c1); Console.WriteLine(c1);
a.MethodB(ref c2); Console.WriteLine(c2.getC());
Console.Read();
}
}
class ClassA //base class
{
public virtual void MethodA(ref int c1)
{
c1 = c1 + 5;
}
public virtual void MethodB(ref ClassC c2)
{
c2.setC(c2.getC() + 5);
}
}
class ClassB : ClassA //ssubclass
{
public override void MethodA(ref int c1)
{
c1 = c1 - 5;
}
public void MethodB(ref ClassC c2)
{
c2.setC(c2.getC() - 5);
}
}
class ClassC //just a class with a variable c with get/set methods
{
protected int c;
public ClassC(int CValue) { c = CValue; }
public void setC(int cnew) { this.c = cnew; }
public int getC() { return c; }
}
Если нет ключевого слова ref
, оно будет передано по значению, и я получу результат 10 и 15.
Однако с ключевым словом ref
я фактически получаю результат 5 и 15! Почему код без ref указывает на метод в classA
, а код со ref указывает на метод в classB
? Я предполагаю, что это как-то связано с полиморфизмом — classB
наследует class A
, но как вы это объясните?