• C#——传值参数(2)


    这次与大家共同学习C#中的 值参数——引用类型

    上篇文章我与大家共同学习了 值参数——值类型

    我们知道:1.值参数创建变量的副本 2.对值参数的改变不会影响变量的值

    这次来看 值参数——引用类型,创建新对象

    看一个例子:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace ParametersSimple
     8 {
     9     class Program
    10     {
    11         static void Main(string[] args)
    12         {
    13             Student stu = new Student() { Name = "Tom" };
    14             Method(stu);
    15             Console.WriteLine(stu.Name);
    16         }
    17 
    18         //创建一个叫Method的静态方法传进来的参数是Student类型的参数
    19         //方法内我们创建一个实例并由stu这个参数引用着,新创建的实例名字叫“Mark”
    20         static void Method(Student stu)
    21         {
    22             stu = new Student() { Name = "Mark" };
    23             Console.WriteLine(stu.Name);
    24         }
    25     }
    26 
    27     class Student
    28     {
    29         public string  Name { get; set; }
    30     }
    31 }

    程序运行后,窗口内上下两行分别显示:

    ----------------------------------------------

    Mark

    Tom

    -----------------------------------------------

    大家可以自行编译一下。

    解释:

    引用类型存储的是实例的地址

    方法外的变量stu存储了对象的地址,传入方法里的值也便是对象的地址,还记着吗:值参数创建变量的副本 此时方法内的副本也存储了这个对象的地址

    我们调用方法后,改变了副本里的值,也便就是改变了副本里之前存的地址,换成了一个新地址,那么自然而然的它指向了一个新对象 还记着吗:对值参数的改变不会影响变量的值

    所以 方法外的变量依旧指向原来的那个对象,而更改后的副本指向了一个新对象,它们互不影响。

     

    这个例子有个坏处,那就是我把方法内和方法外的stu的对象的名字都改成一样的,程序运行完后屏幕上打印出两个相同的名字,那么就无法分辨了。

    所以我们要改进!

    GetHashCode() 方法
    每个对象的HashCode是不一样的
    所以:
     1 namespace ParametersSimple
     2 {
     3     class Program
     4     {
     5         static void Main(string[] args)
     6         {
     7             Student stu = new Student() { Name = "Tom" };
     8             Method(stu);
     9             Console.WriteLine("{0},{1}", stu.GetHashCode(), stu.Name);
    10         }
    11 
    12         13         
    14         static void Method(Student stu)
    15         {
    16             stu = new Student() { Name = "Tom" };//我把这里的名字改的和方法外的一样了
    17             Console.WriteLine("{0},{1}",stu.GetHashCode(),stu.Name);
    18         }
    19     }
    20 
    21     class Student
    22     {
    23         public string  Name { get; set; }
    24     }
    25 }

    运行结果

    注意到了吗,名字前面的数值不一样,说明他们分别指向了不同的对象,方法内的副本指向了一个新的对象

    ------------------------------------------------------------------------------------------------------------------------

    To be Continued!

    下篇与大家一起学习  传值参数--引用类型,不创建新对象,只操作对象

     -----------------------------------------------------------------------------------------------------------------------

    希望广大网友指出问题所在,指出我哪里理解错了,共同交流,共同进步!

  • 相关阅读:
    报表设计--主格设置-手工设置-示例
    报表设计--分组报表-分组小计
    报表设计--单元格公式-设置实例
    报表设计--自由报表-自由扩展
    报表设计--交叉报表-多层交叉-实例
    报表设计--交叉报表-多层交叉
    报表设计--分组报表-多层分组-数据汇总
    报表设计--分组报表-多层分组-横向扩展
    报表设计--分组报表-多层分组-纵向扩展
    报表设计--分组报表-普通分组-横向扩展
  • 原文地址:https://www.cnblogs.com/GeekDragon/p/6241521.html
Copyright © 2020-2023  润新知