zoukankan      html  css  js  c++  java
  • out,ref,params修饰符的使用和区别

    ========================out,ref修饰符的作用========================

    我们先来看一个例子,这样会更有助于我们了解这两个修饰符的意义

    A.
    protected void Page_Load(object sender, EventArgs e)
    {
            string a = "";
            getStr(a);

            Response.Write("^^^^" + a + "^^^^");
    }

    public void getStr(string a)
    {
            a = "abcd";
    }

    以上这段程序的输出结果是 ^^^^^^^^

    B.
    protected void Page_Load(object sender, EventArgs e)
    {
            string a = "";
            getStr(ref a);

            Response.Write("^^^^" + a + "^^^^");
    }

    public void getStr(ref string a)
    {
            a = "abcd";
    }

    以上这段程序的输出结果是 ^^^abcd^^^

    C.
    protected void Page_Load(object sender, EventArgs e)
    {
            string a = "";
            getStr(out a);

            Response.Write("^^^^" + a + "^^^^");
    }

    public void getStr(out string a)
    {
            a = "abcd";
    }

    以上这段程序的输出结果同样是 ^^^abcd^^^

    朋友们可能要问,B和C 两段程序的输出结果是一样的阿,对,是一样的,他们两个修饰符的区别就在于调用前的变量
    使用out 修饰符,变量可以不初始化,而使用 ref 修饰符,则变量必须初始化,如下

    string a;
    getStr(ref a);

    这样系统就会报错 Use of unassigned local variable 'a'

    另外,out 和 ref 还有两个不同之处
    (1) ref传进去的参数在函数内部可以直接使用,而out不可
    (2) ref传进去的参数在函数内部可以不被修改,但out必须在离开函数体前进行赋值


    注:一般方法的参数(如A段代码的getStr方法的参数)是传递变量值的拷贝,而加上out和ref修饰符后就变成对变量内存地址的引用

    ========================params修饰符的作用========================

    params 构造函数声明数组 而不知道数组长度 用的
    在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。
    using System;
    public class MyClass
    {

    public static void UseParams(params int[] list)
    {
    for (int i = 0 ; i < list.Length; i++)
    {
    Console.WriteLine(list[i]);
    }
    Console.WriteLine();
    }

    public static void UseParams2(params object[] list)
    {
    for (int i = 0 ; i < list.Length; i++)
    {
    Console.WriteLine(list[i]);
    }
    Console.WriteLine();
    }

    static void Main()
    {
    UseParams(1, 2, 3);
    UseParams2(1, 'a', "test");

    // An array of objects can also be passed, as long as
    // the array type matches the method being called.
    int[] myarray = new int[3] {10,11,12};
    UseParams(myarray);
    }
    }

    输出
    1
    2
    3

    1
    a
    test

    10
    11
    12

  • 相关阅读:
    HDU 5441 离线处理 + 并查集
    [转载]HDU 3478 判断奇环
    POJ 1637 混合图的欧拉回路判定
    [转载] 一些图论、网络流入门题总结、汇总
    UVA 820 --- POJ 1273 最大流
    [转载 ]POJ 1273 最大流模板
    POJ 3041 -- 二分图匹配
    2014西安现场赛F题 UVALA 7040
    UVA 12549
    割点、桥(一点点更新)
  • 原文地址:https://www.cnblogs.com/kinpauln/p/1921621.html
Copyright © 2011-2022 走看看