創建.NET應用程序的步驟:
1)使用某種.NET兼容語言編寫應用程序代碼
2)把代碼編譯爲CIL,存儲在程序集中
3)執行代碼時,使用JIT編譯器將代碼編譯爲本機代碼
4)在託管的CLR環境下運行本機代碼,以及其他應用程序或進程
用字符串表示帶路徑的文件名,字符串中會帶有大量的斜槓,例如:"c:\\Temp\\MyDir\\MyFile.doc",可以在字符串前加一個@符號,這樣對於引號,雙引號,斜槓等符號就不用在轉義了,例如:@"c:\Temp\MyDir\MyFile.doc"
把字符串轉換成枚舉變量不能使用簡單的類型轉換,需要用一個特殊的語法:(enumerationType)Enum.Parse(typeof(enumerationType), enumString);
以下方式聲明數組:
Type[] name;
這樣只是定義了一個數組類型的變量,並沒有指定數組的大小,數組中也沒有內容,可以在定義的時候初始化,如:
也可以先定義數組,然後再初始化,如:
int[] myIntArray; myIntArray = new int[5] { 5, 9, 10, 2, 99};
如果定義數組時沒有初始化,那麼數組中的所有元素都有同一個默認值,對於數值類型來說,其默認值是0,初始化元素的數量必須與數組的長度一致,不能只初始化部分元素,這與C++是不一樣的二維數組採用如下方式申明:
int[,] myIntArray;
聲明時可不指定任何的維度,因爲C#限制初始化列表必須與數組的長度一致,所以根據初始化列表就可以確定數組的長度,但必須採用分段初始化的方式,如:
int[,] myIntArray;
myIntArray = new int[,] { { 1, 2 }, { 2, 3 } };
申明數組的數組,即數組中的每個元素都是一個數組,語法如下:
int[][] jaggedIntArray;
數組的數組有兩種初始化方式:
一。依次把每個元素初始化爲數組
jaggedIntArray = new int[2][];
jaggedIntArray[0] = new int[3];
jaggedIntArray[1] = new int[4];
二。在定義的時候初始化
jaggedIntArray = new int[3][]{new int[]{1, 2, 3}, new int[] {1}, new int[] {1, 2}};
或
int[][] jaggedIntArray = new int[3][]{new int[]{1, 2, 3}, new int[] {1}, new int[] {1, 2}};
C#有一種特殊的函數參數,這種參數只能出現在參數列表的最後一個,叫做參數數組,它有params關鍵字定義,定義的形式爲:
params type[] name
調用方式可以採用
functionname(var1, var2....,varn);
唯一的限制是var等一系列變量必須類型相同並且是type類型的
C#的函數參數默認爲值參數,如果需要使用引用參數,需要在函數參數前加上ref關鍵字,同時在調用函數的地方,也要在參數前加上ref關鍵字,例如:
int number = 2;
Func(ref number);
static void Func(ref int number)
{
number *= 2;
}
C#可以使用輸出參數,需要在函數參數前加上out關鍵字,同事在調用函數的地方,也要在參數前加上out關鍵字,例如:
int MaxValue;
Func(ints, out MaxValue);
static void Func(int[] ints, out int MaxValue)
{
MaxValue = ints[0];
foreach (int i in ints)
{
if (i > MaxValue)
{
MaxValue = i;
}
}
}
注意;輸出參數可以是未初始化的,即使是經過初始化的,在使用輸出參數時,也需要將它看作是未初始化的
函數委託類似與C++中的函數指針,示例如下:
delegate int OperationFunc(int a, int b);
static void Main(string[] args)
{
OperationFunc function = new OperationFunc(Add);
int iResult = 0;
iResult = function(1, 2);
Console.WriteLine(iResult);
function = new OperationFunc(Mulit);
iResult = function(2, 3);
Console.WriteLine(iResult);
Console.ReadKey();
}
static int Add(int a, int b)
{
return a + b;
}
static int Mulit(int a, int b)
{
return a * b;
}
注意,委託定義中是沒有static的
Debug.WriteLine()和Trace.WriteLine()都是用於向IDE的輸出窗口輸出內容,用於程序運行時顯示信息,區別在於前者只在debug模式下生效,而後者在debug和release模式下都生效,這些信息也可以在滿足某些條件的情況下才輸出,分別對應Debug.WriteLineIf()和Trace.WriteLine If()這兩個函數,但參數1中的表達式結果爲真,則輸出要顯示的信息
在使用類靜態成員變量前,需要對靜態成員變量進行初始化,儘管可以在聲明時進行初始化,但有時需要比較複雜的初始化,可以使用靜態構造函數執行這種初始化任務,一個類只能有一個靜態構造函數,該構造函數不能有訪問修飾符,也不能帶有任何參數,靜態構造函數不能直接調用,只能在下述情況下執行:
- 創建包含靜態構造函數的類實例時
- 訪問包含靜態構造函數的類的靜態成員時
class MyClass
{
public static int m_i;
static MyClass()
{
Console.WriteLine("靜態構造函數被調用");
m_i = 5;
}
}
靜態類只能包含靜態成員,不需要示例構造函數,靜態類可以有一個靜態構造函數,示例:
{
static class MyStaticClass
{
static MyStaticClass()
{
}
public static void func()
{
}
public static int m_i;
}
默認情況下,類申明是內部的,即只有當前項目中的代碼才能訪問它,還可以指定類是公共的,可以由其他項目中的代碼來訪問,爲此,要使用關鍵字public來進行類聲明,還可以指定類是抽象的(abstract,不能實例化,只能繼承,可以有抽象成員)或密封的(sealed,不能繼承)。
在C#的類定義中,只能有一個基類,如果繼承了一個抽象類,就必須實現所繼承的所有抽象成員。編譯器不允許派生類的可訪問性高於基類,也就是說,內部類可以集成於一個公共基類,但公共類不能繼承於一個內部類。
申明接口的方式與聲明類相似,但使用的關鍵字是interface,而不是class,訪問修飾符關鍵字public和internal的使用方式是相同的,與類一樣,接口也默認定義爲內部接口,所以要使接口可以公開訪問,必須使用public關鍵字,不能在接口中使用關鍵字abstract和sealed,因爲這兩個修飾符在接口定義中是沒有意義的。
無論在派生類上使用什麼構造函數,除非明確指定,否則就是用基類的默認構造函數,如需要調用基類的其他構造函數,可以把代碼放在方法定義的冒號後面,base關鍵字用於表示基類,this關鍵字用於表示當前類,例如:
public Derived() : base(1)
{}
public Derived(int i) : this(1, 2)
{}
public Derived(int i, int j)
{}
相似點
- 抽象類和接口都包含可以由派生類繼承的成員
- 接口和抽象類都不能直接實例化,但可以申明這些類型的變量
- 派生類只能集成一個基類,類可以使用任意多個接口
- 抽象類可以擁有抽象成員和非抽象成員,接口成員必須在使用接口的類上實現
- 接口不能包含字段,構造函數、析構函數、靜態成員或常量
類與結構很相似,但類是應用類型,而結構是值類型,比如:將一個類對象賦值給另一個類對象,這兩個類對象將指向同一塊內存,修改一個對象,另一個對象的值也會改變,而將一個結構變量賦值給另一個結構變量,這兩個結構變量只是內容一樣,指向兩塊不同的內存