欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

值类型与引用类型的区别

程序员文章站 2023-11-10 21:56:58
一、概念讲解: 1、值类型: 包括:sbyte、short、int、long、float、double、decimal(以上值类型有符号) byte、ushort、uint、ulong(以上值类型无符号) bool、char 2、引用类型: 包括:对象类型、动态类型、字符串类型 二、具体区别: 1、 ......

一、概念讲解:

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将被垃圾回收利用。

 

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