c# 中ref ,out ,params 三种修饰符的作用与区别

NO1 ref 只是一个地址。

在使用这个修饰符的时候必须要进行提前赋值(初始化),因为你不能把一个变量放到一个找不到的地址中。O(∩_∩)O~,而且必须要显示修饰这个变量。

因为在进入方法(函数中)ref 传递的变量还是它自己,所以任何修改都会反映到ref 变量中。

 

例子:(我比较懒这个例子是从网上黏贴的)


    class gump
    {
        public double square(ref double x)
        {
            x = x * x;
            return x;
        }
    }

    class TestApp
    {
        public static void Main()
        {
            gump doit = new gump();

            double a = 3;
            double b = 0;

            Console.WriteLine("Before square->a={0},b={1}", a, b);

            b = doit.square(ref a);
            Console.WriteLine("After square->a={0},b={1}", a, b);
        }
    }

NO2 out 是一个传递引用。

因为是引用,所以不必提前赋值,而且即使赋值也没有用当这个引用被声明的时候是空的!即在方法(函数)中使用的时候,out 变量会被清空。也就成了一个没人住的房子的门牌号了。不过不能用out 变量给out 变量赋值。而且因为.net不接受只有地址没有值的参数,out 变量是必须被赋值的。

例子:(同上)

    class gump
    {
        public void math_routines(double x, out double half, out double squared, out double cubed)
        //可以是:public void math_routines(//ref double x,out double half,out double squared,out double cubed)
        //但是,不可以这样:public void math_routines(out double x,out double half,out double squared,out double cubed),对本例来说,因为输出的值要靠x赋值,所以x不能再为输出值
        {
            half = x / 2;
            squared = x * x;
            cubed = x * x * x;
        }
    }

    class TestApp
    {
        public static void Main()
        {
            gump doit = new gump();

            double x1 = 600;
            double half1 = 0;
            double squared1 = 0;
            double cubed1 = 0;

            /*
             double x1=600;
             double half1;
             double squared1;
             double cubed1;
            */

            Console.WriteLine("Before method->x1={0}", x1);
            Console.WriteLine("half1={0}", half1);
            Console.WriteLine("squared1={0}", squared1);
            Console.WriteLine("cubed1={0}", cubed1);

            doit.math_rountines(x1, out half1, out squared1, out cubed1);

            Console.WriteLine("After method->x1={0}", x1);
            Console.WriteLine("half1={0}", half1);
            Console.WriteLine("squared1={0}", squared1);
            Console.WriteLine("cubed1={0}", cubed1);
        }

 

ref out 总结:ref侧重修改.out侧重输出,即使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。 out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。

还有就是 ref ,out  不能同时重载一个方法。

 

NO3 params 键字在方法成员的参数列表中使用,为该方法提供了参数个数可变的能力它在只能出现一次并且不能在其后再有参数定义,之前可以。

例子:

class App
    {
        //第一个参数必须是整型,但后面的参数个数是可变的。
        //而且由于定的是object数组,所有的数据类型都可以做为参数传入
        public static void UseParams(int id, params object[] list)
        {
            Console.WriteLine(id);
            for (int i = 0; i < list.Length; i++)
            {
                Console.WriteLine(list[i]);
            }
        }

        static void Main()
        {
            //可变参数部分传入了三个参数,都是字符串类型
            UseParams(1, "a", "b", "c");
            //可变参数部分传入了四个参数,分别为字符串、整数、浮点数和双精度浮点数数组
            UseParams(2, "d", 100, 33.33, new double[] { 1.1, 2.2 });

            Console.ReadLine();
        }
    }

今天就写这么多吧!因为本人现在就理解到这个水平,O(∩_∩)O~!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值