值类型与引用类型的区别
一、概念讲解:
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将被垃圾回收利用。
以上是我对值类型与引用类型的理解,希望可以给需要的朋友带来帮助。
推荐阅读
-
详解duck typing鸭子类型程序设计与Python的实现示例
-
Python中实现字符串类型与字典类型相互转换的方法
-
学习TypeScript,笔记一:TypeScript的简介与数据类型
-
MySQL数据库中CAST与CONVERT函数实现类型转换的讲解
-
SQL2005中char nchar varchar nvarchar数据类型的区别和使用环境讲解
-
ASP.NET中的参数与特殊类型和特性
-
js最实用string(字符串)类型的使用及截取与拼接详解
-
c++ 模板类,方法返回值类型是typedef出来的,或者是auto,那么此方法在类外面如何定义?
-
java包装类和值类型的关系
-
C# 中的值类型和引用类型