博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ref out param 区别
阅读量:5132 次
发布时间:2019-06-13

本文共 2246 字,大约阅读时间需要 7 分钟。

如果在方法声明参数中未使用ref或out关键字,在方法中更改参数的值,当控制传递回调用过程时,不会保留更改的值;我们可以通过方法参数关键字,更改这种行为。

1.ref
2.out
3.params
ref和out关键字都可以使参数按引用传递,当控制权传递回调用方时,在被调方法中对参数所做的任何修改都将反映在该变量中,在使用时,都要求方法定义和调用方法显式使用ref或out关键字,但是它们有如下的几个区别:
a.当使用ref关键字时,传递到ref参数的变量必须事先初始化,而与 out不同,out 的参数在传递前不需要初始化,请看示例:
 static void Main(string[] args)
        {
            string aa = "0";  //传递给ref参数前,必须先初始化
            TestRef(ref aa);
            Console.WriteLine(aa);
         }
  public static void TestRef(ref string refTest)
        {
            refTest = "1";
         }
结果输出 "1"
 static void Main(string[] args)
        {
            string aa;  //传递给out参数前,不必先初始化
            TestRef(out aa);
            Console.WriteLine(aa);
         }
 public static void TestRef(out string refTest)
        {
            refTest = "1";
         }
结果输出"1"
ref和out在运行时的处理方式不同,但是在编译的时候的处理方式确实相同的,所以下面的两个函数是相同的
public void SampleMethod(ref int i) {  }
public void SampleMethod(out int i) {  }
在使用ref或out传递数组参数时,我们也要注意:
使用out传递时,在被调用方法中需要对数组进行赋值,这个是需要注意的地方;使用ref时,和上述的要求一样,需要先进行初始化,即由调用方明确赋值,所以不需要由被调用方明确赋值,请看代码:
  static void Main(string[] args)
        {
            string[] aa =null;//明确赋值
            TestRef(ref aa);
            Console.WriteLine((aa!=null&&aa.Length>0)?aa[0]:"null");
 
        }
 public static void TestRef(ref string[] refTest)
        {
           //这里不要明确赋值
            if (refTest != null)
            {
                if (refTest.Length > 0)
                {
                    refTest[0] = "A";
                }
            }
           
        }
 static void Main(string[] args)
        {
            string[] aa ;//
            TestRef(out aa);
            Console.WriteLine((aa!=null&&aa.Length>0)?aa[0]:"null");
 
        }
        public static void TestRef(out string[] refTest)
        {
            refTest = new string[] { "a", "b", "c", "d" }; //由于out参数不需要在传递前进行初始化,这里需要对对参数进行赋值
            if (refTest != null)
            {
                if (refTest.Length > 0)
                {
                    refTest[0] = "A";
                }
            }
         }
使用out参数,我们可以让方法有多个返回值,如:
 static void Method(out int i, out string s1, out string s2)
    {
        i = 44;
        s1 = "I've been returned";
        s2 = null;
    }
    static void Main()
    {
        int value;
        string str1, str2;
        Method(out value, out str1, out str2);
        // value is now 44
        // str1 is now "I've been returned"
        // str2 is (still) null;
    }
params关键字:
params 关键字可以指定在参数数目可变处采用参数的方法参数,在使用时要注意几点:
1.在方法声明中的params关键字后,不允许再出现其他参数
2.在方法声明中只允许使用一个params关键字

 static void Main(string[] args)

        {
            TestParams(1, "a", "cc");//方式1
            object[] obj = new object[] {1,"a","c" };//数组也可以传递过去,只要类型匹配
            TestParams(obj);
         }

 public static void TestParams(params object[] para)

        {
            for (int i = 0; i < para.Length; i++)
            {
                Console.WriteLine(para[i]);
            }
        }

转载于:https://www.cnblogs.com/soundcode/archive/2011/11/15/2249873.html

你可能感兴趣的文章
发布功能完成
查看>>
【原】小程序常见问题整理
查看>>
C# ITextSharp pdf 自动打印
查看>>
【Java】synchronized与lock的区别
查看>>
django高级应用(分页功能)
查看>>
【转】Linux之printf命令
查看>>
关于PHP会话:session和cookie
查看>>
STM32F10x_RTC秒中断
查看>>
display:none和visiblity:hidden区别
查看>>
C#double转化成字符串 保留小数位数, 不以科学计数法的形式出现。
查看>>
牛的障碍Cow Steeplechase
查看>>
Zookeeper选举算法原理
查看>>
3月29日AM
查看>>
利用IP地址查询接口来查询IP归属地
查看>>
HTML元素定义 ID,Class,Style的优先级
查看>>
构造者模式
查看>>
http和https的区别
查看>>
Hbuild在线云ios打包失败,提示BuildConfigure Failed 31013 App Store 图标 未找到 解决方法...
查看>>
找到树中指定id的所有父节点
查看>>
今天新开通了博客
查看>>