C# 引用类型作为函数参数时一些需要注意的地方
2012-08-03 17:06
537 查看
1.请看下面的这个例子:
----------定义一个类-------------------
public class RefClass
{
public int IntValue
{
get;
set;
}
}
----------定义四个静态方法-------------------
#region 测试值传递
static void AddValue(RefClass prc)//RefClass *prc,prc和传进来的rc指向同一个RefClass对象的地址
{
prc.IntValue++; //prc->IntValue++;
}
static void AddValue(ref RefClass prc)//RefClass **prc,prc指向传进来的rc的地址
{
prc.IntValue++;//(*prc)->IntValue++;
}
static void ChangeRef(RefClass prc)//RefClass *prc,prc和传进来的rc指向同一个RefClass对象的地址
{
prc = new RefClass() { IntValue = 1000 };
//prc=new RefClass() { IntValue = 1000 };请注意new关键字在C++中创建的是指向对象的指针不是对象
}
static void ChangeRef(ref RefClass prc)//RefClass **prc,prc指向传进来的rc的地址
{
prc = new RefClass() { IntValue = 1000 };
//*prc=new RefClass() { IntValue = 1000 };请注意new关键字在C++中创建的是指向对象的指针不是对象
}
#endregion
----------测试方法-------------------
private void button3_Click(object sender, EventArgs e)
{
string ResultMsg = "";
RefClass rc = new RefClass() { IntValue = 1 };//RefClass *rc=new RefClass() { IntValue = 1 };请注意new关键字在C++中创建的是指向对象的指针不是对象
AddValue(rc);//rc,传递指向RefClass对象的指针
ResultMsg+="调用AddValue(rc)后IntValue为:" + rc.IntValue.ToString() + "\r\n";
rc.IntValue = 1;//(注意这里重新把IntValue的值赋值为了1)
AddValue(ref rc);//&rc,传递指向RefClass对象指针的指针
ResultMsg += "调用AddValue(ref rc)后IntValue为:" + rc.IntValue.ToString() + "\r\n";
rc.IntValue = 1;
ChangeRef(rc);//rc,传递指向RefClass对象的指针
ResultMsg += "调用ChangeRef(rc)后IntValue为:" + rc.IntValue.ToString() + "\r\n";
rc.IntValue = 1;
ChangeRef(ref rc);//&rc,传递指向RefClass对象指针的指针
ResultMsg += "调用ChangeRef(ref rc)后IntValue为:" + rc.IntValue.ToString() + "\r\n";
MessageBox.Show(ResultMsg);
}
----------测试结果截图-------------------
![](http://my.csdn.net/uploads/201208/03/1343984566_3547.jpg)
----------结果分析-------------------
1.第一个函数AddValue(rc),形参指向了和实参一样的一个地址的拷贝,注意是拷贝
修改形参指向对象的属性值,直接会影响实参的指向对象的属性值,因为它们指向了同一个地址(虽然是拷贝),结果为2
2.第二个函数AddValue(ref rc),形参指向了和实参一样的一个地址,注意,这里是同一个地址,形参地址
的改变会直接导致实参地址的改变,它不是拷贝,和第一个函数一样,修改形参指向对象的属性值,肯定会直接回影响实参的指向对象的属性值,结果为2
3.第三个函数ChangeRef(rc),在这个函数里面prc = new RefClass() { IntValue = 1000 };,重新把形参指向了了一个新的地址
注意是指向了一个新的地址,因为它new了一个新的对象,而没有改变实参地址指向对象的属性值,由于它只是实参地址的一个拷贝,所以结果为1
4.第四个函数ChangeRef(ref rc),由于加上了ref关键字,形参指向了和实参一样的一个地址,它不是拷贝,所以
当形参指向了一个新的地址时,实参的地址也跟着改变了,所以结果为1000
----------定义一个类-------------------
public class RefClass
{
public int IntValue
{
get;
set;
}
}
----------定义四个静态方法-------------------
#region 测试值传递
static void AddValue(RefClass prc)//RefClass *prc,prc和传进来的rc指向同一个RefClass对象的地址
{
prc.IntValue++; //prc->IntValue++;
}
static void AddValue(ref RefClass prc)//RefClass **prc,prc指向传进来的rc的地址
{
prc.IntValue++;//(*prc)->IntValue++;
}
static void ChangeRef(RefClass prc)//RefClass *prc,prc和传进来的rc指向同一个RefClass对象的地址
{
prc = new RefClass() { IntValue = 1000 };
//prc=new RefClass() { IntValue = 1000 };请注意new关键字在C++中创建的是指向对象的指针不是对象
}
static void ChangeRef(ref RefClass prc)//RefClass **prc,prc指向传进来的rc的地址
{
prc = new RefClass() { IntValue = 1000 };
//*prc=new RefClass() { IntValue = 1000 };请注意new关键字在C++中创建的是指向对象的指针不是对象
}
#endregion
----------测试方法-------------------
private void button3_Click(object sender, EventArgs e)
{
string ResultMsg = "";
RefClass rc = new RefClass() { IntValue = 1 };//RefClass *rc=new RefClass() { IntValue = 1 };请注意new关键字在C++中创建的是指向对象的指针不是对象
AddValue(rc);//rc,传递指向RefClass对象的指针
ResultMsg+="调用AddValue(rc)后IntValue为:" + rc.IntValue.ToString() + "\r\n";
rc.IntValue = 1;//(注意这里重新把IntValue的值赋值为了1)
AddValue(ref rc);//&rc,传递指向RefClass对象指针的指针
ResultMsg += "调用AddValue(ref rc)后IntValue为:" + rc.IntValue.ToString() + "\r\n";
rc.IntValue = 1;
ChangeRef(rc);//rc,传递指向RefClass对象的指针
ResultMsg += "调用ChangeRef(rc)后IntValue为:" + rc.IntValue.ToString() + "\r\n";
rc.IntValue = 1;
ChangeRef(ref rc);//&rc,传递指向RefClass对象指针的指针
ResultMsg += "调用ChangeRef(ref rc)后IntValue为:" + rc.IntValue.ToString() + "\r\n";
MessageBox.Show(ResultMsg);
}
----------测试结果截图-------------------
![](http://my.csdn.net/uploads/201208/03/1343984566_3547.jpg)
----------结果分析-------------------
1.第一个函数AddValue(rc),形参指向了和实参一样的一个地址的拷贝,注意是拷贝
修改形参指向对象的属性值,直接会影响实参的指向对象的属性值,因为它们指向了同一个地址(虽然是拷贝),结果为2
2.第二个函数AddValue(ref rc),形参指向了和实参一样的一个地址,注意,这里是同一个地址,形参地址
的改变会直接导致实参地址的改变,它不是拷贝,和第一个函数一样,修改形参指向对象的属性值,肯定会直接回影响实参的指向对象的属性值,结果为2
3.第三个函数ChangeRef(rc),在这个函数里面prc = new RefClass() { IntValue = 1000 };,重新把形参指向了了一个新的地址
注意是指向了一个新的地址,因为它new了一个新的对象,而没有改变实参地址指向对象的属性值,由于它只是实参地址的一个拷贝,所以结果为1
4.第四个函数ChangeRef(ref rc),由于加上了ref关键字,形参指向了和实参一样的一个地址,它不是拷贝,所以
当形参指向了一个新的地址时,实参的地址也跟着改变了,所以结果为1000
相关文章推荐
- C#的Replace函数,使用函数作为的参数需要注意
- go struct作为值函数参数需要注意的地方
- C++指针作为函数的参数进行传递时需要注意的一些问题
- C# 引用类型作为函数参数时
- C# 引用类型作为函数参数时
- C# 引用类型作为函数参数时
- C# 引用类型作为函数参数时
- 将“引用”作为函数返回值类型的格式、好处和需要遵守的规则
- c++关于类型强转后作为引用参数的一些问题
- 将“引用”作为函数返回值类型的格式、好处和需要遵守的规则?
- 函数在什么时候需要“引用”类型的参数
- JAVA 泛型的类型参数需要注意的地方
- 将“引用”作为函数返回值类型的格式、好处和需要遵守的规则?
- 将“引用”作为函数返回值类型的格式、好处和需要遵守的规则?
- 基本数据类型的包装类型作为参数传递,以及其他引用类型作为参数传递,以及List中值的交换的一些问题
- C++编程中将引用类型作为函数参数的方法指南
- 将“引用”作为函数返回值类型的格式、好处和需要遵守的规则?
- 基本数据类型的包装类型作为参数传递,以及其他引用类型作为参数传递,以及List中值的交换的一些问题
- 指针的类型(需要注意的一些地方)
- C#引用类型作为方法的参数分析