zoukankan      html  css  js  c++  java
  • 再谈值类型和引用类型

    从概念上说
    值类型就是变量包含的是具体的值
    引用类型就是变量包含的是对具体值得引用,就是指针啦。
    我们通过代码来演示

     1   public class Space
     2    {
     3
     4        public static void Main(string[] args)
     5        {
     6
     7
     8            int i = 10;
     9            int j = i;
    10            System.Console.WriteLine(i.Equals(j));//true
    11            System.Console.WriteLine(object.ReferenceEquals(i,j));//false
    12
    13
    14            Order order1 = new Order("123");
    15            Order order2 = order1;
    16            System.Console.WriteLine(order1.Equals(order2));//true
    17            System.Console.WriteLine(object.ReferenceEquals(order1,order2));//true
    18            System.Console.WriteLine(order2.Number);
    19
    20
    21            j = 15;
    22            System.Console.WriteLine(i);//i依然是10
    23
    24            order2.Number = "999";
    25            System.Console.WriteLine(order1.Number);//结果是999
    26
    27        }

    28    }

    29
    30
    31    public class Order
    32    {
    33        public Order(string number)
    34        {
    35            Number = number;
    36        }

    37        public string Number;
    38    
    39    }

    40

    仔细看看上面的代码

    int类型是值类型,因此第9行是把i的值赋给了j,第11行检查i和j的地址,得到的结果是i和j的地址是不一样的。

    Order是类,类是引用类型。第15行是把order1的地址赋给了order2,所以这时候order1和order2的引用地址是一样的。

    由于i和j的地址是不一样的,所以第21行修改了j的值,i的值是不受影响的。

    由于order1和order2的引用地址是一样的,所以24行修改了order2的值,其实也就是改了order1的值。

    不过呢,凡事有例外,比如string。

    string虽然是引用类型,不过string有固化的特征,就是说string不能被改变,所有改变string的现象其实是产生了一个新的string。为什么?答案其实很简单,string是char[]的表现形式,数组是连续分配的固定空间,数组的长度并不可以被改变,因此推导:string是固化的。

    以下代码请好好琢磨:
    1            string s1 = "hello";
    2            string s2 = s1;
    3            System.Console.WriteLine(s1.Equals(s2));//true
    4            System.Console.WriteLine(object.ReferenceEquals(s1, s2));//true
    5
    6
    7            s2 = "C#";
    8            System.Console.WriteLine(s1.Equals(s2));//false
    9            System.Console.WriteLine(object.ReferenceEquals(s1, s2));//false


  • 相关阅读:
    [Linux] Ubuntu Server18 python3.7 虚拟环境
    [Linux] 树莓派编译python3.7.4
    [Linux] TMUX Python版本设置
    Linux 批量杀进程的命令
    arm树莓派Raspbian 下安装selenium+chrome
    树莓派Raspbian系统密码
    mac 终端查看端口命令
    selenium firefox 内存 速度优化
    [Linux] tmux 终端复用命令行工具
    通过 ssh 登录到手机 Termux
  • 原文地址:https://www.cnblogs.com/shyleoking/p/645245.html
Copyright © 2011-2022 走看看