Visual Studio 2010 step by step學習摘要

以下爲學習摘要,新手入門,如果有錯誤請指教,勿噴哈吐舌頭!!!

1.static的靜態字段、變量是屬於公共類的,靜態類不允許有構造方法。
  靜態字段是屬於類的,類的實例不能引用靜態字段,只能用類名去引
  用靜態字段。靜態字段是類所有實例所共享的字段,靜態方法同靜態
  字段。
  靜態類的字段和方法都必須是靜態的,而且不允許有構造方法出現。
2.對於常量const的定義必須在聲明的時候做一個初始化操作。const
  定義的常量默認情況下就是static靜態的。所謂的常量就是在初始化
  以後不能修改裏面的值。
3.固定寫法:public static void,順序最好不要換。
4.加上ref後能存放變量的地址。out關鍵字也是把變量的地址取出,然
  後傳遞過去。out和ref關鍵字的區別是變量可以不做初始化就可以傳
  遞地址。
5.object類可以接受所有類型的引用。
6.堆heap存儲的是值引用類型,即內存地址。棧stack存儲的是數據。
7.裝箱操作是將棧空間中的數值轉化爲堆空間當中的存儲區域對象。
  拆箱操作是將堆空間中的對象拆箱成棧空間的中的變量。
  拆箱操作前要進行裝箱操作:如
  Circle c=new Cirele(42);
  object o =c;
  int i=(Cirecle)o;
8.結構體與類的區別:結構體的數據是保存在棧當中,是一種值
  類型。類的對象是保存在堆當中,類的引用是保存在棧當中。
  結構體中不能定義默認構造方法。在結構體的非默認構造方法中你
  必須對結構體中所有的字段進行初始化,否則將報錯。
  在類中聲明字段的同時,你可以初始化字段的值。但是在結構體中
  是不可以的。
9.創建數組變量:
  int [] pins;
  pins=new int[4];

  int size=int.Parse(Console.ReadLine());
  int[] pins=new int[size];//動態改變數組的大小,通過鍵盤輸入
 
  初始化一個數組變量:
  int [] pins=new int[4]{4,5,6,7};
 
  訪問數據元素,下標是從0開始:
  Console.WriteLine(pins[0]);
  遍歷整個數組:
  for(int i=0;i<4;i++)
  {
    Console.WriteLine(pins[i]);
   }
   或者:for(int i=0;i<pings.Length;i++)
   即通過.Length屬性獲取數組的元素個數。
   或者使用foreach循環:
   foreach(int pin in pins)
   {
     Console.WriteLine(pin);
    }
    其中的Pin必須和數組中的元素的類型一致,pin爲臨時變量。

   拷貝數組:
   int[] pins=new int[4]{9,3,5,6};
   int[] copy =pins;
   但是這種方式傳遞的是數組元素的內存地址,所以只要改變了copy
   的元素,其中的內存地址保留的值也會影響到pins的值。
   數組其實就是引用類型,其元素具是存儲在堆stack當中的。
   如果要完全拷貝的話可以使用下面的方式:
   int[] copy2=new int[pins.Lenth];
   for (int i=0;i<pins.Length;i++)
   {
    copy[i]=pins[i];
   }
   foreach(int c in copy)
   {
    Console.WriteLine(c);
    }
    以上的方式就是一一對應的方式,另外開闢了內存空間,修改copy2
    元素的值的話不會影響Pins元素的值了。和這種用for循環做一一拷貝
    的方法完全一致的方法還可以使用以下方法:
    pins.CopyTo(copy,0);//copy爲拷貝到的數組,0爲開始拷貝的下標數。
    還可以用:
    Arry.Copy(pins,copy,copy.Length);
    或者:int[] copy=(int[])pins.Clone();//克隆方法
10.集合類:ArrayList
   在使用集合時必須引入命名空間:using System.Collections;
   numbers.Insert(numbers.Count-1,5);
   numbers.Remove(5);
   numbers.RemoveAt(2);//移除指定的元素,2指起下標位置,開始位置爲0.
   ArrayList存儲的都是object類型。
11.params關鍵字:
   注意點:1.不能僅使用params來重載方法。
          2.不允許ref和Out同params同時使用。
          3.Params數組必須是最後一個參數,當有多個參數的時候。
          4.一個沒有params的方法的優先級要高於帶有params的方法。
          5.對於引起歧義的方法重載編譯器報錯。
   
12.所有的類的父類都是object類,父類有時也稱基類。
   子類有時也稱作派生類,子類繼承父類(即繼承了父類中的非私有的
    屬性和方法。)基類派生出子類。子類與子類之間是沒有關係的。
   繼承的使用:
   Class Horse:Mammal
   {
     public void Trot()
    {
    }
   }

    pubilc void GetName()
    {
        return name;//獲取名字字符。
    }
   在實例化子類的時候調用構造方法時首先調用的是父類的構造方法。
   調用基類(即父類)構造方法:
   class Horese:Mammual
  {
     public Horese(string name):base(name)  
     {
      }
   }
   父類引用可以引用子類的對象。
   父類引用只能調用子類繼承自父類的方法,父類引用不能調用子類獨有
   的方法。
   子類引用不能直接引用父類對象,除非將父類對象的數據類型強制轉換
   成子類。但是實際開發過程最好不要使用這種方法,因爲語法上沒有錯
   誤,但是運行時會報錯。
捕獲異常的方法:
    try
    {
     Horese newHorse=(Horese) new Mammal("aa");    
 }
    catch(Exception ex)
     {
       Console.WriteLine(ex.Message);
      }
     new關鍵字是子類隱藏繼承的父類中的方法。在實際開發中對於New關
     鍵使用比較少。
     override是子類重寫了父類的方法。比較常用,在一定程度上來講,
     子類繼承父類實際上是對父類的繼承和擴展,override其實上是對父
     類進行改寫和拓展用的。
定義override方法的注意事項:
1.virtual和override不能使用在private方法上;
2.重寫的方法必須和virtual的方法同名,參數列表一直,返回值類型一致。
3.擁有相同的訪問級別
4.只能重寫虛方法(即virtual方法)
5.已經用override定義的方法不能在再用virtual定義;
6.在子類中不用override定義父類同名方法,編譯器報錯,但是你可以用New
  關鍵字重新定義該方法。
      父類引用可以調用子類重寫父類的方法,而不是調用父類原來的方法。
      Protected訪問修飾符子類可以訪問到父類的protected屬性,而外部
      類是無法訪問的。
      擴展方法是根據this後面第一個參數來確定擴展方法的類型的。
13.定義接口:
      interface IComparabel
      {
       int CompareTo(object obj);
       }
    注:接口名用大寫I開頭
        接口本身是不能實例化的,關鍵字默認是public的。
        class Hores:Mammal,ILandBound,IGrazable
        {
         }//父類名(Mammal)在錢,接口名在後,只能繼承一個父類,但
          //可以實現多個接口
14.抽象方法是沒有方法體的。抽象方法是不能直接被調用的。
   抽象方法默認就是virtural方法。抽象類是沒有對象的,不能被實例化。
15.密封類sealed不能夠被繼承,沒有子類的。 也不能在子類中重寫的。
16.對象的生命週期:
   Square mySquare=new Square();
   Square referenceToMySquare=mySquare;
   mySqure=null;//當以下這兩個變量都爲空的時候,mySquare就變爲垃圾。
   referenceToMySquare=null;
17.析構方法是對象變成垃圾被銷燬的時候所調用的方法。
   析構方法注意點:
       析構方法必須和類名保持一致起形式如~Tally(){};
       析構方法只存在於引用類型;
       不可對析構方法是用訪問修飾符;
       析構方法不允許帶任何的參數;
    在是用IO操作的時候一般是用try ...catch結構,可以防止因爲程序出現
    異常的時候,後面可以添加釋放掉內存的語句。否則異常程序不會釋放內存。
    Dispose()方法一般是在析構函數中調用的。Dispose其實是一個虛方法。
    當一個對象不用的時候,如果還佔用內存資源的和當一個對象超過生命週期
    的時候必須銷燬對象,釋放掉佔用的內存資源。
18.屬性的定義:
   struct ScreenPosition
  {
     private int x,y;
     public ScreenPosition(int X,int Y)
      {
         this.x=rangeCheckX(X);
         this.y=rangeCheckedY(Y);    
       }
      public int X
      {
       get{return this.x;}
       set{this.x=rangeCheckX(value);}
       }
  }
   屬性的命名規則:將字段的首字母大寫,其他的和類一樣。
   屬性的的字段方法只有get和set,裏面以分號爲結尾。
19.使用索引器:
   public bool this[int index]//索引器的名詞統統爲this
   索引器與數組的差別:
   first:索引器不僅可以用整形數值做下標,也可以用string類型。
     public int this[string name] {...}//It is OK
   second:索引器能夠像方法一樣被重載
     public Name  this [PhonmeNumber number]{...}
     public PhoneNumber this[Name name] {...}
   third:索引器不能作爲ref和Out修飾的參數
   接口當中可以有索引器,但是接口中的索引器是沒有內容和大括號的。如:
      interface IRawInt
      {
         bool this [int index]{get;set;}      
      }
20.定義並使用委託:
   class Controller
   {
     delegate void stopMachineryDelegate();
     private stopMachineryDelegate stopMachinery;
     public Controller()
     {
       this.stopMachinery+=folder.StopFolding;
       //以上語句相當於:
       //this.stopMachinery=
       //new stopMachineryDelegate(folder.StopFolding);
   }
    委託有些書又叫函數指針,而其中的函數即是C#中的方法,
    指針對應着C#中的引用。
    委託其實也是一種數據類型。
    委託的實例化:委託變量名=new 委託類型(方法名);
    從委託中移除一個方法:
    stopManchinery-=welder.FinishWelding;
    //從委託中移除委託並沒有指向的方法,委託並不會拋異常。
21.Lambda表達式:
     一個典型方法包括:返回類型、方法名、參數列表、方法體,
     Lambda表達式包含兩樣參數列表和方法體,返回值類型是根據
     Lambda使用時的上下文由編譯器推斷出來的。如:
     (()=>{folder.StopFolding(0);});
      //其中=>是告訴編譯器,此表達式爲Lambda表達式。
22.事件的聲明和委託的聲明和初始化是一樣的,沒有什麼大區別。
23.創建範型的方法:
       public static void swap<T>(ref T a,ref T b)
       {
        }
24.協變接口與逆變接口概念(前提是範型接口)
   逆變接口的定義:
      public interface IComparer<in T>
      {
          int Compare(T x,T y);   
      }

發佈了17 篇原創文章 · 獲贊 7 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章