zoukankan      html  css  js  c++  java
  • ref和out的区别在c#中 总结

     ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。简单点说就是,使用了refout的效果就几乎和C中使用了指针变量一样。它能够让你直接对原数进行操作,而不是对那个原数的Copy进行操作。

    还是以例子来说明吧;
    1. ref:
    int i =0;
    有函数fun(ref i)和fun(i)
    它们的函数体都是{ i = 3;},那么在执行以下两段代码后:
    (1)int i = 0; fun(i); System.Console.WriteLine(i.ToString());
    (2)int i = 0; fun(ref i); System.Console.WriteLine(i.ToString());
    (1)的输出是1,(2)的输出是3,

    2. out:
    int i; //注意,这里只是声明了变量i,并没有对其初始化
    有函数fun(ref i)、fun(out i)和fun(i)
    它们的函数体都是{ i = 3;},那么在执行以下三段代码后:
    (1)int i = 0; fun(i); System.Console.WriteLine(i.ToString());
    (2)int i = 0; fun(ref i); System.Console.WriteLine(i.ToString());
    (3)int i = 0; fun(out i); System.Console.WriteLine(i.ToString());
    (1)和(2)在编译的时候都会报错:错误 CS0165: 使用了未赋值的局部变量“i”
    而(3)能正常编译,而且输出3

    最后总结一下:
    Ref和Out这两个关键字都能够提供相似的功效,其作用也很像C中的指针变量。稍有不同之处是:
    使用Ref型参数时,传入的参数必须先被初始化。而Out则不需要,对Out而言,就必须在方法中对其完成初始化。
    使用Ref和Out时都必须注意,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。
    Out更适合用在需要Return多个返回值的地方,而Ref则用在需要被调用的方法修改调用者的引用的时候。

    列举一个例子

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace Test.OutAndRef
    {
        public partial class Test : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                int i1 = 0;
                int i11= fun1(i1);
                System.Console.WriteLine(i1.ToString() + fun1(i1));
    
                int i2 = 0; 
                int i22 = fun2(ref i2); 
                System.Console.WriteLine(i2.ToString() + fun2(ref i2));
    
                int i3; 
                int i33 = fun3(out i3); 
                System.Console.WriteLine(i3.ToString() + fun3(out i3));
            }
    
    
            public int fun1(int num)
            {
                num = 3;
                return ++num;
            }
    
            public int fun2(ref int num)
            {
                num = 3;
                return num++;
            }
    
            public int fun3(out int num)
            {
                num = 3;
                return num++;
            }
        }
    }



  • 相关阅读:
    排序
    自动生成存储过程的工具
    感悟javascript
    VS.net 2008 beta2 新功能
    北极光合伙人邓锋:要别人跳火坑,你自己先跳
    [转]驱动开发中应该注意的事项
    [转]CryptoAPI的应用(一)概述以及初始化模块
    [转]强制重启N种法
    Different ways of handling IRPs
    [转]分层驱动模型中IRP的传递与完成
  • 原文地址:https://www.cnblogs.com/xiaoXuZhi/p/3223365.html
Copyright © 2011-2022 走看看