c# ref和out区别仅仅是参数需不需要初始化?
2个回答
展开全部
ref和out使用时的区别是:
①:ref指定的参数在函数调用时候必须初始化,不能为空的引用。而out指定的参数在函数调用时候可以不初始化;
②:out指定的参数在进入函数时会清空自己,必须在函数内部赋初值。而ref指定的参数不需要。
一:ref 关键字使参数按引用传递。
其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。
也即是说,在方法中对参数的设置和改变将会直接影响函数调用之处(代码①及②)。无论是函数的定义还是调用时均不可忽略关键字ref.
二:ref定义的参数在使用前必须初始化,无论在函数定义时候参数有没有赋予初值。这条正好区分out指定的参数可以不在调用函数的时候进行初始化。
三 :对out来说,第一条同样适用。将代码①以及②中的ref全部修改成out,则可与使用ref得到同样的结果。
四:out指定的参数必须在函数定义的时候就赋初值。否则则出现错误。对比ref指定的参数则可以不在函数内部进行赋初值,在函数调用时候再赋初值也可以。
①:ref指定的参数在函数调用时候必须初始化,不能为空的引用。而out指定的参数在函数调用时候可以不初始化;
②:out指定的参数在进入函数时会清空自己,必须在函数内部赋初值。而ref指定的参数不需要。
一:ref 关键字使参数按引用传递。
其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。
也即是说,在方法中对参数的设置和改变将会直接影响函数调用之处(代码①及②)。无论是函数的定义还是调用时均不可忽略关键字ref.
二:ref定义的参数在使用前必须初始化,无论在函数定义时候参数有没有赋予初值。这条正好区分out指定的参数可以不在调用函数的时候进行初始化。
三 :对out来说,第一条同样适用。将代码①以及②中的ref全部修改成out,则可与使用ref得到同样的结果。
四:out指定的参数必须在函数定义的时候就赋初值。否则则出现错误。对比ref指定的参数则可以不在函数内部进行赋初值,在函数调用时候再赋初值也可以。
展开全部
楼主你好~
ref和out两个关键字的作用大致相同,但是有一些微妙但是重要的区别。
两者的行为相似到连编译器都认为这两者不能被重载:
public void SampleMethod(out int i) { }
public void SampleMethod(ref int i) { }
以上重载在编译时将被抛出一个错误,编译器认为out和ref是同样的行为,但是事实上在行为上他们有区别。
区别在于楼主说的ref需要初始化,out不需要。
但是上面那句话表明了什么?解读一下,便是ref传入的值在函数体中可能被修改,而out传入的值在函数体中肯定被赋值。
例如下面这个例子:
int fun(ref int i)
{
return 5;
}
int a = 1;
void fun(ref a);
编译可以通过,并且a不会改变,还是1
而:
int fun(out int i)
{
return 5;
}
int a = 1;
void fun(out a);
编译便会失败,因为在fun函数体中,你必须在return之前给i附一个值。
这是因为事实上out在使用之前会将传入参数清空,不管其原本是什么值。
例如:
int fun2(out int i)
{
int a = i;
i = 5;
return 5;
}
定义了上面那个函数,但是这个函数也会报错,因为在函数体将i赋值到a,本意是将传入的i赋值到一个新值a上,事实上,在函数开始之前,i已经被清空,不能赋值给a了。
而:
int fun2(ref int i)
{
int a = i;
i = 5;
return 5;
}
则完全没有问题。
所以,总结如下:
·ref需要在传入前赋值,out不需要。
·ref不需要关心函数体中发生了什么,函数体对ref透明。而out却不是,在函数体中不能将没有赋值的out参数赋值给其他成员,在函数退出前必须对out参数赋值。
请追问~
ref和out两个关键字的作用大致相同,但是有一些微妙但是重要的区别。
两者的行为相似到连编译器都认为这两者不能被重载:
public void SampleMethod(out int i) { }
public void SampleMethod(ref int i) { }
以上重载在编译时将被抛出一个错误,编译器认为out和ref是同样的行为,但是事实上在行为上他们有区别。
区别在于楼主说的ref需要初始化,out不需要。
但是上面那句话表明了什么?解读一下,便是ref传入的值在函数体中可能被修改,而out传入的值在函数体中肯定被赋值。
例如下面这个例子:
int fun(ref int i)
{
return 5;
}
int a = 1;
void fun(ref a);
编译可以通过,并且a不会改变,还是1
而:
int fun(out int i)
{
return 5;
}
int a = 1;
void fun(out a);
编译便会失败,因为在fun函数体中,你必须在return之前给i附一个值。
这是因为事实上out在使用之前会将传入参数清空,不管其原本是什么值。
例如:
int fun2(out int i)
{
int a = i;
i = 5;
return 5;
}
定义了上面那个函数,但是这个函数也会报错,因为在函数体将i赋值到a,本意是将传入的i赋值到一个新值a上,事实上,在函数开始之前,i已经被清空,不能赋值给a了。
而:
int fun2(ref int i)
{
int a = i;
i = 5;
return 5;
}
则完全没有问题。
所以,总结如下:
·ref需要在传入前赋值,out不需要。
·ref不需要关心函数体中发生了什么,函数体对ref透明。而out却不是,在函数体中不能将没有赋值的out参数赋值给其他成员,在函数退出前必须对out参数赋值。
请追问~
追问
ref 就是“可以”用函数给初始化的a那个赋值(函数不给a赋值也没事)
out 就是“必须”用函数给没初始化的a赋值(函数不给a赋值就报错)
我这样理解正确吗?全面吗?
追答
第一句没错,第二句应该是 out 就是"必须"用函数给某个值a赋值(函数不给a赋值就报错)。
a并不一定要有没有初始化,因为对于out来说,不管你有没有初始化,一旦进入函数体了,全部重新初始化一遍。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询