zoukankan      html  css  js  c++  java
  • 【CLR in c#】参数

    1.可选参数和命名参数

      设计一个参数时,可为部分或全部参数分配默认值,调用这些方法的代码可以选择不指定部分实参,接受默认值,还可以通过制定参数名称的方式传递实参。如下

    class CLR可选参数
        {
            private static int s_n = 0;
            private static void M(int x = 9, string s = "A", DateTime dt = default(DateTime), Guid guid = new Guid())
            {
                Console.WriteLine("x={0},s={1},dt={2},guid={3}", x, s, dt, guid);
            }
            public static void Test()
            {
                //等同于M(9, "A", default(DateTime), new Guid())
                M();
                //等同于M(8, "X", default(DateTime), new Guid())
                M(8, "X");
                //等同于M(5, "A", DateTime.Now, Guid.NewGuid()))
                M(5, guid: Guid.NewGuid(), dt: DateTime.Now);
    
                //等同于string t1=0,t2=1;
                //M(t2,t1,default(DateTime), new Guid())
                M(s: (s_n++).ToString(), x: s_n++);
    
            }
        }

    结果:

    x=9,s=A,dt=0001/1/1 0:00:00,guid=00000000-0000-0000-0000-000000000000
    x=8,s=X,dt=0001/1/1 0:00:00,guid=00000000-0000-0000-0000-000000000000
    x=5,s=A,dt=2014/10/20 1:23:02,guid=ae35fafd-dc14-43d9-be4c-97e7e33d0cf6
    x=1,s=0,dt=0001/1/1 0:00:00,guid=00000000-0000-0000-0000-000000000000

    2.隐式类型的局部变量

      也就是使用var,编译器会根据表达式推断具体的数据类型。只是举报变量的一种简化语法,只能用于声明方法内部的局部变量。没有太多需要说的,

    3.以传引用的方式向方法传递参数(ref和out关键字)

      CLR用关键字ref和out来传引用而非传值的方式传递参数,告诉编译器生成的代码来传递参数的地址而不是传递参数本身。

      在CLR的角度,ref和out是完全一样的,区别在于out不需要再调用前初始化对象,而且在返回前必须写入值,而ref关键字则必须在调用方法前初始化参数的值。

    public sealed class Program{
      public static void Main(){
            int x;                                  //x没有初始化
            GetVal(out x);                    //x不必初始化
            Console.WriteLine(x);        //显示10
        }    
      private static void GetVal(out int v){
        v=10;       //该方法必须初始化v
      }  
    }
    
    public sealed class Program{
      public static void Main(){
            int x=5;                                  //已经初始化
            GetVal(ref x);                    //x不必初始化
            Console.WriteLine(x);        //显示15
        }    
      private static void GetVal(ref int v){
        v+=10;       //该方法可使用v的已初始化的值
      }  
    }

    4.向方法传递可变数量的参数(params)

    static int Add(params int[] values)
    {
      int sum=0;
      if(values!=null)
      {
        for(int x=0;x<values.Length;x++)
          sum+=values[x];  
      }
    }
    
    //调用方法1
    Add(new int[]{1,2,3,4,5,6});
    //调用方法2,简化方法
    Add(1,2,3,4,5,6);

    只有方法的最后一个参数才可以使用params关键字来标记,但使用该关键字会造成一些额外的性能损失,因为数组对象必须分配在堆上,必须初始化,最终被垃圾回收。可以考虑定义几个没有使用params关键字的重载版本。

    5,定义参数和返回类型的指导原则

    1.尽量指定最弱的类型,最好是接口而不是基类

      //好:使用一个弱参数类型

     public void ManipulateItems<T>(IEnumerable<T> collection){}

    //不好:使用一个强参数类型

     public void ManipulateItems<T>(List<T> collection){}

    调用第一个方法时候可传递数组对象、List<T>对象,string对象等其他实现了IEnumerable接口的对象。而第二个方法只允许传递List<T>对象,显然第一个更加灵活。

    2,好的返回类型一般声明为最强类型,以免受限于特定类型。

    //好,返回强返回类型

    public FileStream OpenFile(){}

    //不好,返回弱返回类型

    public Stream OpenFile(){}

    因为第一个方法即可与返回FileStream ,也可以返回Stream 

  • 相关阅读:
    plsql excel导入报错:未发现数据源名称并且未指定默认驱动程序
    exception java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    Android DiskLruCache 源代码解析 硬盘缓存的绝佳方案
    uestc 360(区间合并)
    UI_UITabBarController
    【C++ Primer】用于大型程序的工具
    Java 从基础到进阶学习之路---类编写以及文档凝视.
    Android 项目的代码混淆,Android proguard 使用说明
    android:Activity四种启动模式简单介绍
    已有数据库(单机)部署Database Vault
  • 原文地址:https://www.cnblogs.com/m7777/p/4036339.html
Copyright © 2011-2022 走看看