C#学习笔记 引用参数

引用参数

  • 引用形参是用 ref 修饰符声明的形参。与值形参不同,引用形参并不创建新的存储位置。相反,引用形参表示的存储位置恰是在方法调用中作为实参给出的那个变量所表示的存储位置。
  • 当形参为引用形参时,方法调用中的对应实参必须由关键字 ref 并后接一个与形参类型相同的 variable-reference组成。变量在可以作为引用形参传递之前,必须先明确赋值。
  • 在方法内部,引用形参始终被认为是明确赋值的。
  • 声明为迭代器的方法不能有引用形参。
值类型

值类型

    class Program
    {
        static void Main(string[] args)
        {
            int y = 1;
            IWantSideEffect(ref y);
            Console.WriteLine(y);   //输出为101
            //方法的参数(x)指向的内存地址,和方法外部的变量(y)指向的内存地址,是同一个地址。
            //当在方法内部改变了地址上的值时(x=x+100),方法外部的变量所指向内存地址的值就已经改变了。
            //此时通过外部变量去访问内存地址中的值时,拿到的就是更新之后的值。
        }
        static void IWantSideEffect(ref int x)
        {
            x = x + 100;
        }
    }
引用类型

引用类型

    class Program
    {
        static void Main(string[] args)
        {
            Student outterstu = new Student() { Name = "Tim" };
            Console.WriteLine("HashCode={0},Name={1}", outterstu.GetHashCode(), outterstu.Name);
            //方法外部的变量当前引用的对象的HashCode和Name属性的值
            Console.WriteLine("--------------------------------");
            IWantSideEffect(ref outterstu);
            //方法体里打印出来的HashCode和Name属性的值
            Console.WriteLine("HashCode={0},Name={1}", outterstu.GetHashCode(), outterstu.Name);
            //再次打印方法外部的变量的HashCode和Name属性的值
            //参数和方法外部这个变量所引用的对象,他们是同一个对象,而且是方法体内部创建的新的对象。
        }
        static void IWantSideEffect(ref Student stu)//引用类型的引用参数
        {
            stu = new Student() { Name = "Tom" };
            Console.WriteLine("HashCode={0},Name={1}",stu.GetHashCode(),stu.Name);
        }
    }
    class Student
    {
        public string Name { get; set; }
    }

引用类型

    class Program
    {
        static void Main(string[] args)
        {
            Student outterStu = new Student() { Name = "Tim" };
            Console.WriteLine("HashCode={0},Name={1}", outterStu.GetHashCode(), outterStu.Name);
            Console.WriteLine("--------------------------------------");
            SomeSideEffect(ref outterStu);
            Console.WriteLine("HashCode={0},Name={1}", outterStu.GetHashCode(), outterStu.Name);
            //SomeSideEffect中的参数stu和变量outterStu,他们所指向的内存地址是同一个内存地址,
            //而这个内存地址所存储的,就是对象在堆内存中的地址。
        }
        static void SomeSideEffect(ref Student stu)
        {
            stu.Name = "Tom";
            Console.WriteLine("HashCode={0},Name={1}",stu.GetHashCode(),stu.Name);
        }
    }
    class Student
    {
        public string Name { get; set; }
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值