基礎知識
一、 變數
簡單整數型別
類型 .NET Frramework 中別名 允許的值
sbyte System.SByte -128~127
byte System.Byte 0~255
short Sytetem.Int16 -32768~32767
ushort System.UInt16 0~65535
int System.Int32 -2147483648~2147483647
uint System.UInt32 0~4294967295
long System.Int64 -9223720306854775808~9223382036854775807
ulong System.UInt64 0~18446744073709551615
簡單浮點數
類型 .NET Frramework 中別名 m e
float System.Single 0~224 -149~104
double System.Double 0~253 -1075~970
decimal System.Decimal 0~296 -26~0
其他類型
類型 .NET Frramework 中別名 允許的值
char System.Char 一個Unicode字元,儲存0~65535之間的整數
bool System.Boolean true或false
string Sytem.string 一組字串
二、常量
常量具有如下特徵
常量必須在聲明時初始化,指定了其值後就不能再改變了.
常量的值必須能在編譯時間用於計算。不能用從一個變數中提取的值來初始化常量,如果要這麼做應使用唯讀(readonly)。
常量是靜態,不允許在常量聲明中包含修飾符 static。
三、 實值型別與參考型別
實值型別儲存在棧中,參考型別儲存在託管堆中。C#中基礎資料型別 (Elementary Data Type)都是之類新,如果聲明一個bool變數,並給它賦予另一個bool變數的值,記憶體中就會有兩個bool值。如果以後修改第一個bool變數,第二個bool變數的值不會改變。這些類是通過值來複製的。
大多數複雜的c#資料類型包括我們自己聲明的類都是參考型別。他們分配在堆中,其聲明周期可以跨越多個函數調用。可以通過一個或幾個別名來訪問。CLR執行一種精細演算法,來跟蹤哪些變數仍是可以訪問的,哪些引用變數已經不能訪問了。CLR會定期刪除不能訪問的對象,把他們佔用的記憶體返回給系統,這是通過垃圾收集器實現的。
如果要把自己的類型定義為實值型別,就應聲明它為一個結構。
四、 類型轉換
類型轉換有兩種:
隱式轉換:從類型A到類型B的轉換可以在所有情況下進行,執行的規則非常簡單,可以讓編譯器進行。
顯示轉換:從類型A到類型B的轉換隻能在某些情況下進行,轉換的規則比較複雜,應進行某種類型處理。
隱式轉換的規則是:任何類型A只要其取值範圍完全包含在類型B的取值範圍內,就可以隱式轉換為類型B。
使用Vonvert.To***,總是進行溢出檢查,checked和unchecked關鍵字以及項目的屬性設定沒有什麼用。
五、裝箱和拆箱:
任何實值型別、參考型別可以和object(對象)類型之間進行轉換。裝箱轉換是指將一個實值型別隱式或顯式地轉換成一個object類型,或者把這個實值型別轉換成一個被該實值型別應用的介面類型(interface-type)。把一個實值型別的值裝箱,就是建立一個object執行個體並將這個值複製給這個object,裝箱後的object對象中的資料位元於堆中,堆中的地址在棧中。被裝箱的類型的值是作為一個拷貝賦給對象的。如:
int i = 10;
object obj = i; //隱式裝箱
object obj = object(i); //顯式裝箱
if(obj is int) //int
Console.WriteLine(“OK”);
Console.WriteLine(obj.GetType()); //System.Int32
有兩種方式來查看封裝以後的引用對象中封裝的未經處理資料的類型。要判斷原始類型是否是某個給定的原子類型,用is;如果要返回一個字串,可以用object類的GetType方法。
拆箱轉換是指將一個物件類型顯式地轉換成一個實值型別,或是將一個介面類型顯式地轉換成一個執行該介面地實值型別。注意裝箱操作可以隱式進行但拆箱操作必須是顯式的。拆箱過程分成兩步:首先,檢查這個對象執行個體,看它是否為給定的實值型別的裝箱值。然後,把這個執行個體的值拷貝給實值型別的變數。比如:
int i = 10;
object obj = i;
int j = (int)obj;
有兩種方式來查看封裝以後的引用對象中封裝的未經處理資料的類型。要判斷原始類型是否是某個給定的原子類型,用is;如果要返回一個字串,可以用object類的GetType方法。
拆箱轉換是指將一個物件類型顯式地轉換成一個實值型別,或是將一個介面類型顯式地轉換成一個執行該介面地實值型別。注意裝箱操作可以隱式進行但拆箱操作必須是顯式的。拆箱過程分成兩步:首先,檢查這個對象執行個體,看它是否為給定的實值型別的裝箱值。然後,把這個執行個體的值拷貝給實值型別的變數。比如:
int i = 10;
object obj = i;
int j = (int)obj;
六、 字串
sting類型可以看作是char變數的唯讀數組。但是不能為字串中的各個字元賦值.
string myString = “A string”;
char myChar = myString[1];
char [] myChars = myString.ToCharArray();
string misting2= myString.ToLower();//ToUpper();不會改變原字串.
string misting2= myString.Trim();//.TrimStart();.TrimEnd()
char[] trimChars={‘ ’,’1’};
string misting2= myString.Trim(trimChars);//刪除指定字串,無參數刪掉空格
string myString = “A string”;
string myString = myString.PadLeft(10,’*’);// PadRight(10,’*’)添加到字串的某一側補位
string myString=”This is test !”;
char[] trimChars={‘ ’};
string [] myWords = myString.Spilt(trimChars);//使用分隔字元時,刪除了分隔字元
必須用雙引號把字串括起來股指給字串變數。使用\”來轉移雙引號。可以在字串中使用斷行符號換行的逸出序列即\n。
Console.WriteLine(“{0}{1}”,myString1,myString2);
字串實際上是插入變數內容的一個模板,字串中的每隊花括弧都是一個預留位置,包含列表中每個變數的內容。每個預留位置(或格式字串)用包含在花括弧中的一個整數表示,以0開始,每次遞增1。
string是參考型別,在把一個字串賦給另一個字串時,會得到對記憶體同一個字串的兩個引用.但是,如果修改了其中一個字串,就會建立一個全新的string對象,而另一個字串不會改變.
七、枚舉
enmu orientation:byte
{
North = 1,
Sourth = 2,
East = 3;
West = 4
}
orientation myDir = orientation.North; //myDir=North
byte dirbyte = (byte)myDir; //1
string dirstring =Conver.ToString(myDir) ; // North;也可以Convert.ToString但不能(string)
string myString = “West”;
orientation newDir = (orientation)Enmu.Parse( typeof(orientation), myString)
可以使用一個值作為基礎,可以為多個枚舉指定相同的值.沒有賦值的任何值都會自動獲得一個初始值,使用的值是從比最後一個明確的值大1開始的 。
八、命名空間
Namespace myNameSapce
{
using NT = namespaceTwo; //別名 使用NT::類名
}
九、運算式
儘可能使用&&和||,會一定程度上提高效能。
^ 如果運算元中相同位置上的位有且只有一個是1,結果是1。
switch (myInteger)
{
case <1>:
case <2>:
// do something
}
實際上一次檢查多個條件,如果滿足這些條件中的任何一個,就會執行多個代碼。
do
{}while();
do while 語句while後面必須要有分號。
十、數組
數組在訪問前必須初始化,初始化有兩層含義,指定大小(分配空間),指定內容。
int myInt = {1,2,3}; //同時指定大小和內容
int myInt = new int[3]; //顯示指定了大小,new會賦預設值
int myInt = new int[5]{1,2,3}; //失敗 大小必須與元素個數匹配
int myInt = new int[arraySize];// arraySize可以是變數
int myInt = new int[arraySize][1,2,3,4];// arraySize必須是常量
double [,] myInt = new double [3,4];//初始化多維陣列
double [,] myInt = {{1,2,3}, {1,2,3}};//初始化多維陣列
int [][] jaggeInArray = new int [3][];
jaggeInArray={{1,2,3},{1, 3},{,3}}//不可以這樣初始化
jaggeInArray[0] = new int [3];
jaggeInArray[1] = new int [2];//可以這樣 必須一聲明子數組的形式初始化
int [][] jaggeInArray = {new int []{1,2,3}, new int []{1,2}}//也可以這樣初始化