1. 程式人生 > >C#學習筆記第一發---C#基礎(類型和基礎語法)

C#學習筆記第一發---C#基礎(類型和基礎語法)

問號 key 循環 自動 其中 clas tlist 不存在 邏輯運算

首先,數據類型分為值類型和引用數據類型以及指針類型(暫不涉及):值類型是指直接儲存在內存的棧上面,引用類型則在棧上儲存一個引用,在堆上儲存具體的值。

值類型分為內建類型和用戶可以自定義的struct類型、enum類型,這些類繼承於system.ValueType類,而system.ValueType繼承於system.Object類,Object類是所有類的基類。

值類型如int、bool都是通常使用的別名,正式名為system.Int32、system.Boolean。

另外可以用var來命名一個變量,這樣可以暫時不確定他的數據類型。

struct類似於JAVA中的分裝類型,用於自定義一個類,可以包含不同的屬性;

enum枚舉類型相當於設定了一個數列,所建立的變量只能取值數列中的值,每個值自動默認對應從0開始的int值,但是可以手動強制從別的數開始或者強制為其他的數據類型。

舉個栗子: days : short { monday = 5, tuesday, wenesday, thursday, friday, saturday, sunday }

struct和enum類型的定義要寫在main方法體外!!!!結束沒有分號!!!!

引用類型首先是三個內建類型:string、object、dynamic。其中dynamic強制規定類型檢查在運行階段而不是編譯階段。

string類型兩種賦值方式可以得到相同的值,但是在底層的代價是不同的(兩種方法:string a="abcdefg";string b="abcd";b+="efg"),建議使用第一種,第二種對系統需求的代價較大,需要經常修改的值可以使用stringbuilder類型獲得可變長的內存空間。

重點:stringbuilder方法AppendFormat使用方法

StringBuilder s = new StringBuilder ();
s.AppendFormat("hello{1}{0}","ld","wor");

可以將s值賦值為helloworld。

接下來是class類型,class類可以包含成員變量和內部方法,默認的訪問修飾符是private,外部不可訪問,可以手動修改為public。C#的get set方法不是單獨的方法而是使用關鍵字get set,直接調用get set關鍵字就可以使用對應的方法;靜態方法綁定與class名,不可以用實例化的對象訪問,而是用類名直接訪問。

interface接口內部只能聲明方法,沒有具體的實現方法,子類中必須要實現接口中的方法。

abstract class抽象類是不能被實例化的,但是內部可以定義方法,子類可以默認的調用抽象類內部的方法,也可以在自身內部重寫同名方法,實現方法的重載。接口不可以包含成員變量,抽象類可以具有自己的成員變量,並且被子類繼承。

類的分類熟悉之後是類的轉換,C#中的類型轉換分為顯示轉換和隱式轉換,C#是一種強類型的語言,在編譯時會檢查類型。

隱式轉換適用於範圍較小的類轉為範圍較大的類,不會有值的丟失,顯示轉換則適用於範圍較大的類轉換為範圍較小的類,但是容易造成值得精度等丟失。

類型轉換中有兩個重要的關鍵字as,is。

is用於判斷能否轉換為一個類,輸出結果為ture或者false,分別表示是否可以轉換為目標類型,如果是ture,則可以使用as進行轉換,但是as只能用於引用類型和非空類型,如果用於值類型的轉換則會報錯,因為在轉換時由大類轉為小類會賦值給小類一個空值,而值類型不可以為空。

值類型的轉換可以使用convert類下的方法或者對應類下的parse方法或者TryParse方法,使用TryParse方法轉化不能轉化的值時會賦值一個默認值。還可以使用繼承接口IConventible或TypeConventer來自定義自己得類型轉化方法。

值類型和引用類型的互相轉換通常稱為裝箱和拆箱,裝箱屬於隱式轉換,不需要專門的語法,拆箱則可以通過顯示轉換實現。

拆裝箱有一個常見的問題是不可為空的類型被賦值為空,這會報錯,解決的方式可以在變量命名時變量名後加?來使得這個值可為空,同等意義的命名方法還有System.Nullable<int> i=10;這時這個i可以被賦值為空,但是讀取時會報錯,解決方法是使用HasValue來取值,為空則會返回false,或者使用方法GetValueOrDefalt,在空值是返回默認值。修改默認值可以使用雙問號:int k=i ?? 20;則在i為空時賦值k為20,如果i有值則正常賦值。

接下來是數組,數組是一個引用類型,所有數組都繼承於基類system.Array,這是一個抽象類,不能被實例化。

一維數組int[] numbers=new int[5];

二維數組int[,] numbers=new int[5,4];

數組的數組int[][] numbes=new int[5][4];

數組的數組又被稱為交錯數組,每一行可以有不同的長度。

以上都是固定長度的數組,所有數組的長度都是在定義時確定的,如果要使用變長的數組可以使用ArrayList數組列表,數組列表可以儲存不同的類型,易引起混亂,建議使用List,List可以使用泛型規定內部的值類型。寫法如下List<int> intList=new List<int>();這個列表中就只能使用int類型的值。

之上都是使用位置來訪問列表中的值,而使用Hashtable哈希表可以自己定義每個值的key,Hashtable沒有強制規定類型,如果需要強制規定,可以使用Dictionary來強制規定,寫法如下Dictionary<string,string> d=new Dictionary<string,string>();強制規定了key和value都是string類型。Hashtable訪問不存在的key時會返回一個空值,而在Dictionary中則會報錯。但是Dictionary線程不安全,在多線程中建議使用ConcurrentDictionary。另外還有SortedList,會自動的根據key值對數組進行排序;stack數組先進後出的數組,類似於一個堆棧;queue是一個先進先出的數組。

然後是C#內的基礎語法--邏輯語句

邏輯運算符和其他的語言並沒有什麽區別,比較特別的是在if判斷之後的程序只有一行時可以省略大括號,但是出於編程習慣不建議使用。

比較有意思的一個循環方式是使用foreach循環,這是一個簡便的寫法,使用這一循環必須是集合類型實現了IEnumerable接口的才可以。

List<int> iss=new List<int>(){1,2,3};

foreach(int i in iss)

{

Console.WriteLine(i);

}

Console.ReadLine();

這樣就循環輸出了iss中的每個值。

C#學習筆記第一發---C#基礎(類型和基礎語法)