c#中ref,out与new修饰符

本文详细解释了C#中ref和out参数的区别,以及new关键字在创建对象和方法覆盖中的应用,展示了如何在派生类中重写基类方法并保持原有功能。
摘要由CSDN通过智能技术生成

1.out与ref

1.用途

        在c#中当一个方法需要返回多个值的时候,就需要用到ref与out

2.相同点

        1.都是址传递,执行方法后,原来的值会改变

        2.都能返回多个值

3.不同点

        1.使用ref时,传入参数必须要初始化,不能为空的引用,而使用out时参数可以不初始化

        2.ref的参数可以不赋值,但是out参数必须要赋值,out进入函数时会清空自己,必须在函数内部赋初值

ref有进有出,out只出不进

//ref的使用
class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            int b = 5;
            int b = 10;
            //以下a与b未初始化,编译失败
            //int a;
            //int b;
            p.GetNum(ref a, ref  b);
            Console.WriteLine("a={0},b={1}", a, b);
        }
 
        public void GetNum(ref int a, ref int b)
        {
            a = 500;
            b = 1000;
        }
    }

    //输出结果为a=500,b=1000
//out的使用
class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            int a=5;
            int b=10;
            p.Swap(out a, out b);
            Console.WriteLine("a={0},b={1}", a, b);
        }
 
        public void Swap(out int a,out  int b)
        {
            a=500;
            b=1000;
            int temp = a;
            a = b;
            b = temp;
        }
        
        //以下函数体内a与b未赋值,编译出错
        //public void Swap1(out int a,out  int b)
        //{
        //    int temp = a;
        //    a = b;
        //    b = temp;
        //}       
    }

    //输出结果a=1000,b=500

2.new的作用

1.创建对象

2.在派生类中使用new关键字,修饰定义与基类中同名的函数,叫覆盖,覆盖不会改变基类的方法功能

    class A
    {
        public virtual void Test1()
        {
            Console.WriteLine("A类的测试函数1");
        }
        public virtual void Test2()
        {
            Console.WriteLine("A类的测试函数2");
        }
    }
    class B : A
    {
        //当用子类创建父类的实例时,A a1 = new B();调用子类的函数
        //override声明不能更改virtual方法的可访问性,且override方法与virtual方法必须具有相同级别访问修饰符
        public override void Test1() 
        {
            Console.WriteLine("B类的测试函数1");
        }
        //当用子类创建父类的实例时,A a2 = new B();
        //覆盖是不会改变父类的功能,仍然调用父类的函数
        public new void Test2()
        {
            Console.WriteLine("B类的测试函数2");
        }
    }

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值