zoukankan      html  css  js  c++  java
  • asp.net(c#)ref,out ,params的区别

    NO.1 params
    一个可以让方法(函数)的拥有可变参数的关键字。
    原则:在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。
    示例(拷贝到vs2005中即可用,下面不再说明)
    复制代码
    代码如下:

    public partial class Form1 : Form
    {
    public static void UseParams(params int[] list)
    {
    string temp = "";
    for (int i = 0; i < list.Length; i++)
    temp = temp +" " +list[i].ToString();
    MessageBox.Show(temp);
    }
    public static void UseParams2(params object[] list)
    {
    string temp = "";
    for (int i = 0; i < list.Length; i++)
    temp = temp + " " + list[i].ToString();
    MessageBox.Show(temp);
    }
    public Form1()
    {
    InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
    UseParams(1, 2, 3);//看参数是3个
    UseParams(1, 2); //看参数是2个,可变吧
    UseParams2(1, 'a', "test");
    int[] myarray = new int[3] { 10, 11, 12 };
    UseParams(myarray); //看也可以是容器类,可变吧:)
    }
    }

    NO.2 out
    这是一个引用传递L。
    原则一:当一个方法(函数)在使用out作为参数时,在方法中(函数)对out参数所做的任何更改都将反映在该变量中。
    原则二:当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。
    原则三:若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。
    原则四:不必初始化作为 out 参数传递的变量,因为out 参数在进入方法(函数)时后清空自己,使自己变成一个干净的参数,也因为这个原因必须在方法返回之前为 out 参数赋值(只有地址没有值的参数是不能被.net接受的)。
    原则五:属性不是变量,不能作为 out 参数传递。
    原则六:如果两个方法的声明仅在 out 的使用方面不同,则会发生重载。不过,无法定义仅在 ref 和 out 方面不同的重载。例如,以下重载声明是有效的:
    复制代码
    代码如下:

    class MyClass
    {
    public void MyMethod(int i) {i = 10;}
    public void MyMethod(out int i) {i = 10;}
    }

    而以下重载声明是无效的:
    复制代码
    代码如下:

    class MyClass
    {
    public void MyMethod(out int i) {i = 10;}
    public void MyMethod(ref int i) {i = 10;}
    }

    有关传递数组的信息,请参见使用 ref 和 out 传递数组。
    示例附后
    NO.2 ref
    ref仅仅是一个地址!!!
    原则一:当一个方法(函数)在使用ref作为参数时,在方法中(函数)对ref参数所做的任何更改都将反映在该变量中。
    原则二:调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
    原则三:若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。ref 参数的值可以被传递到 ref 参数。
    原则四:ref参数传递的变量必须初始化,因为ref参数在进入方法(函数)时后还是它自己,它这个地址指向的还是原来的值,也因为这个原因ref参数也可以在使用它的方法内部不操作。
    原则六:如果两种方法的声明仅在它们对 ref 的使用方面不同,则将出现重载。但是,无法定义仅在 ref 和 out 方面不同的重载。例如,以下重载声明是有效的:
    复制代码
    代码如下:

    class MyClass
    {
    public void MyMethod(int i) {i = 10;}
    public void MyMethod(ref int i) {i = 10;}
    }

    但以下重载声明是无效的:
    复制代码
    代码如下:

    class MyClass
    {
    public void MyMethod(out int i) {i = 10;}
    public void MyMethod(ref int i) {i = 10;}
    }

    有关传递数组的信息,请参见使用 ref 和 out 传递数组。
    示例
    复制代码
    代码如下:

    public static string TestOut(out string i)
    {
    i = "out b";
    return "return value";
    }
    public static void TestRef(ref string i)
    {
    //改变参数
    i = "ref b";
    }
    public static void TestNoRef(string refi)
    {
    // 不用改变任何东西,这个太明显了
    refi = "on c";
    }
    public Form1()
    {
    InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
    string outi;//不需要初始化
    MessageBox.Show(TestOut(out outi));//返回值
    //输出"return value";
    MessageBox.Show(outi);//调用后的out参数
    //输出"out b";
    string refi = "a"; // 必须初始化
    TestRef(ref refi); // 调用参数
    MessageBox.Show(refi);
    //输出"ref b";
    TestNoRef(refi);//不使用ref
    MessageBox.Show(refi);
    //输出"ref b";
    }

    ref是传递参数的地址,out是返回值,两者有一定的相同之处,不过也有不同点。
      使用ref前必须对变量赋值,out不用。
      out的函数会清空变量,即使变量已经赋值也不行,退出函数时所有out引用的变量都要赋值,ref引用的可以修改,也可以不修改。
      区别可以参看下面的代码:

    using System; class TestApp {  static void outTest(out int x, out int y)  {//离开这个函数前,必须对x和y赋值,否则会报错。   //y = x;   //上面这行会报错,因为使用了out后,x和y都清空了,需要重新赋值,即使调用函数前赋过值也不行   x = 1;   y = 2;  }  static void refTest(ref int x, ref int y)  {   x = 1;   y = x;  }  public static void Main()  {   //out test   int a,b;   //out使用前,变量可以不赋值   outTest(out a, out b);   Console.WriteLine("a={0};b={1}",a,b);   int c=11,d=22;   outTest(out c, out d);   Console.WriteLine("c={0};d={1}",c,d);
      //ref test   int m,n;   //refTest(ref m, ref n);   //上面这行会出错,ref使用前,变量必须赋值
      int o=11,p=22;   refTest(ref o, ref p);   Console.WriteLine("o={0};p={1}",o,p);  } }
  • 相关阅读:
    PDF文件中的Form保存问题
    Understanding IP Fragmentation
    tcp ip guide IPsec IKE
    Windows安全事件日志中的事件编号与描述
    Cisco PIX fix up and Juniper firewall FTP ALG
    很好的IPSec介绍,详细解释了IKE协商的2个阶段的作用
    virtualbox 下运行Ubuntu 8.10的分辨率和guest additions的问题。
    Fixing the ‘Do you want to display nonsecure items’ message
    windows xp 开始菜单里面所有项目右键不起作用。
    HP backup and recovery manager
  • 原文地址:https://www.cnblogs.com/macavalier/p/3093917.html
Copyright © 2011-2022 走看看