值类型和引用类型
要了解值类型和引用类型,我们首先要知道堆和栈的区别:
① 栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小
②存放在栈中时要管存储顺序,保持着先进后出的原则,它是一片连续的内存域,由系统自动分配和维护。
而堆是无序的,它是一片不连续的内存域由有用户自己来控制和释放,如果用户自己不释放的话,当内存达到一定的特定值时,通过垃圾回收器(GC)来回收。
-
C#的值类型包括:结构体,枚举,可空类型,byte,short,int,long,float,double,decimal,char,bool ;值类型是存储在数据栈上的;
-
C#的引用类型包括:数组,用户定义的类、接口、委托,object,字符串,引用类型存储在堆上。
-
了解了以上区别后,我们通过实例来展示下使用的区别:
-
引用类型举例:下面定义两个byte数组,交换下下标一致的数据:
代码如下:
#region 引用类型
public static void RefTest()
{
byte[] a = new byte[] { 1, 2, 3, 4, 5 };
byte[] b = new byte[] { 6, 7, 8, 9, 10 };
ChangeData(a, b);
Console.Write($"a数组的值:");
for (int i = 0; i < a.Count(); i++)
{
Console.Write($"{a[i]} ");
}
Console.WriteLine("\n ***********");
Console.Write($"b数组的值:");
for (int i = 0; i < b.Count(); i++)
{
Console.Write($"{b[i]} ");
}
}
private static void ChangeData(byte[] aaa, byte[] bbb)
{
int tempa = aaa.Count();
int tempb = bbb.Count();
int count = tempa > tempb ? tempb : tempa;
byte temp = 0;
for (int i = 0; i < count; i++)
{
temp = aaa[i];
aaa[i] = bbb[i];
bbb[i] = temp;
}
}
#endregion
输出结果:
虽然我们把byte数组传递给了方法ChangeData去处理了,但是处理完a,b的数据实现了交换,因为数组是引用类型,所以上例中aaa和a都是指向的同一段地址,所以一个aaa改变后,a数组的值对应的有改变了。
-
值类型举例
代码如下:
#region 值类型 public static void ValueTest() { int a = 5; int b = 8; ChangeValue(a, b); Console.WriteLine($"a的值:{a}"); Console.WriteLine($"b的值:{b}"); } private static void ChangeValue(int aaa, int bbb) { int temp = aaa; aaa = bbb; bbb = temp; } #endregion
运行结果:
本文来自博客园,作者:码农阿亮,转载请注明原文链接:https://www.cnblogs.com/wml-it/p/16534351.html
技术的发展日新月异,随着时间推移,无法保证本博客所有内容的正确性。如有误导,请大家见谅,欢迎评论区指正!
开源库地址,欢迎点亮:
GitHub:https://github.com/ITMingliang
Gitee: https://gitee.com/mingliang_it
GitLab: https://gitlab.com/ITMingliang
建群声明: 本着技术在于分享,方便大家交流学习的初心,特此建立【编程内功修炼交流群】,为大家答疑解惑。热烈欢迎各位爱交流学习的程序员进群,也希望进群的大佬能不吝分享自己遇到的技术问题和学习心得!进群方式:扫码关注公众号,后台回复【进群】。
![](https://images.cnblogs.com/cnblogs_com/wml-it/2196906/o_230823011905_wxgzhss.png)