c#中传递参数除了ref还有out,看资料上介绍他们的主要区别就是,前者必须在调用函数之前初始化,后者必须在函数附值,但我觉得ref可以完成out的全部功能,如果需要的话只需在调用函数的时候初始化为null即可,那c#中加入out有什么特殊的用处吗?那位大哥给介绍一下,小弟不胜感激!
解决方案 »
- 请问在VS2010中,Bitmap对象的Palette对象中的数据都是只读的,那如何处理呢。
- 错在哪里啊?
- mm马上给分!DataGridView定位到某一行!
- 请教一下
- 帮忙看下,这段怎么用c#写.急用.
- c#连sqlserver 2000登陆失败的问题
- [求助]关于c#+oracle的乱码问题!急!请大家帮助!
- 用WebClint发送短信时,出现的乱码该怎么解决?
- 用按钮如何在dataset实现上一页下一页,并让textbox也绑定
- opc开发 无法将类型为“OPCAutomation.OPCServerClass”的对象强制转换为类型“OPCAutomation.IOPCGroup
- 各位帮帮我看看啊,忙忙忙忙忙忙忙忙忙忙!!1
- 有趣的面向对象的问题?显示a、b、c哪个呢?
out参数在传入前不需要初始化out更灵活一些,
http://www.chinacs.net/archives/11/2004/08/10/926.html
2,相关性:out在调用函数前的赋值是被忽略的,也就是说与方法调用前的值无关,所以只要声明过就可以了。我自己的迷惑: 当参数是对象类型的时候,不使用ref和out声明,向方法内传递的实际上是对象的引用,同样在方法内部修改对象,这时候ref和out的作用我感到很困惑。召唤达人解答!~
public int Method1(out int r2)
{
...
}如果你要让Method1方法返回两个值,就只有使用out参数了。
兄弟刚接触c#两三个月,只懂皮毛!
我自己的迷惑: 当参数是对象类型的时候,不使用ref和out声明,向方法内传递的实际上是对象的引用,同样在方法内部修改对象,这时候ref和out的作用我感到很困惑。
我的理解是:
如果在函数体内不对参数开辟新的内存(即重新实例化),那么用不用out或ref是一样的(string类除外,好像string类的操作更像值类型);如果在函数内部要对参数重新实例化,就需要用ref或out了,因为如果不用ref或out的时候,参数实际上传的是对象引用的一个拷贝(就像c语言里船只真参数实际上也是传的指针的拷贝一样),对原来对象的操作就能对对象进行修改,如果要new一个实例的话,只是这个拷贝指向这块内存,而原来的对象引用还是指向原来的内存空间。况且参数的生存期只在函数体内,出了函数对他分配的内存也应该被回收。
public class ClsTest
{
public int intX; public ClsTest()
{
intX = 0;
}
}static void Func( ClsTest argClsTest )
{
argClsTest = new ClsTest();
argClsTest.intX = 7456;
}static void Main(string[] args)
{
ClsTest m_cls = new ClsTest();
Func( m_cls ); Console.WriteLine( m_cls.intX );
}
返回的结果是0;如果Func使用了ref关键字,那么结果就变成了7456。至于“用out就比用ref写出来的程序更可靠”,这个说法不对吧,out和ref都是表示参数使用引用传递的关键字,它们配合使用使参数用途更明确:ref,掉用方法前必须被初始化;out,调用方法里必须被初始化。举例就不用了吧,你很聪明的。
参数的值总与基础变量相同两个还是有区别的,上面说的赋值是一部分
在有:
在函数成员内部,引用参数被做为初始已赋值,输出参数视为初始未赋值(2)引用参数在函数调用前必须明确赋值,输出参数在函数返回前必须已明确赋值
②ref参数可以被修改,也可以不被修改,但是out必须被赋值或者修改。
③ref参数值可以在任何时候被调用参数使用,而out参数值只能在被赋值后才可以被使用。
如:
int i;int j = i;//Error,变量i没有被初始化。实际上就是为了这个。======神奇的分隔线=======void Test( out int i )
{
int j = i;//Error,变量i没有被初始化。
}又如:void Test ( ref int i )
{
int j = i;//正确
}//=========神奇的分隔线=========int i;
Test ( i );//Error,变量i没有被初始化。
参数的值总与基础变量相同
什么基础变量,自变量的,自变量是数学中的概念吧,编程当中我还没听说过呢,麻烦老兄给解释一下基础变量和自变量好吗?你这两句话兄弟是一点没看懂,我开始怀疑自己的智商了,赫赫。
biduan(笔端)同志说:在函数成员内部,引用参数被做为初始已赋值,输出参数视为初始未赋值
你俩是一个意思,一个给出理论,一个给出实践,不错,谢了
另外有一点:out/ref和传值参数之间可以看作函数重载的区别,但是仅仅out和ref的区别对IL是一样的,无法区分重载!
不行你可以写两个函数,查看IL代码,里面是一样的,我以前看过,好象都会编译成out(不是很确认)了
另外有一点:out/ref和传值参数之间可以看作函数重载的区别,但是仅仅out和ref的区别对IL是一样的,无法区分重载!
第二条神奇的分隔线下面的代码与上面的是在同一个类里面的,只不过下面的代码写在了某个函数里,我懒得虚构那个函数而已.....神奇的分隔线就是说省掉了一大堆东西.