C#中ref、out及特殊说明参数的用法

本文详细介绍了C#中ref和out参数的使用方法及其区别。通过具体示例展示了如何利用这两种参数来修改方法外部的变量值,并比较了它们与普通参数的不同之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.out参数的用法。

usingSystem;
classTestOut
...{
staticpublicvoidFillArray(outint[]myArray)
...{
//初始化数组(必须):
myArray=newint[5]...{1,2,3,4,5};
}


staticpublicvoidMain()
...{
int[]myArray;//初始化数组(不是必须的!)

//传递数组给(使用out方式的)调用方:
FillArray(outmyArray);

//显示数组元素
Console.WriteLine("数组元素是:");
for(inti=0;i<myArray.Length;i++)
Console.WriteLine(myArray[i]);
}

}

2.ref参数的基本用法,相当于c里面的指针。


usingSystem;
classTestRef
...{
publicstaticvoidFillArray(refint[]arr)
...{
//根据需要创建一新的数组(不是必须的)
if(arr==null)
arr
=newint[10];
//否则填充数组,就可以了
arr[0]=123;
arr[
4]=1024;
}


staticpublicvoidMain()
...{
//初始化数组:
int[]myArray=...{1,2,3,4,5};

//使用ref传递数组:
FillArray(refmyArray);

//显示更新后的数组元素:
Console.WriteLine("数组元素是:");
for(inti=0;i<myArray.Length;i++)
Console.WriteLine(myArray[i]);
}

}


3.有ref与无ref的比较。


usingSystem;
publicclassMyClass
...{
publicstaticvoidTestRef(refchari)
...{
//Thevalueofiwillbechangedinthecallingmethod
i='b';
}


publicstaticvoidTestNoRef(chari)
...{
//Thevalueofiwillbeunchangedinthecallingmethod
i='c';
}




//Thismethodpassesavariableasarefparameter;thevalueofthe
//variableischangedaftercontrolpassesbacktothismethod.
//Thesamevariableispassedasavalueparameter;thevalueofthe
//variableisunchangedaftercontrolispassedbacktothismethod.
publicstaticvoidMain()
...{
chari='a';//variablemustbeinitialized
TestRef(refi);//theargmustbepassedasref
Console.WriteLine(i);
i
='a';
TestNoRef(i);
Console.WriteLine(i);

}

}


4.此处应用了类,注意类是引用类型,直接进行引用,除非在函数内生成新的类。



usingSystem;
//----------------------------------------
//MyClassdefinition
publicclassMyClass
...{
publicintValue;



//----------------------------------------
//Testermethods
publicstaticvoidTestRef(refMyClassm)
...{
m.Value
=10;
}


publicstaticvoidTestNoRef(MyClassm)
...{
m.Value
=20;
}


publicstaticvoidTestCreateRef(refMyClassm)
...{
m
=newMyClass();
m.Value
=100;
}


publicstaticvoidTestCreateNoRef(MyClassm)
...{
m
=newMyClass();
m.Value
=200;
}


publicstaticvoidMain()
...{
MyClassm
=newMyClass();
m.Value
=1;

TestRef(
refm);
Console.WriteLine(m.Value);

TestNoRef(m);
Console.WriteLine(m.Value);

TestCreateRef(
refm);
Console.WriteLine(m.Value);

TestCreateNoRef(m);
Console.WriteLine(m.Value);
}

}


5.ref,out,与无参参数的比较。


usingSystem;
classTestApp
...{
staticvoidoutTest(outintx,outinty)
...{//离开这个函数前,必须对x和y赋值,否则会报错。
//y=x;
//上面这行会报错,因为使用了out后,x和y都清空了,需要重新赋值,即使调用函数前赋过值也不行
x=1;
y
=2;
}

staticvoidrefTest(refintx,refinty)
...{
x
=1;
y
=x;
}



staticvoidnoRefTest(intx,inty)
...{
x
=8;
y
=x;
}




publicstaticvoidMain()
...{
//outtest
inta,b;
//out使用前,变量可以不赋值
outTest(outa,outb);
Console.WriteLine(
"a={0};b={1}",a,b);
intc=11,d=22;
outTest(
outc,outd);
Console.WriteLine(
"c={0};d={1}",c,d);

//reftest
//intm,n;
//refTest(refm,refn);
//上面这行会出错,ref使用前,变量必须赋值

into=11,p=22;
refTest(
refo,refp);
Console.WriteLine(
"o={0};p={1}",o,p);

intli=99,zong=89;
noRefTest(li,zong);
Console.WriteLine(
"{0},{1}",li,zong);



}

}

































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值