c#⽅法参数:ref
class Program
{
static void Add(int num1)
{
num1++;
Console.WriteLine("num1的值是:{0}", num1);
}
static void Main(string[] args)
{
int num1 = 10;
Add(num1);
Console.WriteLine("num1的值是:{0}",num1);
}
}
最后输出:
Add⽅法内num1的值是:11
Main⽅法内num1的值是:10
在Add⽅法内对num1的修改并没有影响传递给它的num1
writeline输出数值变量值类型作为实参传递时,传递的是值的副本,形参接收到这个值,对这个值的修改并不会改变实参本⾝。但是如果我们有个需求要改变这个实参,⽽且还不能使⽤引⽤类型,也就是说我们要⽤值类型作为实参传递并能改变这个值,那么就⽤ref关键字。
void Method(ref int refArgument)
{
refArgument = refArgument + 44;
}
int number = 1;
Method(ref number);
Console.WriteLine(number);
// Output: 45
看这个例⼦就知道,实参传递值类型整形给Method⽅法,Method⽅法内部对这个值进⾏了修改,⽆需return语句,传递给它的number 也变了。这就是ref的功劳。ref将值类型进⾏了引⽤传递,并不是把值类型变成引⽤类型
如果使⽤ref关键字,那⽅法的定义和调⽤都要⽤ref,例如上⾯例⼦⽅法的定义void Method(ref int refArgument) ⽅法的调⽤
Method(ref number) 都⽤了ref
传递到ref的实参必须初始化值,⽐如上⾯的例⼦,如果number没有初始化为1,仅仅只是定义了int number;那是错的,会编译通不过,提⽰“使⽤了未赋值的局部变量number”
在⽅法的重载上,看下⾯的代码
class CS0663_Example
{
// Compiler error CS0663: "Cannot define overloaded
// methods that differ only on ref and out".
public void SampleMethod(out int i) { }
public void SampleMethod(ref int i) { }
}
类的成员不能具有仅在 ref、in 或 out ⽅⾯不同的签名。 如果类型的两个成员之间的唯⼀区别在于其中⼀个具有 ref 参数,⽽另⼀个具有out 或 in 参数,则会发⽣编译器错误。其他都相同,仅仅是ref out in不同,不⾜以证明是两个不同的⽅法。
下⾯这样是对的
class RefOverloadExample
{
public void SampleMethod(int i) { }
public void SampleMethod(ref int i) { }
}
ref关键字,在变量传进来时就要进⾏初始化,在⽅法内部可更新值,并⾃动返回给调⽤它的实参,更新实参的值
ref 地址/引⽤传递,调⽤时该参数必需已经初始化
参考:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论