C#之out与ref的共性与区别以及用法

引入:

首先看一个例子:

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             int number = 10;
 6             int result = Test(number);
 7             Console.WriteLine("number={0},result={1}", number, result);
 8             Console.ReadKey();
 9         }
10
11         static int Test(int a)
12         {
13             a = 20;
14             return a;
15         }
16     }

此时,显然得到number=10,a=20;把number传给方法Test中的a,在方法number中改变a的值,number的值并不会发生改变。

然后我们做如下改变

 class Program
    {
        static void Main(string[] args)
        {
            int number;
            int result = Test(number);//此处会报错“使用了未赋值的局部变量‘number’”
            Console.WriteLine("number={0},result={1}", number, result);
            Console.ReadKey();
        }

        static int Test(int a)
        {
            a = 20;
            return a;
        }
    }

显然变量没有赋值就使用是错误的

现在我们使用out代码如下:

 class Program
    {
        static void Main(string[] args)
        {
            int number;
            int result = Test(out number);//注意调用时也需要加out
            Console.WriteLine("number={0},result={1}", number, result);
            Console.ReadKey();
        }
        static int Test(out int a)
        {
            a = 20;//若方法中参数标有out,一定对a先进行赋值才可以使用。
            return a;
        }
    }

此时结果为number=20,result=20;一旦使用out,a就不是往方法里传值而是往外返回值。

不再是把number的值赋给a了,而是把number与a建立起一种联系,在方法Test中必须对a进行赋值,对a进行赋值后就相当于对number进行赋值(即把number的引用传递给a)

out总结:

1.在方法的参数前加out,那么在传参数的时候也必须在参数前使用out,以表明此参数并不是用来传入而是用来传出值的。

2.如果参数是以out形式传入的,那么在传入不能对其进行赋值。

3.在方法中对于用out修饰的参数,必须对其赋值,且必须在其使用前进行赋值。

ref:

    class Program
    {
        static void Main(string[] args)
        {
            int number = 10;
            int result = Test(ref number);//注意调用时也需要加ref
            Console.WriteLine("number={0},result={1}", number, result);
            Console.ReadKey();
        }
        static int Test(ref int a)
        {
            int b = a;            a=20;
            return b;
        }
    }

此时结果为:number=20,result=10;此时把number的值传入了方法Test,并且变量b使用了,然后对a进行赋值20,并且传了出去。

即ref既可以传入参数也可以传出参数。

总结ref与out

out用于传入值,ref是双向的既可以传入又可以传出。(其原理为引用类型传递与值类型传递,不使用out与ref时为值类型传递,使用时为引用类型传递)

在传参数的过程中如果有ref与out修饰,那么改变方法中参数变量的值,也会改变使用者方法中变量的值。

out的使用实例

1.微软提供了一个int类型的方法

int.TryParse(string s,out int result)

首先解释一下这个方法

该方法的返回值为bool型。即转换成功返回true,转换失败返回false;同时转换成功会返回一个result,result的值即为转换后的值,转换失败result则为null

下面我们自己写一个方法实现这个功能

  class Program
    {
        static void Main(string[] args)
        {
            string s = "123";
            int result;
            if (ConvertInt(s, out result))
            {
                Console.WriteLine("转换成功" + result);
            }
            else
            {
                Console.WriteLine("转换失败!");
            }
            Console.ReadKey();
        }
        static bool ConvertInt(string s,out int result)
        {
            try
            {
                result = Convert.ToInt32(s);
                return true;
            }
            catch {
                result = 0;//注意此处,必须对out修饰的参数result赋值
                return false;
            }
        }
    }

可在需要返回多个值时使用out与ref。

可以使用如下实例练手!

对一个数组元素求和并返回和与数组元素的最大值和最小值

时间: 2024-12-29 05:40:41

C#之out与ref的共性与区别以及用法的相关文章

inline-block和float的共性和区别

在我们平时工作中,经常会遇到把一些块状元素在一行排列显示,这时候我们通常会用到flaot,或许会用inline-block等等,那么他们有什么共性和区别?适用在什么场景? 共性: ①inline-block: 是把一个元素的display设置为块状内联元素,意思就是说,让一个元素的容器inline展示,并且里面的内容block展示:inline属性使元素内联展示,内联元素设置宽度无效,相邻的inline元素会在一行显示不换行,直到本行排满为止.block的元素始终会独占一行,呈块状显示,可设置宽

