值型別與引用型別的區別
一、概念講解:
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將被垃圾回收利用。
以上是我對值型別與引用型別的理解,希望可以給需要的朋友帶來幫助。
給自己留了後路相當於是勸自己不要全力以赴。
相關文章
- 值型別與引用型別型別
- Python引用型別和值型別的區別與使用Python型別
- C#的型別——值型別與引用型別C#型別
- JavaScript - 基本型別與引用型別值JavaScript型別
- JAVA 基本型別與 引用型別區別Java型別
- 值型別和引用型別型別
- 從賦值看基本型別和引用型別的區別賦值型別
- 區別值型別資料和引用型別資料型別
- Swift 中的值型別與引用型別使用指北Swift型別
- JavaScript值型別和引用型別JavaScript型別
- c#:值型別&引用型別C#型別
- Swift值型別和引用型別Swift型別
- javascript原始值和引用值型別及區別JavaScript型別
- Golang的值型別和引用型別的範圍、儲存區域、區別Golang型別
- golang中 值型別,指標,引用的區別Golang型別指標
- js基本型別和引用型別區別JS型別
- c#中值型別和引用型別的區別C#型別
- ECMAScript 原始型別與引用型別型別
- Structs vs classes(值型別vs引用型別)Struct型別
- 【C#之值型別vs引用型別】C#型別
- C#變數型別(1):引用型別和值型別 (轉)變數型別
- 33 個 JavaScript 核心概念系列(二): 值型別與引用型別JavaScript型別
- C#學習筆記之值型別與引用型別C#筆記型別
- C# 物件比較(值型別、引用型別)C#物件型別
- 基本資料型別和引用型別的初始值資料型別
- JS基本型別與引用型別知多少JS型別
- Swift-Optional Binding引發的值型別與引用型別的思考Swift型別
- C# 泛型 引用型別約束 值型別約束C#泛型型別
- JavaScript 基本資料型別和引用型別的區別詳解JavaScript資料型別
- JavaScript引用型別-Object型別JavaScript型別Object
- 基本資料型別與API引用型別的使用資料型別API
- JavaScript 值型別和引用型別在堆疊中的存放JavaScript型別
- Java的基本型別和引用型別Java型別
- javascript基本型別 引用型別 基本包裝型別JavaScript型別
- 引用型別型別
- 圖解C#的值型別,引用型別,棧,堆,ref,out圖解C#型別
- Java引用型別與WeakHashMapJava型別HashMap
- MIME郵件的multipart型別與text型別的區別型別