这里就是ref的用法的问题。
这里可以看到你这样写的话已经报错了。
正确的程序应该是
private char c=' ';
public void show()
{
Hello(ref c);
}
public void Hello(ref char c)
{
c='a';
}
为什什么Hello的方法的实体部分也要加ref呢?其实这里的ref就好像是c语言中的*。ref char c的意思就好像是C语言中的char * c代表的是参数的类型是指向向char类型的指针。而不是char类型。char类型保存的是具体的值,但是char *类型保存的是保存char类型的值饿内存中的地址。
我拿一个C语言的传址调用的例子来说明下
#include "stdio.h"
#include "malloc.h"
void swap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
void main()
{
int x,y;
x=6;
y=10;
swap(&x,&y);
printf("x=%d,y=%d",x,y);
getchar();
}这里在调用swap的时候时用了&取地址。这样就能保证传进去的是内存的地址,而不是具体的值了。而且只有这样它才能swap要求的参数类型相匹配,这样就不会报错。
现在再来看看这个程序
private char c=' ';
public void show()
{
Hello(ref c);
}
public void Hello(ref char c)
{
c='a';
}只有调用的时候加上ref,并且方法的实体里参数类型也是ref char才能运行。
至于为什么加上ref。直接传值调用不行嘛?
我们来试下
class Class1
{
private char c=' ';
private int a = 0;
public void show()
{
Hello(c);
}
public void Hello(char c)
{
c='a';
}
}
private void Form1_Load(object sender, EventArgs e)
{
Class1 c1 = new Class1();
c1.show();
}
调试结果是这样的。我们可以看到c1.c的值还是' '。而c这个变量的值是a。结过和使用ref的进行比较下看看
我们发现使用了ref的话,c1.c的值也跟着发生了变化。这就是ref的进行引用调用的好处。也就相当于C语言中的传址调用。
|