C#面向對象編程的注意事項
* 注意自己的命名,
* [JIT]即時編譯:運行到哪里編譯到哪里,編譯之后就放到了內存之中。
* 局部變量(在方法中申明)必須先付值在使用。
* 越抽象的類就可以當做父類。
* 里氏替換原則:
就是需要一個父類的類型的時候給了一個子類的對象是可以的。
*:快捷鍵
*導入命名空間(shift+alt+F10)
*構造函數:CTOR
* :base():表示調用父類的構造函數
**This來調用本類的成員,base來調用父類中的成員。
**訪問級別約束
*多態的實現
*:靜態的構造函數
*:在靜態類中所包含的所有成員都必須的是靜態成員。靜態屬性只有用類名.出來,不能用實例化對象來點出來。<靜態成員的生命周期是很長的,一般在程序退出的時候才會被回收釋放資源,而實例化的對象一用完就會被GC回收。>
*記錄代碼的時候要記其主要的結構,主要的步奏。
這個是在類里面聲明一個靜態的屬性,其次就是一個隱藏靜態的構造函數。靜態構造函數只執行一次,(第一次使用靜態類,靜態成員,靜態方法)
靜態的構造函數不能手動調用,而是在第一次使用靜態類的時候自動調用的,沒有訪問修飾符,也沒有任何參數。具體的值是在里面設置好的。
多態<同一段代碼在執行的時候有不同的功能>
*類型的另外一種類型轉換
<只是這種轉換不提示錯誤,值變為null,強類型轉換則直接報異常。>
Student a=p as Student();
*抽象類
《就是在類前面加一個abstract就是抽象類》
一般的類就是抽象的,但是抽象類是比較高級的抽象的類,不能被實例化。
下面是抽象類的一般特性
抽象類只定義不能在其中有具體的實現,智能在繼承的子類中進行重寫。
*注意以后在使用類屬性的時候,在給其屬性賦值的時候都要放在構造函數(CTOR)里面。
**練習實例
*:值類型與引用類型
值類型:以字節保存在內存《保存在棧》里面,不可繼承
<int char double long short enum decime等>
引用類型;在堆,棧里面都有保存,在棧里面只保存堆里面的地址,實際的值是放在堆里面的??梢岳^承
<string 數組 類 接口,委托 >
<引用傳遞,值傳遞>
……引用傳遞:拷貝棧中的堆地址,指向同一塊堆;
……ref的引用傳遞:兩個變量指向同一個棧(棧中有數據)的地址,那就是他們指向的堆是同一個,不管改變那一個,堆里面的數據都會改變。
……值傳遞:拷貝棧中的內容,將其作為一個副本。
(棧里面數據進行拷貝的時候是復制數據,為一個副本)
*:接口問題探討
在java里面老師說就看下樓層上面的管道,這樣就可以可聯想到接口的具體意義。
接口的定義與命名
*一般接口以大寫I開頭,-able結尾,關鍵字是interface
*接口里面只能包含方法(方法,屬性,索引器,事件)。
*接口里面都不能寫任何訪問修飾符。<接口中默認為public的訪問修飾符>
*接口不能被實例化,屬性只能寫(get;set;)方法,不能再繼續寫。
*接口中的成員子類必需全部實現。接口可以“多繼承”一個類只能繼承自一個父類但是可以實現多個接口。
Public class interface IFlyable
{
Void SayHi();
//索引器
String this[int index]
{
get;set;
}
}
*:接口實例
接口的實現分為兩種,直接實現,顯示實現接口,直接實現是公共的public,而顯示實現接口是解決重名問題的,為私有的。
*類型轉換
*顯式轉換,隱式轉換,強類型轉換(容易丟失精度)
1:sizeof判斷其占用幾個字節,
{console.writeline(sizeof(int))}
2:隱式轉換(當其數據類型一致,且大字節轉換為小字節的會發生類型轉換。)
3:所有數組的父類是Array類型。
*異常處理<try---catch----finally>
*運行時程序出現的錯誤
*finally: 代碼清理,釋放資源,無論發生了什么它里面的內容都講會被執行。相當與在C語言里面switch后面的define的含義。
*當程序中某行代碼出錯,后面的代碼就不會往后執行。
*對于異常的處理我們可以寫多個catch(里面的異常方法不一樣)來處理各自的異常。
*手動異常的拋出<多使用邏輯判斷來解決異常。為了不浪費資源。>
Throw new Exception(“有異常了”)
*方法會為返回值單獨設置變量,這樣子返回值里面的值就不會改變了。
Ref和Out比較
*比較兩個對象是否為同一個對象
Console.writeline(object.ReferenceEquals(p1,p2));
Console.writeline(object.ReferenceEquals(p1,p3));
若p1和p2為同一對象則返回值為true,若不是則返回值為false.
*關鍵字sealed<此為密封類>
在其前面加上一個關鍵字sealed表示此類不被繼承。
*字符串(string )的不可變性和字符串池
1:String的相加減是字符串的疊加,會開批新的堆內存。
2:字符串常量的保存將能保存到堆內存中,也就是保存在了字符串池中。也相當與保存到塊表里面。<string.IsInterned()>
*字符串
1:字符串格式化
這里是取代站位符,Console.WriteLine(“我今年(0,-10,c2)歲了”,22);
2:StringBuilder類的使用
一般的情況都是在使用字符串拼接的時候才會用到,因為它的速度快。
3:監視字符串等C#程序的快慢的方法
在需要添加監視的程序前面實例化Stopwatch對象。
Stopwatch watch=new Stopwatch();
watch.Start()
//這中間是需要看執行時間的程序
Watch.Stop();
Console.WriteLine(watch.Elapsed);
4:弱引用
就是變量在初始化完成之后,在棧里面沒有地址指向它,則它將被GC回收,此時用WeakReference重新申明一下,就是將其弱引用下,以后使用的時候直接使用就可以使用。<WeakReference wr=new WeakReference(p)>
新聞熱點
疑難解答