值类型与引用类型的区别

一、概念讲解:

1、值类型:

包括:sbyte、short、int、long、float、double、decimal(以上值类型有符号)

   byte、ushort、uint、ulong(以上值类型无符号)

   bool、char

2、引用类型:

包括:对象类型、动态类型、字符串类型

二、具体区别:

1、值类型:

byte b1 = 1;
byte b2 = b1;
Console.WriteLine("{0},{1}。", b1, b2);
b2 = 2;
Console.WriteLine("{0},{1}。", b1, b2);
Console.ReadKey();

解释:

byte b1 = 1;声明b1时,在栈内开辟一个内存空间保存b1的值1。

byte b2 = b1;声明b2时,在栈内开辟一个内存空间保存b1赋给b2的值1。

Console.WriteLine("{0},{1}。", b1, b2);输出结果为1,1。

b2 = 2;将b2在栈中保存的值1改为2。

Console.WriteLine("{0},{1}。", b1, b2);输出结果为1,2。

2、引用类型:

string[] str1 = new string[] { "a", "b", "c" };
string[] str2 = str1;
for (int i = 0; i < str1.Length; i++)
{
    Console.Write(str1[i] + " ");
}
Console.WriteLine();
for (int i = 0; i < str2.Length; i++)
{
    Console.Write(str2[i] + " ");
}
Console.WriteLine();
str2[2] = "d";
for (int i = 0; i < str1.Length; i++)
{
    Console.Write(str1[i] + " ");
}
Console.WriteLine();
for (int i = 0; i < str2.Length; i++)
{
    Console.Write(str2[i] + " ");
}
Console.ReadKey();

解释:

string[] str1 = new string[] { "a", "b", "c" };声明str1时,首先在堆中开辟一个内存空间保存str1的值(假设:0a001),然后在栈中开辟一个内存空间保存0a001地址

string[] str2 = str1;声明str2时,在栈中开辟一个内存空间保存str1赋给str2的地址

for (int i = 0; i < str1.Length; i++)

{

  Console.Write(str1[i] + " ");

}

Console.WriteLine();

for (int i = 0; i < str2.Length; i++)

{

  Console.Write(str2[i] + " ");

}

Console.WriteLine();

输出结果为:

a b c

a b c

str2[2] = "d";修改值是修改0a001的值

for (int i = 0; i < str1.Length; i++)

{

  Console.Write(str1[i] + " ");

}

Console.WriteLine();

for (int i = 0; i < str2.Length; i++)

{

  Console.Write(str2[i] + " ");

}

输出结果为:

a b d

a b d

3、string类型:(特殊)

string str1 = "abc";
string str2 = str1;
Console.WriteLine("{0},{1}。", str1, str2);
str2 = "abd";
Console.WriteLine("{0},{1}。", str1, str2);
Console.ReadKey();

解释:

string str1 = "abc";声明str1时,首先在堆中开辟一个内存空间保存str1的值(假设:0a001),然后在栈中开辟一个内存空间保存0a001地址

string str2 = str1;声明str2时,首先在堆中开辟一个内存空间保存str1赋给str2的值(假设:0a002),然后在栈中开辟一个内存空间保存0a002的地址

Console.WriteLine("{0},{1}。", str1, str2);输出结果为:
abc
abc

str2 = "abd";修改str2时,在堆中开辟一个内存空间保存修改后的值(假设:0a003),然后在栈中修改str2地址为0a003地址

Console.WriteLine("{0},{1}。", str1, str2);输出结果为:
abc
abd

堆中内存空间0a002将被垃圾回收利用。

以上是我对值类型与引用类型的理解,希望可以给需要的朋友带来帮助。

(0)

相关推荐

  • C#socket编程

    我们做网络通信的时候需要有通信协议,在进行socket编程的时候有两种通信协议TCP.UDP,这次我们就用简单的方式在一台电脑建立TCP协议的服务器端和客户端并使之进行通信. 服务器端和客户端进行连接 ...

  • c#Socket通信实例

    在上一篇文章中介绍了Socket基础-TCP与UDP协议和他们之间的区别,这篇文章参考另一位前辈的博文重点记录下Socket的原理及两种协议的开发过程. 一.Socket通信简介 1.按惯例先来介绍下 ...

  • 值类型和引用类型

    一.概念 值类型:直接存储值,在栈上存储其值 注:值类型变量声明后,不管是否已经赋值,编译器为其分配内存 引用类型:存储对其值的引用,在栈上存储地址,在堆上存储值 注:引用类型当声明一个类时,只在栈中 ...

  • Golang值类型和引用类型

    Go语言数据的使用可以分为值类型和引用类型 值类型包括 : 所有整型,所有浮点型,bool型,string型,数组和struct类型 值类型的特点是变量直接存储值,内存通常在 栈(stack) 中分配 ...

  • C#值类型与引用类型

    概要: C#中将数据类型分为值类型(value type)和引用类型(reference type) 值类型: 值类型变量直接包含其本身的数据.在定义一个值类型变量后,将直接为该变量分配空间,可以直接 ...

  • 中国新石器时代考古文化大盘点—分清文化类型与遗址的区别和联系

    中国历史重大事件第二篇:中国新石器时代主要考古文化大盘点--探寻早期中国文明,分清文化类型与遗址的区别和联系 中国早期考古学文化一览表 原始社会又叫史前社会,由于缺乏文字记载,我们对该时期的研究主要基 ...

  • ASP.NET Core中的Action的返回值类型

    在Asp.net Core之前所有的Action返回值都是ActionResult,Json(),File()等方法返回的都是ActionResult的子类.并且Core把MVC跟WebApi合并之后 ...

  • 初中数学——最值问题1. 垂线段最值类型...

    初中数学——最值问题1. 垂线段最值类型...

  • 初中数学常见十二几何最值类型

    初中数学常见十二几何最值类型

  • 蔷薇好,还是月季好?分清栽种方式,2种类型,栽种有区别

    蔷薇好,还是月季好?分清栽种方式,2种类型,栽种有区别 春季养花,想要养几棵月季,听商家说蔷薇也很不错,一下子就纠结了,这两种植物有区别吗?应该怎么去区分呢?月季跟蔷薇这两种花哪一种更好养呢? 月季花 ...

  • 实值、平值、虚值期权存在着哪些区别?

    期权合约的种类挺多,但是很多人不知道对于这些实值.平值.虚值期权来说,它们之间存在着哪些区别呢? 接下来我们就好好分析分析到底实值.平值.虚值期权存在着哪些区别? 1:行权价的不同直接影响的是购买合约 ...