值型別與引用型別的區別
一、概念講解:
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將被垃圾回收利用。
以上是我對值型別與引用型別的理解,希望可以給需要的朋友帶來幫助。
給自己留了後路相當於是勸自己不要全力以赴。
相關文章
- JavaScript - 基本型別與引用型別值JavaScript型別
- 值型別和引用型別型別
- 從賦值看基本型別和引用型別的區別賦值型別
- 區別值型別資料和引用型別資料型別
- JavaScript值型別和引用型別JavaScript型別
- c#:值型別&引用型別C#型別
- javascript原始值和引用值型別及區別JavaScript型別
- Golang的值型別和引用型別的範圍、儲存區域、區別Golang型別
- golang中 值型別,指標,引用的區別Golang型別指標
- js基本型別和引用型別區別JS型別
- c#中值型別和引用型別的區別C#型別
- ECMAScript 原始型別與引用型別型別
- C#學習筆記之值型別與引用型別C#筆記型別
- 33 個 JavaScript 核心概念系列(二): 值型別與引用型別JavaScript型別
- Swift-Optional Binding引發的值型別與引用型別的思考Swift型別
- JavaScript引用型別-Object型別JavaScript型別Object
- 基本資料型別與API引用型別的使用資料型別API
- Java的基本型別和引用型別Java型別
- Java引用型別與WeakHashMapJava型別HashMap
- C#程式設計引用型別和值型別 以及引用傳遞和值傳遞C#程式設計型別
- Java中的基本資料型別與引用資料型別Java資料型別
- C#引用型別和值型別在堆、棧中的儲存C#型別
- Go 的引用型別Go型別
- js引用型別JS型別
- javascript:引用型別JavaScript型別
- Go: 指標方法與值方法<->指標型別與值型別Go指標型別
- JS篇-基本型別和引用型別、typeofJS型別
- JS開發者應懂的33個概念系列2&&3--原始型別 && 值型別和引用型別JS型別
- 問題分享:Js引用型別賦值JS型別賦值
- Golang 引用型別-mapGolang型別
- 引用型別之Object型別Object
- js資料型別之基本資料型別和引用資料型別JS資料型別
- JavaSE 形參和返回值(引用型別)Java型別
- 基本資料型別與引用資料型別,及記憶體分配資料型別記憶體
- 好程式設計師web前端教程分享引用型別與基本型別程式設計師Web前端型別
- Gradle 使用技巧(三) - dependencies 的型別與區別Gradle型別
- 引用型別的深拷貝型別
- js基本語法之 值型別(資料型別)(變數型別)JS資料型別變數