以下代码显示使用ref
关键字的传递参考示例。按值传递vs按多态传递参考
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
关键字,这将是通过值传递和输出I得到。将10和15
然而,随着ref
关键字,我实际上得到的5的输出和15!为什么没有引用的代码指向classA
中的方法,而带ref的代码指向classB
中的方法?我猜它必须做多态的事情 - classB
继承class A
,但你如何解释它?
阅读您的编译器警告;他们告诉你这里发生了什么事。 – 2013-04-28 14:44:35