前进的每一步,都是学习,是成长。
自己编写的方法,传递参数的时候是否要保留预留参数的问题.
  • 首页 > 软件设计 > PC软件
  • 作者:最爱香茗
  • 2018年10月28日 9:10 星期日
  • 浏览:396
  • 字号:
  • 评论:0
  • 记得刚开始写程序的时候,出过一次问题,自己写好的一个类,给别人用,然后过了段时间,发现有的方法需要再增加参数,结果再更新给别人的时候,就造成别人需要修改很多东西,所以从那以后,再写方法的时候,都会在参数表里加一两个预留的参数,方便以后扩展,慢慢的也就形成了习惯了,但其实基本也没再用到.

    最近的一个项目中,跟一位C#做了很多年的前辈合作,仍然是在参数表中保留几个预留参数,而这位前辈却说,你就算是有预留参数,当你启用预留参数的时候,使用者仍然是需要修改代码的呀,并没有多大作用呀,再一想,也确实是这样.

    他给的建议是:对于确定有几个参数的,就只留几个参数,不需要加预留的,而对于可以预想到会有增加参数的,可以考虑加预留参数,对于不确定是否会有增加参数可能的情况,可以用以下两种方法实现:

    1.不增加预留参数,直接写,日后如果需要增加参数的时候,可以另外再写一个同名的方法,参数直接不同,VS中是不允许有同名同参的方法的, 但是如果参数类型不同或数量不同,则是可以同名的,所以当参数确实需要增加的时候,就另写一个参数不同的方法,在方法说明里说明两个参数的不同,并告诉使用者,使用者可以选择调用那一个.

    此时,如果之前的一个方法已经完全无用,可以选择直接删除,当然也可以选择不删除,但注释为"已废止"状态(VB.net中暂时还不知道有没有这个操作),在C#中要废止一个方法,可以使用 Obsolete(已废止或弃用方法属性),详细介绍如下:

    已弃用的方法,Obsolete第二个参数设置为true,调用此方法会产生警告并引起编译器报错

     [Obsolete("此方法已被弃用", true)]
    如:
    /// <summary>
    /// 已弃用的方法,Obsolete第二个参数设置为true,调用此方法会产生警告并引起编译器报错
    /// </summary>
    /// <param name="skey">参数</param>
    /// <returns></returns>
    [Obsolete("此方法已被弃用", true)]
    public string AbandonedOutput(string skey)
    {
         return null;
    }
    此时如果调用 AbandonedOutput()方法,编译的时候就会报错.
    /// <summary>
    ///  已弃用的方法,调用时只会产生警告
    /// </summary>
    /// <param name="skey"></param>
    /// <returns></returns>
    [Obsolete("此方法已被弃用")]
    public string Output(string skey)
    {
         return string.Format("这个方法可以用{0}", skey);
    }
    对于这种第二个参数不设置的,默认为False,此时编译不会摄氏,但会有警告.
    对以上两个方法调用后,编译时会有如下结果:


     2.使用可变参数列表来传递,使用params关键字

     params关键字的作用
    (1)、使用 params关键字可以指定一个方法参数,该方法参数的数目可变。
    (2)、可以发送参数声明中所指定类型的逗号分隔的参数列表或指定类型的参数数组。 还可以不发送参数。 如果未发送任何参数,则 params 列表的长度为零。
    (3)、在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。
    (4)、参数数组必须是一维数组
    (5)、不允许将params修饰符与ref和out修饰符组合起来使用
    (6)、与参数数组对应的实参可以是同一类型的数组名,也可以是任意多个与该数组的元素属于同一类型的变量
    (7)、若实参是数组则按引用传递,若实参是变量或表达式则按值传递
    (8)、用法:可变的方法参数,也称数组型参数,适合于方法的参数个数不知的情况,用于传递大量的数组集合参数;当使用数组参数时,可通过使用params关键字在形参表中指定多种方法参数,并在方法的参数表中指定一个数组

    (9)、形式为:方法修饰符 返回类型 方法名(params 类型[] 变量名)

    示例代码:

     

    static void Main(string[] args)
    {
           int[] myIntArray = { 5, 6, 7, 8, 9 };
           UseParam1(myIntArray);
    
           object[] myObjArray = { 2, 'b', "test", "again" };
           UseParam2(myObjArray);
    }
    static void UseParam1(params int[] args) {
           for (int i = 0; i < args.Length; i++)
           {
                Console.WriteLine(args[i] + "...");
            }
    }
    
    static void UseParam2(params object[] objs)
    {
         for (int i = 0; i < objs.Length; i++)
         {
             Console.WriteLine(objs[i] + " ");
         }
    }
    输出结果为:
    总结分析
    (1)当参数的类型定义成param int[] args时,这时UseParam方法就接收一个可变长的int类型的参数数组,注:只能是一维的,不能是二维的,要是二维的就乱套了
    所以,UseParam方法的调用方式就有两种:
    1、代码如下:
    UseParam(1,2,3,4,5);
    2、代码如下:
    int[] args={1,2,3,4,5};
    UseParam(args);
      (2)当参数的类型定义成param object[] args时,这是UseParam就接收一个可变长的object类型的参数数组,注:只能是一维的,不能是二维的,要是二维的就乱套了
    所以,UseParam方法的调用方式就有两种:
    1、代码如下:
    UseParam(1,"2",true,"a")
    2、代码如下:
    object[] args={1,2,"3",false,5};
    UseParam(args);
     

     

      您阅读这篇文章共花了:  
    二维码加载中...
    本文作者:最爱香茗      文章标题: 自己编写的方法,传递参数的时候是否要保留预留参数的问题.
    本文地址:http://www.gcsjl8.com/?post=269
    版权声明:若无注明,本文皆为“成长记忆”原创,转载请保留文章出处。