zoukankan      html  css  js  c++  java
  • C#深入浅出 修饰符(二)

    1.函数参数前的修饰符 params ,ref ,out
    params修饰的数据类型只能数组,用于参数不固定时;且此参数位于所有形式参数的最后;
    public static int GetMax(params int[]args)
    {
            if(params==null)throw new exception("请传几个值!");
            int max=args[0]
            foreach(int i in args)
            {
                if(max<args[i])
                    max=args[i]
            }
            return max;
    }
     static void main(string []args)
    {
            int i=GetMax(1,2,3,4............);//参数也可以是数组
            Console.WriteLine("最大值为:"+i);
    }
     注:params和未知大小的数组参数的区别是:1.params参数,可以不用传参,该参数是可选的;2.可以传递任意个数的对象,而不用封装成数组
     
    ref和out修饰的参数作用:将参数传递类型转由值类型转换为引用类型,这是所传递的参数就有参数的副本变为参数的地址;
    1. 由于ref和out同属按引用传递,所以不能通过ref和out的不同的实现重载。即不能定义两个完全一样的方法,仅有参数是ref和out的不同。
    2. 不适用ref或者out修饰的参数,不一定就是值传递。如数组、集合都是引用类型,故不必使用ref修饰,也是按引用传递的。
     
    第一种参数无ref修饰;
     
    public static void swap(int m,int n)//参数无ref修饰
    {
            int i=m;
            m=n;
            n=i;
    }
    static void main(string []args)
    {        
            int m=2;
            int n=3;
            swap(m,n);
            console.WriteLine("m="+m.Tostring,"n="+n.Tostring);//m=2,n=3此时只是将m.n的值复制一份传递给swap方法,交换的是他们的副本;
    }
     
    第二种参数有ref修饰;注意:形式参数和实际参数前都必须有ref修饰。
     
    public static void swap(ref int m,ref int n)//参数ref修饰
    {
            int i=m;
            m=n;
            n=i;
    }
    static void main(string []args)
    {        
            int i=2;
            int j=3;//必须要赋值,这样它才会在内存中有地址;
            swap(ref i,ref j);
            console.WriteLine("i="+i.Tostring,"j="+j.Tostring);//i=3,j=2此时只是将i.j的地址传递给swap方法,交换的是他们的地址,所有数值做相应的改变;
    }
    这次之所以成功是因为ref的贡献。参数按引用类型传递,则i和m,j和n共享一块内存空间。在swap方法内部对m,n的值进行了修改,即相当于对i和j的值进行了修改,并且当swap方法内部对m,n的值进行了修改,即相当于对i和j进行了修改,并且当swap方法执行完毕时,该变化仍能维持,即顺利地完成了数值的交换。 
     
    如果参数类型是数组,则不需要加ref,就可以实现交换,因为数组本来就是引用类型;
     
    out让函数可以输出多个值
    public bool Login(string Account,string Pwd,out Msg)
    {
            bool flag=true;
            if(Account=="admin")
            {
                   if(Pwd=="pwd")
                    {
                        Msg="登陆成功";
                    } 
                    else
                    {
                        Msg="密码错误";
                        flag=flase;
                    }
            }
            else
            {
                Msg="账号错误";
                flag=false;
            }
            return flag;
    }
    static void main(string  []args)
    {
            string Msg;//获取返回来的信息内容,不需要赋值;
            bool flag=Login(admin,pwd,out Msg);
    }
    • out修饰的参数,不要求传递前赋初值(其实赋了也没有用),凡是用out修饰的参数,在方法内部都认为没有赋初值。
    • out修饰的参数,需要强制在方法内部给它赋值以便将该值带到外面,而ref修饰的参数则无此限制。
    • out修饰的参数,其典型的应用如用于返回多个值,例如方法int.TryParse(参数1,out参数2),参数2即为out修饰,用于将转换的结果带到方法外面。整个方法的返回值为bool,表明是否转换成功,该函数可以用于判断用户输入的是否为整型数值。

    2.static修饰符


    3.访问修饰符

    密封类:更高效,不可以被继承,密封类和密封方法,在方法和类前声明为sealed。对于类来说,这表示不能继承该类;对于方法来说,这表示不能重写这个方法。
     
    类成员默认修饰符为:private ;类默认访问修饰符为:internal,只在同一个程序集内可以访问
     
     
     

     可参考:https://msdn.microsoft.com/zh-cn/library/6tcf2h8w.aspx

        http://zhidao.baidu.com/link?url=-GZznRq_1QigvLgfpUxzsVIQxI8xJeFngfFceHOko9Pa-cpcouII6jgPRR8F1-vrTTQ7rCJdz0p5UeuE3lMxP_

        http://www.cnblogs.com/Athrun/archive/2007/11/16/961137.html

  • 相关阅读:
    线段的平移和旋转
    《构建之法》第一章读书笔记
    课程大作业总结
    2016.1.8
    2016.1.7
    2016.1.6总结
    初学MFC
    实时控制软件第三次编程作业
    实时控制软件设计第二次编程作业
    实时控制软件设计第一次编程作业
  • 原文地址:https://www.cnblogs.com/jaysen/p/4410185.html
Copyright © 2011-2022 走看看