型別的劃分##
一個型別,要么是值型別,要么是參考型別,區別在于拷貝方式:值型別拷貝值,參考型別拷貝參考
值型別###
值型別直接包含值,相當于每一個值型別都有自己單獨的值:
int a = 10;
int b = a;
a和b都有著自己的值,修改a并不會影響b,反過來一樣,互不影響,
即使是將實體傳給Console.WriteLine()這樣的方法也會產生記憶體拷貝,由于值記憶體需要創建記憶體拷貝,因此定義的時候不要讓它們占用太多記憶體,
參考型別###
參考型別的變數存盤對資料存盤位置的參考,而不是直接存盤資料,也就是說,要到對應的位置才能找到真正的資料,因此為了訪問資料,“運行時”要先從變數中讀取記憶體位置,再“跳轉”到包含資料的記憶體位置,參考型別指向的記憶體區為成為堆,
正如前面所說,參考型別拷貝參考,它不包含值,每次參考變數的賦值都是參考的拷貝,并不需要拷貝資料,
值得注意的一點,參考型別只復制對資料的參考,所以兩個不同的變數可參考相同的資料,在這種情況下,只要資料發生了改變,就會影響到所參考到他的變數的值,畢竟都是參考同一個資料,
可空修飾符##
我之前提到過null值,它是給參考變數表示為空的值,一般不能將它賦值給值型別,根據定義,值型別不能包含參考,但是有的時候我們的確又有這一方面的需求,所以為了宣告能存盤null變數,要使用可空修飾符"?",示例:
int? cnt = null;
隱式型別的區域變數##
關鍵字:var,用于宣告隱式型別的區域變數,示例:
var text = Console.WriteLine();
這么做最終的CIL代碼并沒有區別,但var告訴編譯器根據宣告時所賦的值來推斷資料型別,
雖然允許用var取代像是資料型別,但是在已知資料型別的情況下還是不要這么做,明確的宣告資料型別不僅能夠增加可讀性,還相當于親自確認了等號右邊回傳的是你所需要的資料型別,
匿名型別能夠在方法內部動態宣告資料型別,并不需要通過顯式的類定義來宣告,示例:
var people1 = new { Name = "Van", Say = "啊?" };
var people2 = new { Name = "Bili", Say = "乖乖站好" };
System.Console.WriteLine( $"{people1.Name} {people1.Say}");
System.Console.WriteLine( $"{people2.Name} {people2.Say}");
元組##
有時候需要合并資料元素,元組正好可以解決這個問題,它允許在一個陳述句內完成所有變數的賦值,
以下是它的語法形式:
將元組賦給單獨宣告的變數:
(string power, string name, int weight) = ("超高校的幸運", "脖子直抖", 65);
將元組賦給預宣告的變數:
string power, name;
int weight;
(power, name, weight) = ("超高校的幸運", "脖子直抖", 65);
將元組賦給隱式型別的變數:
var (power,name,weight) = ("超高校的幸運", "脖子直抖", 65);
注意:此處以及下面包含的 var 絕不能如果替換成顯示型別(如string或int),因為元組宗旨是允許每一項都有不同的資料型別,所以每一項都指定同一個顯示型別名稱和這個宗旨沖突,即便是真的一樣,編譯器也不允許指定顯示型別,
宣告具名元組,將元組值賦給它,
(string power, string name, int weight) people = ("超高校的幸運", "脖子直抖", 65);
宣告包含具名元組項的元組,將其賦給隱式型別的變數,
var people = (power:"超高校的幸運", name:"脖子直抖", weight:65);
將元組項未具名的元組賦給隱式型別的變數,再通過向編號屬性訪問單獨的元素,
var people = ("超高校的幸運", "脖子直抖", 65);
people.Item1;//people.Item2;
若是具名元組還是可以通過專案編號屬性訪問單獨的元素,
賦值時用下劃線丟棄元組的一部分資料(棄元),
(string power, _, int weigth) people = ("超高校的幸運", "脖子直抖", 65);
陣列##
陣列能夠在單個變數中存盤同一種型別的多個資料項,并且可以通過索引來單獨訪問這些資料項,陣列的資料線索引從0開始,最大索引值總是比陣列中的資料項少1,但是現在大多數程式都使用泛型集合型別而非陣列來存盤資料集合,
陣列宣告###
陣列宣告,直接上代碼:
string[] arr1;
方括號在資料型別之后,變數名之前,
宣告二維陣列的方法,代碼:
string[,] arr2;
在用逗號進行多維陣列的宣告,總共維數等于逗號加一,
陣列的實體化和賦值###
陣列可在宣告的同時初始化,例如:
string[] arr3 = {"1","1","4","5","1","4"};
元素的下標對應就是對應元素的位置,依次排列,
也可以先宣告陣列再進行賦值,如下:
string[] arr4;
arr4 = new string[]{"1","1","4","5","1","4"};
但是從C#3.0開始就不必在new之后指定陣列型別,編譯器能根據初始化串列中的資料型別推斷陣列型別,如下:
arr4 = new []{"1","1","4","5","1","4"};
上面使用了new關鍵字,它指示“運行時”為資料庫型別分配記憶體,也就是實體化資料型別,
我們也可以給陣列分配固定大小但不提供初始化,也可以指定大小并賦值,如下:
string[] arr5 = new string[6]{"1","1","4","5","1","4"};
陣列在沒有被初始化的時候,“運行時”會給每個元素初始化為他們的默認值:
- 參考型別會被初始化為null,
- 數字型別會被初始化為0,
- bool初始化為false,
- char型別初始化為\0,
多位陣列注意不要超出對應的宣告范圍,這里不再討論,
陣列的使用###
可以用方括號表示法(陣列訪問符)來訪問陣列中一個特定的資料項,注意下標是從0開始的,最大下標是陣列內容減一,
arr1[1];//表示arr1陣列中第二個元素的內容
二維陣列同理,
交錯陣列,也就是陣列陣列,用陣列來存盤陣列,宣告方式如下:
int[][] arr6 = {
new int[]{1,1,1};
new int[]{2,2,2};
new int[]{3,3,3};
}
當然陣列也有一些方法,下面進行舉例:
- arr.Length:獲取陣列的長度,只讀,
我們在訪問陣列的邊界元素時,一般會采取Length-1這樣的方式來訪問陣列邊界成員,
- System.Array.Sort():對陣列內容進行排序,
- System.Array.BinarySearch(var[] arr, var searchString):回傳搜索值的索引,不存在就回傳-1,前提是按升序排序,
- System.Array.Clear(intArray, 0, intArray.Length):清空第0到第intArray.Length個索引的元素(置零),
- System.Array.Reverse(arr):反轉陣列順序,
還有眾多方法,這里不一一列舉,看個樂呵,
字串作為陣列使用###
我們需要注意的是,字串是不可變的,字串作為陣列使用時,我們訪問到的成員變數都是char型別的變數,為此將字串作為陣列使用時要注意不能去修改成員變數的內容,
小結##
本次博文的內容介紹了更多的資料結構,但是這也只是開始,介紹了值型別,參考型別,隱式型別,元組以及陣列,這些內容都會貫徹到我們今后的專案之中,一定要打好堅實的基礎,當然不是說要背下來,理解到位才是我們應該去做的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/105758.html
標籤:C#
上一篇:C#以物件為成員的例子
下一篇:C# 學習筆記 多型(二)抽象類
