您的位置:首页 > 其它

值类型和引用类型参数

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);
}
}
输出结果: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: