技術棧從Java換成C#的筆記


實習要換技術棧,開始學習C#。沒什麼想法,大部分語法和java相通,百無聊賴,這裏稍微記錄一下在學習過程中遇到的問題。


1、關於對象和結構體

    對象:引用變量

    結構體:值變量

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ch09Ex03
{
   class MyClass
   {
      public int val;
   }

   struct myStruct
   {
      public int val;
   }

   class Program
   {
      static void Main(string[] args)
      {
         MyClass objectA = new MyClass();
         MyClass objectB = objectA;
         objectA.val = 10;
         objectB.val = 20;
         Console.WriteLine("objectA.val = {0}", objectA.val);
         Console.WriteLine("objectB.val = {0}", objectB.val);

         myStruct structA = new myStruct();
         myStruct structB = structA;
         structA.val = 30;
         structB.val = 40;
         Console.WriteLine("structA.val = {0}", structA.val);
         Console.WriteLine("structB.val = {0}", structB.val);
         Console.ReadKey();
      }
   }
}


這段代碼的輸出是:

objectA.val = 20
objectB.val = 20
structA.val = 30
structB.val = 40

可以看出,上面的針對對象和結構體的邏輯操作是相同的,但是結果不同,這是因爲對象和結構體的值的屬性不同,對象是一個引用變量,當對引用變量賦值時,其實是賦值給它一個指針,值的存儲位置並沒有變化。而對於結構體來說,它是一個值變量,當複製給它的時候,是將另外一個結構體內的所有的值都複製了一遍,每一個結構體變量都有自己的存儲空間。所以賦值以後對它的操作只涉及當前結構體本身的存儲空間內的數據。


2、對於sealed修飾的類,表示當前類作了封裝,不能再被繼承。對於sealed修飾的方法和屬性值,表示方法或者屬性不能被重寫。


3、幾個關鍵字來修飾類中的成員:

    public : 成員可以有任何代碼來訪問

    private:成員只能由當前類中的代碼訪問(當沒有關鍵字修飾時,默認是private的)

    internal:成員可以有當前項目內的代碼訪問

    protected:可以由當前類及其派生類中的代碼訪問

    sealed:修飾的類表示已密封,不能被繼承。修飾的方法和屬性,表示不能被重寫(overwrite)。密封類不能被繼承,密封方法不能被重寫。


4、關於拆箱和裝箱

裝箱的過程就是將一個值類型轉換成一個引用類型,也就是說要轉換成一個對象。而拆箱的過程就是將一個引用類型轉換成一個值類型。裝箱的過程會帶來性能的損耗,這是因爲:

    A) 要爲值類型在託管堆中分配內存,這些內存包括值類型本身的內存,也有引用指針和索引塊兒帶來的內存

    B) 要將值類型的值複製到新分配的內存中

    C) 要返回已經成爲引用類型的對象的地址


5、幾個獨特的用法

      public double? R = null;  這裏在double後面加一個?表示可以爲null,原來double是基本數據類型,不能賦值爲空的,加了問號表示可空類型。

      op1 ?? op2;   兩個問好表示空接合運算符。當op1不爲空時,返回op1, 否則返回op2。 這個操作等價爲 op1 == null ? op2 : op1


6、delegate關鍵字:修飾的方法表示委託方法,也就是說當前的方法的參數可以是另一個方法,但是這兩個方法的參數類型和參數個數必須一致。


7、const關鍵字:用const修飾的變量稱之爲只讀變量,一般在變量定義的時候初始化,後面不能改變這個變量的值,屬於編譯時常量。但是這個關鍵字和readonly又有不同,const字段修飾的詞只能在定義的時候進行初始化,readonly 則可以在聲明或者構造函數中初始化,readonly屬於運行時常量。


8、關於virtual和abstract的區別:virtual和abstract都是用來修飾父類的,通過覆蓋父類的定義,讓子類重新定義。

    A)Virtual表示虛擬的,abstract表示抽象的。virtual修飾的方法必須有實現。abstract修飾的方法必須沒有實現(方法體爲空)

    B)virtual修飾的方法可以被子類重寫,而abstract修飾的方法必須被子類重寫

    C)包含抽象方法的類一定是抽象類,抽象類不能直接實例化,需要被繼承之後,重寫抽象方法,完成方法體之後才能被實例化


9、關於構造函數和析構函數

    構造函數和析構函數是類中比較特殊的兩種成員函數,主要用來做對象初始化和回收對象資源。一般來說,對象的生命從構造函數開始,以析構函數終止。一個類中可以有多個重載的構造函數,但是隻能有一個析構函數,並且析構函數無法調用,它是系統自動調用的。



10、var關鍵字的用法:

     var是一個弱化類型定義的一種方式,可以替換任何數據類型,這一點和object有點像,按時不同的是它的效率比object要高。

     var在使用的時候有幾個注意事項,必須在定義的時候初始化,初始化完成之後就不能再改變它的類型了,同時要求var必須是局部變量。


11、using語句的用法:

     using一般用在頭部,調用某些空間或者是類,也可以用using完整的路徑來區分兩個重名的類。

     而using內部語句則表示定義一個範圍,當這個範圍運行結束時,dispose掉其中的對象。


12、default關鍵字:

    在泛型中,如果需要返回泛型類型的默認值,則使用default關鍵字。由於在泛型中,並不知道類型值是爲數值類型還是引用類型,所以無法給出默認值,而用default就解決了這個問題。

    一般使用 return default(T)實現。當T的值是數值類型是,返回0,是字符串類型時返回空,是引用類型時返回空,是結構化類型的時候返回的每個結構化成員都是默認值,爲零或爲空。








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