值类型和引用类型参数
2004-12-19 13:43
323 查看
值类型和引用类型参数
1、值类型和引用类型
当使用值类型作为参数,传递的是参数的值的拷贝,调用的方法不会改变原来的参数。当使用引用类型作为参数时,传递的是引用的拷贝,调用的方法得到指向同一数据的指针。
范例:
classSomeClass
{
publicintChangeInt(intval)
{
returnval*2;
}
}
classValRefTest
{
staticvoidMain(string[]args)
{
SomeClasssc=newSomeClass();
intval1=3;
intval2=sc.ChangeInt(val1);
Console.WriteLine("val1={0},val2={1}",
val1,val2);
}
}
输出结果为:var1=3,var2=6
classAnotherClass
{
publicintID;
}
classSomeClass
{
publicAnotherClassChangeObject(AnotherClassref1)
{
ref1.ID=ref1.ID*2;
returnref1;
}
}
classValRefTest
{
staticvoidMain(string[]args)
{
SomeClasssc=newSomeClass();
AnotherClassref1=newAnotherClass();
ref1.ID=3;
AnotherClassref2=sc.ChangeObject(ref1);
Console.WriteLine("ref1.ID={0},ref2.ID={1}",
ref1.ID,ref2.ID);
}
}
2、Ref
使用Ref,则传递参数前必须初始化,代码如下:
classSomeClass
{
publicvoidChangeInt(refintval)
{
var=val*2;
}
}
classValRefTest
{
staticvoidMain(string[]args)
{
SomeClasssc=newSomeClass();
intval1=3;
sc.ChangeInt(refval1);
Console.WriteLine("val1={0}",val1);
}
}
输出结果为:var1=6
3、Out
使用Out,必须在该方法中对参数进行赋值,而不必在传递参数前进行初始化。
classSomeClass
{
publicvoidChangeInt(outintval)
{
var=2;
}
}
classValRefTest
{
staticvoidMain(string[]args)
{
SomeClasssc=newSomeClass();
intval1;
sc.ChangeInt(outval1);
Console.WriteLine("val1={0}",val1);
}
}
输出结果为:var1=2
4、Ref和引用类型
使用Ref来传递引用类型和使用Ref来传递值类型是一样。
5、Out和引用类型
使用Out传递引用类型,在调用的方法内部必须对参数赋值,注意不是对参数的字段赋值。
输出结果为:ref1.ID=99,ref2.ID=99
1、值类型和引用类型
当使用值类型作为参数,传递的是参数的值的拷贝,调用的方法不会改变原来的参数。当使用引用类型作为参数时,传递的是引用的拷贝,调用的方法得到指向同一数据的指针。
范例:
classSomeClass
{
publicintChangeInt(intval)
{
returnval*2;
}
}
classValRefTest
{
staticvoidMain(string[]args)
{
SomeClasssc=newSomeClass();
intval1=3;
intval2=sc.ChangeInt(val1);
Console.WriteLine("val1={0},val2={1}",
val1,val2);
}
}
输出结果为:var1=3,var2=6
classAnotherClass
{
publicintID;
}
classSomeClass
{
publicAnotherClassChangeObject(AnotherClassref1)
{
ref1.ID=ref1.ID*2;
returnref1;
}
}
classValRefTest
{
staticvoidMain(string[]args)
{
SomeClasssc=newSomeClass();
AnotherClassref1=newAnotherClass();
ref1.ID=3;
AnotherClassref2=sc.ChangeObject(ref1);
Console.WriteLine("ref1.ID={0},ref2.ID={1}",
ref1.ID,ref2.ID);
}
}
输出结果:ref1.ID=6,ref2.ID=6
2、Ref
使用Ref,则传递参数前必须初始化,代码如下:
classSomeClass
{
publicvoidChangeInt(refintval)
{
var=val*2;
}
}
classValRefTest
{
staticvoidMain(string[]args)
{
SomeClasssc=newSomeClass();
intval1=3;
sc.ChangeInt(refval1);
Console.WriteLine("val1={0}",val1);
}
}
输出结果为:var1=6
3、Out
使用Out,必须在该方法中对参数进行赋值,而不必在传递参数前进行初始化。
classSomeClass
{
publicvoidChangeInt(outintval)
{
var=2;
}
}
classValRefTest
{
staticvoidMain(string[]args)
{
SomeClasssc=newSomeClass();
intval1;
sc.ChangeInt(outval1);
Console.WriteLine("val1={0}",val1);
}
}
输出结果为:var1=2
4、Ref和引用类型
使用Ref来传递引用类型和使用Ref来传递值类型是一样。
classAnotherClass
{
publicintID;
}
classSomeClass
{
//publicAnotherClassChangeObject(AnotherClassref1)
publicAnotherClassChangeObject(refAnotherClassref1)
{
ref1.ID=ref1.ID*2;
returnref1;
}
}
classValRefTest
{
staticvoidMain(string[]args)
{
SomeClasssc=newSomeClass();
AnotherClassref1=newAnotherClass();
ref1.ID=3;
//AnotherClassref2=sc.ChangeObject(ref1);
AnotherClassref2=sc.ChangeObject(refref1);
Console.WriteLine("ref1.ID={0},ref2.ID={1}",
ref1.ID,ref2.ID);
}
}
5、Out和引用类型
使用Out传递引用类型,在调用的方法内部必须对参数赋值,注意不是对参数的字段赋值。
classAnotherClass
{
publicintID;
}
classSomeClass
{
//Thiswon'tcompile
publicAnotherClassChangeObject(outAnotherClassref1)
{
ref1.ID=ref1.ID*2;
returnref1;
}
//Thiswon'tcompile
publicAnotherClassChangeObject(outAnotherClassref1)
{
ref1.ID=4;
returnref1;
}
//Thiswon'tcompile
publicAnotherClassChangeObject(outAnotherClassref1)
{
intx=ref1.ID;
ref1=newAnotherClass();
ref1.ID=x*2;
returnref1;
}
//ThisWILLcompile
publicAnotherClassChangeObject(outAnotherClassref1)
{
ref1=newAnotherClass();
ref1.ID=99;
returnref1;
}
}
classRefByOutTest
{
staticvoidMain(string[]args)
{
SomeClasssc=newSomeClass();
AnotherClassref1=newAnotherClass();
ref1.ID=3;
AnotherClassref2=sc.ChangeObject(outref1);
Console.WriteLine("ref1.ID={0},ref2.ID={1}",
ref1.ID,ref2.ID);
}
}
输出结果为:ref1.ID=99,ref2.ID=99
相关文章推荐
- 引用类型参数的传值
- PHP函数引用类型参数
- Unit02: 重载与缺省参数 、 内联与动态内存分配 、 引用 、 显式类型转换 、 类和对象
- 反射技术动态调用方法中的引用类型参数传递 (转)
- C++ 参数传递 nonreference parameters & reference parameters 非引用和引用类型
- C++中拷贝构造函数的参数为何一定要用引用类型
- C# 之值类型与引用类型参数[基础]
- 基本数据类型的包装类型作为参数传递,以及其他引用类型作为参数传递,以及List中值的交换的一些问题
- 【转】拷贝构造函数的参数类型必须是引用
- 拷贝构造函数的参数为什么必须使用引用类型
- 值类型与引用类型作为参数输出的效果
- C#之引用类型参数
- 基本类型和引用类型参数传递图解
- JavaScript高级 面向对象(12)--引用类型值类型作为参数传递的特性
- java 传递参数 “引用是一种数据类型”,“参数是引用的一个拷贝”
- 拷贝构造函数的参数为什么必须使用引用类型
- 比较3数大小(引用类型做参数)
- c++函数参数类型-引用
- c#基础语言编程-按值类型和引用类型传递参数
- [对象和类型]5.引用传参和值传参:ref参数,out参数