Ref与Out的区别

Ref与Out的区别 ref和out都是C#中的关键字,所实现的功能也差不多,都是指定一个参数按照引用传递. 对于编译后的程序而言,它们之间没有任何区别,也就是说它们只有语法区别. 总结起来,他们有如下语法区别: 1.ref传进去的参数必须在调用前初始化,out不必,即: int i; SomeMethod( ref i );//语法错误 SomeMethod( out i );//通过 2.ref传进去的参数在函数内部可以直接使用,而out不可: public void SomeMethod(

C#中ref和out的区别浅析

这篇文章主要介绍了C#中ref和out的区别浅析,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢,需要的朋友可以参考下 在C#中通过使用方法来获取返回值时,通常只能得到一个返回值.因此,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢? MSDN:       ref 关键字使参数按引用传递.其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中.若要使用 ref 参数,则方法定义和调用方法都必

out,ref的作用和区别(转载)

ref和out的区别在C# 中,既可以通过值也可以通过引用传递参数.通过引用传递参数允许函数成员更改参数的值,并保持该更改.若要通过引用传递参数, 可使用ref或out关键字.ref和out这两个关键字都能够提供相似的功效,其作用也很像C中的指针变量.它们的区别是: 1.使用ref型参数时,传入的参数必须先被初始化.对out而言,必须在方法中对其完成初始化. 2.使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字.以满足匹配. 3.out适合用在需要retrun多个返回值

转载:C#中ref和out的区别浅析

这篇文章主要介绍了C#中ref和out的区别浅析,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢,需要的朋友可以参考下 在C#中通过使用方法来获取返回值时,通常只能得到一个返回值.因此,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢? MSDN:        ref 关键字使参数按引用传递.其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中.若要使用 ref 参数,则方法定义和调用方法都

ref和out的区别,值类型和引用类型的使用

今天刚刚明白ref和out的区别,只限于个人理解如有不同请赐教,谢谢 首先我感觉ref和out是针对于值类型来说,以前一直认为是针对于引用类型看下面的一段代码 1.首先结果 i=0:ints[0]=0    i=0;ints[0]=100 2.ints作为一个引用类型在传入方法后,对ints[0]进行了赋值,是将引用类型的地址引用到了100这个值得堆上, 3.而值类型i引入到另外一个方法后进行赋值不会对原有字符串进行改变 4.ref就是为了解决这个问题,让值类型能够和引用类型一样在传入方法后值会

Ref和Out的区别

最近在许多论坛上看到关于了ref和out的区别,发现解释的都不非常理想. 我想抄写点官方的解释,然后再来我自己的解释//如下方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量.当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中. 当希望方法返回多个值时,声明 out 方法非常有用.使用 out 参数的方法仍然可以返回一个值.一个方法可以有一个以上的 out 参数. 若要使用 out 参数,必须将参数作为 out 参数显式传递到方法.out 参数的值不会传递到

out和ref的用法和区别

out和ref的用法和区别 函数参数默认是值传递,也就是“复制一份” 看个栗子: static void Main(string[] args) { int age = 10; IncAge(age); Console.WriteLine(age);//结果是10,因为函数参数默认是值传递,IncAge()对外面这个age没有影响 Console.ReadKey(); } static void IncAge(int age) { age++; } ref(reference:引用) ref必须

C# 中 in,out,ref 的作用与区别

In:过程不会改写In的内容 Out和out:传入的值不会被过程所读取,但过程可以写 ref:传入的值,过程会读,也会写 就象你把布料送到裁缝的一个收料箱(裁缝用这个区别是哪家客户) IN:这块布料,不能动,我取时还要原样(我取时会要不要这块料,是我自己的事,你管不着,但你不能把这块料做任何改变,你只能看这块料的质地.色彩等等,你要想改变这块料,那自已去照这块料的样子复制一个) Out和out:我可能给了你布料,也可能没给,也可能我给你的只是一张纸或一块羊皮,但我希望无论我给或没给,你都会给我一