C#學習筆記(一)

創建.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中的表達式結果爲真,則輸出要顯示的信息


在使用類靜態成員變量前,需要對靜態成員變量進行初始化,儘管可以在聲明時進行初始化,但有時需要比較複雜的初始化,可以使用靜態構造函數執行這種初始化任務,一個類只能有一個靜態構造函數,該構造函數不能有訪問修飾符,也不能帶有任何參數,靜態構造函數不能直接調用,只能在下述情況下執行:

  1. 創建包含靜態構造函數的類實例時
  2. 訪問包含靜態構造函數的類的靜態成員時
示例:

    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)
        {}


接口和抽象類:

相似點

  • 抽象類和接口都包含可以由派生類繼承的成員
  • 接口和抽象類都不能直接實例化,但可以申明這些類型的變量
區別

  • 派生類只能集成一個基類,類可以使用任意多個接口
  • 抽象類可以擁有抽象成員和非抽象成員,接口成員必須在使用接口的類上實現
  • 接口不能包含字段,構造函數、析構函數、靜態成員或常量

類與結構很相似,但類是應用類型,而結構是值類型,比如:將一個類對象賦值給另一個類對象,這兩個類對象將指向同一塊內存,修改一個對象,另一個對象的值也會改變,而將一個結構變量賦值給另一個結構變量,這兩個結構變量只是內容一樣,指向兩塊不同的內存



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章