A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 anyu 于 2012-11-16 22:26 编辑

看视频总结了下out()和ref()的异同点,有哪里说的不对或者不全,希望大家补充?

不同点:
out(传出不进):(1)被out修饰的参数,在传入前可以不赋初值。
                       (2)在方法中,必须在使用前为参数赋值。
ref(传入传出):(1)被ref修饰的参数,在传入前必须赋初值(初始化)。
                      (2)在方法中,在使用前不为参数赋值,则传出传入进来的值;使用前为参数赋值,则传出赋值后的值。

相同点:在传参数过程中,如果参数被out或者ref修饰,改变方法中参数变量的值,那么调用方法变量的值也会相应改变。

它们重要吗?在开发中用的多吗?在什么情况下用的多?怎么很少见到用这俩?

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

4 个回复

倒序浏览
ref 关键字会导致通过引用传递的参数,而不是值。 通过的效果引用指向该参数的任何更改。方法反映在基础参数变量在被调用的方法上。 引用参数的值始终是相同基础参数变量的值。
如下面的示例所示,若要使用 ref 参数,方法定义和调用的方法必须显式使用关键字,ref。


class RefExample
    {
        static void Method(ref int i)
        {
            i = i + 44;
        }

        static void Main()
        {
            int val = 1;
            Method(ref val);
            Console.WriteLine(val);
        }
    }

传递给 ref 参数的参数必须初始化,则通过之前。 这与 out 参数不同,参数不需要显式初始化,在通过之前。

尽管 ref 和 out 关键字会导致不同的运行时行为,但在编译时并不会将它们视为方法签名的一部分。 因此,无法重载方法,如果它们之间的唯一区别是一个方法采用 ref 参数,而其他重载采用 out 参数。 下面的代码,例如,无法生成。
class CS0663_Example
{
    public void SampleMethod(out int i) { }
    public void SampleMethod(ref int i) { }
}

但是,重载可以执行,当一个方法具有 ref 时或 out 参数和其他具有值,参数,如下面的示例所示。


class RefOverloadExample
    {
        public void SampleMethod(int i) { }
        public void SampleMethod(ref int i) { }
    }


属性不是变量。 它们是方法,而不能传递到 ref 参数。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
使用out或ref修饰的变量,在传参的时候也必须用out或ref修饰

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
从CLR的角度来看,out和ref是完全一致的,它们都生成了相同了IL代码,而且元数据也几乎完全一样
最大的用途在于,当一个函数返回的值不止一个时,可以用它们。比如,用存储过程进行分页的时候
回复 使用道具 举报
1.1.ref 在使用前必须初始化
2.out在使用前不必初始化,在函数内部初始化;out一般用在函数有多个返回值的场所
共同点:
     out和ref都会共享方法里和方法外的值。
不同点:
     out是从里往外传值。out在传参的时候可以不赋值,但是在方法里必须给参数赋值,并且是首先赋值。
     ref是双向的,即从外往里传值,也从里往外传值。ref类似传指针,对指向的地址在操作。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马