zoukankan      html  css  js  c++  java
  • c#数据类型的值传递和引用传递--基础拾遗

    竟然一不小心犯了低级错误,数据类型的值类型和引用类型弄混了。

    想用list记录下所有的二维数组值,结果发现list里所有的值都是一样的。

    值类型和引用类型:

    C#数据类型分为两大类:值类型和引用类型。

    值类型数据主要有:结构体struct,枚举体enum,布尔型bool,浮点型,整型。

    引用类型数据主要有:数组,字符串,接口,委托,类。

    值类型和引用类型的区别:

      引用类型继承自System.Object,值类型继承自System.ValueType。

      引用类型保存到内存的堆heap中,值类型保存在内存的堆栈stack中。在.net中,栈的内存是自动释放的,而堆会有垃圾回收器GC来释放。

      引用类型可以派生出新的类型,而值类型不可以。引用类型可以包含null值,而值类型不可以。

      引用类型变量赋值只复制对象的引用,不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。

    辨别过程

    想用list记录下所有的二维数组值,结果发现list里所有的值都是一样的。

    1.错误的使用。只new一次,所有的变量valueLst1 实际上是一个值,同一个地址。

            private void test()
            {
                List<int[]> valueLst1 = new List<int[]>();
                int[] indexAndvalue1 = new int[2];
                for (int i = 0; i < 10; i++)
                {
                    indexAndvalue1[0] = i;
                    indexAndvalue1[1] = i * 2;
                    valueLst1.Add(indexAndvalue1);
                }
            }

    valueLst1里所有值都是[9,10]。

    2正确。每次重新new

            private void test2()
            {
                List<int[]> valueLst2 = new List<int[]>();
                int[] indexAndvalue2;
                for (int i = 0; i < 10; i++)
                {
                    indexAndvalue2 = new int[2];
                    indexAndvalue2[0] = i;
                    indexAndvalue2[1] = i * 2;
                    valueLst2.Add(indexAndvalue2);
                }
            }

    valueLst1的值分别是[0,0],[1,2].......

    可参考资料:

    C# 值类型和引用类型及参数传递
    C#基础原理拾遗——引用类型的值传递和引用传递
    C# 参数传递 引用类型与值类型的值传递和引用传递
    C#中值传递和引用传递
  • 相关阅读:
    每日总结
    每日总结
    每日总结
    每日总结
    每日总结
    每日总结
    每日总结
    每日总结
    每日总结
    Windows邮件添加QQ邮箱
  • 原文地址:https://www.cnblogs.com/GISRSMAN/p/4994468.html
Copyright © 2011-2022 走看看