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