• .net 方法引用的问题


    之前知道,值类型作为方法参数的时候,方法会创建值类型的副本,在方法内改变值,不会影响方法外的变量,除非返回改变值,或用ref,out关键字。

    但引用类型在工作中写方法的时候一般也是默认用值类型的方式写。

    比如有个Person类。

    1 public class Person{
    2     public string Name;
    3     public int Age;
    4     public override string ToString(){
    5         return string.Format(" Name = {0} , Age = {1}",this.Name,this.Age);
    6     }
    7 }

    要改变里面的内容,原来都是这样写

    1 public Person OldChange(Person p){
    2     p.Name = "newChange";
    3     p.Age = "123";
    4     return p;
    5 }

    然后在主函数的时候会写成这样

    1 void Main()
    2 {
    3     Person p = new Person();
    4     p = OldChange(p);
    5     Console.WriteLine(p.ToString());
    6 }

     运行结果

    1  Name = newChange , Age = 123

    看起来没什么问题,可真的要有返回值吗,引用类型不本身就是引用吗,直接改就完了。

    试试下面的方法

    1 public void Change(Person p ){
    2     p.Name = "Change Without Return";
    3     p.Age = 5;
    4 }

    调用的时候就不要赋值了直接显示

    1 void Main()
    2 {
    3     Person p = new Person();
    4     Change(p);
    5     Console.WriteLine(p.ToString());
    6 }

    运行结果

    1 Name = Change Without Return , Age = 5

    同样没什么问题,看来可以省一步赋值了

    如果真的可以直接在方法里改变引用类型的值,那么重新赋值给这个引用,值会不会改呢。

    写个新方法

    1 public void SetNewPerson(Person p ){ 
    2     p = new Person();
    3     p.Name = "created by method";
    4     p.Age = 99;
    5 }

    在方法里直接写个新的实例化类,并将参数指像这个新的实例,主程序同上一个差不多

    1 void Main()
    2 {
    3     Person p = new Person();
    4     SetNewPerson(p);
    5     Console.WriteLine(p.ToString());
    6 }

    运行结果

    1  Name =  , Age = 0

    看来,并没有传递到。

    也就是说,方法在引用类型上,复制的是引用类型的引用,方法参数和函数外的变量同时指像一个对象。

    方法中改变的是复制后的引用,方法外部并没有改变指像,所以会产生这种状况。

  • 相关阅读:
    c/c++中两颗璀璨的明珠
    deepin软件中心打不开
    shell之rm -rf的别名设置
    历史命令脚本
    mysql之7xtrabackup
    python之3内置容器
    python之第一个例子hello world
    python之安装
    shell脚本练习(autocert)
    【转】nginx之逻辑运算
  • 原文地址:https://www.cnblogs.com/stupidanimal/p/8689896.html
Copyright © 2020-2023  润新知