標籤:style blog http 使用 sp 資料 on 2014 問題
技能掌握目標:
1.理解結構
2.理解裝箱和拆箱
3.理解實值型別和參考型別的概念
4.理解實值型別和參考型別作為方法參數的區別
5.會使用實值型別和參考型別作為方法參數解決問題
實值型別和參考型別:
1.實值型別和引用實值型別
實值型別源於System.ValueType家族,每個實值型別的對象都有一個獨立的記憶體地區用於儲存自己的值,實值型別資料所在的記憶體地區成為棧(Stack)。只要在代碼中修改它,就會在它的記憶體地區內儲存這個值。實值型別包括基礎資料型別 (Elementary Data Type)(如 int float double)、枚舉類型和結構類型
引用實值型別源於System.Object家族,在C#中引用實值型別主要包括數組、類和介面等。
接下來是一個小的Example:
題目:已知小明和小紅去年的身高是170cm,而今年小明長高了50cm,小紅沒有變
但是如果我用數組的話結果就是另說了~
它的運行結果就是:
哎?為什麼我的賦值沒有錯誤,但是為什麼會兩個的值都變了呢?
那是因為參考型別和實值型別的原因,參考型別和實值型別的記憶體變化不一樣,所以導致了兩種結果的變化,接下來我為大家介紹一下參考型別和實值型別在記憶體中的變化
我們先講實值型別
首先系統為變數I分配了一段儲存空間,
然後程式將I的值賦給了J系統為變數J分配了一段儲存空間,
最後 J 的值變成180,此時變數J對應的儲存空間將發生變化:
接下來我們講引用實值型別的記憶體運作,在講引用實值型別的時候我們用到了堆和棧,在這之後我會給大家單獨開一個部落格在解釋堆和棧。
我們用的引用實值型別是數組我們來跟著代碼看著草圖來理解:
Int[] nameMingAge = { 19 };
int[] nameHongAge = nameMingAge;
Console.WriteLine("去年小紅的年齡是:{0}\t小明的年齡是:{1}", nameHongAge[0], nameMingAge[0]);
nameHongAge[0] = 20;
Console.WriteLine("今年小紅的年齡是:{0}\t小明的年齡是:{1}", nameHongAge[0], nameMingAge[0]);
Console.ReadLine();
引用實值型別和實值型別的資料類型分類圖:
值傳遞和引用值傳遞的參數(ref)
值傳遞不帶參數ref的方法和調用:
它的運行結果是:
加上值傳遞的參數 ref後的方法和調用:
它的運行結果是:
注意點:
引用傳遞:只要參數前有ref關鍵字修飾,統統稱為引用傳遞
結論:如果是值傳遞(沒有ref關鍵字),並且參數類型為實值型別,那麼結果不變
如果是值傳遞(沒有ref關鍵字),參數是參考型別,結果永久改變!@
如果是引用傳遞(ref),無論參數是實值型別還是參考型別,結果都會永久改變!!
----------------------------------------------------------------------------------------------------------------------
接下來我們講一講結構吧:
結構體
.不能為結構體中變數賦初值
.結構體中可以有方法,欄位,屬性
結構體是實值型別,而類是參考型別
對結構體中的屬性賦值的時候,可以不new出對象,直接通過變數名.屬性賦值
在什麼情境下使用結構體?
如果當前的抽象類別型中屬性量比較少的時候,我們可以考慮使用結構體
接下來讓我們看看如何使用結構:
首先寫介紹一下他的文法
存取修飾詞 struct 結構名
{
//結構體:也就是方法和屬性。
}
接下來讓我們以圖片的方式來給大家展示定義結構的過程
01.首先建立一個類叫做Student
02.把關鍵字class改成struct並且前面加上public存取修飾詞
03.在Main方法中進行調用
結構體我們就講到這裡,接下來我給大家講講裝箱和拆箱:
我們先做的就是裝箱操作
它的運行結果是:
上面的圖講述的是裝箱的方法,接下來講一下拆箱的方法:
它的運行結果是:
對於裝箱和拆箱的操作,本人認為能不要用最好就不要用,因為每次裝箱和拆箱都會損耗一定的程式效能。而且當代碼運行到Common Language Specification(CLS)的時候系統會自動給弄些需要的變數進行裝箱和拆箱操作,所以對於裝箱和拆箱的內容我就一帶而過了,這是本人的第三個部落格,如果大家認為還可以的話記得關注哦~~~~
深入C#資料類型