年時,北風吹雁雪紛紛,一條秋褲凍上頭。冷的連手都懶得動,就隨便翻翻書,也沒有更新博客,如今年已過,開始投入到正常的工作狀態中,趁現在需求還沒有來,把C#基礎知識梳理一下,其實一直以來就想這樣做的,對于程序員來說,手指一點,各種詳細的資料就出來了,但并不是自己的,有些基礎的點總是隔一段時間就忘記,或者說自己壓根就沒有真正理解過,不管怎樣,好記性不如爛筆頭,先寫再說,一次整理一部分,慢慢積累起來。
1.C#定義常量的方式 const定義靜態常量,申明時需要初始值,一旦申明不可改變。
2.構造函數與類名相同,可重載,可帶參數,創建該類對象時,自動調用。在調用其他構造函數的時候 public xx():this()
3.數據類型(裝箱: 值類型->引用類型 拆箱:引用類型->值類型)
值類型:int、char、bool、枚舉、結構 直接存儲在棧里
引用類型:string、數組、類、接口、委托、對象 棧里面存儲地址,實際上對象存儲在堆里
(PS 隊列:先進先出 棧:后進先出)
4. 類型轉換
隱式轉換(所有情況下成立)
顯示轉換(部分情況下成立,包括convert在內的強制轉換)
5. 引用傳遞
ref : 有進有出,調用前需要賦初始值
out: 只出不進,調用前不需要賦初始值
為什么要用到引用參數?個人理解:當需要在A方法中處理過的B參數值,但該方法又不返回B參數時,就可以通過引用參數來解決此問題。
class Program { //引用傳值,最后都會改變原來的值 static void Main(string[] args) { Program p = new Program(); int outtemp; //只需定義變量 p.MyOut(out outtemp); int refbb = 8; //必須賦初始值 p.MyRef(ref refbb); Console.WriteLine(outtemp); // out 5 Console.WriteLine(refbb); // ref 6 Console.ReadKey(); } public void MyOut(out int a) { a = 5; } public void MyRef(ref int b) { b = 6; } }
6.靜態和實例成員的區別?
實例成員只能在類的對象實例上使用,靜態成員只能通過類定義使用
7.委托是個什么玩意?
關于委托,網上資料一大把,包括學校的教材所寫, 基本上都是舉語言問候的例子。其實這個例子是完全不適合的,沒有任何卵用,甚至起到了副作用
隨便摘抄其中千篇一律的某點,使用委托極大增加了擴展性,可維護性,摒棄之前的if/Switch 用法,我就納悶了,例子和結論完全不沾邊,怎么得出的鬼結論。
之前Switch語法,直接傳入參數name,然后調用對應的語言問候方法。這里接受到的name是不確定其值的,所以必須要進行一個判斷。或者采用繼承、實例。
然后語言問候的例子中,直接傳入name、問候方法兩參數。我就納悶了你怎么知道要調用這個問候方法?采用委托鏈?這里實際上是沒有任何意義的。
其實真正在項目中用到的委托,多數是結合事件一起用的。
public delegate void myFirstDele(int a, int b); // 定義一個委托類型 class Program { //(PS:Calculation 類中是實現傳入兩參數的加/減運算) static void Main(string[] args) { //委託方法一: 直接將方法賦值給委託變量,再給委託變量賦參數 //myFirstDele add = Calculation.Addcount; //myFirstDele Substra = Calculation.substract; //add(10, 10); //Substra(10, 10); //委託方法二: 寫一個中間方法,調用中間方法,將實現的方法當做參數來傳遞 Calculat(10,10,Calculation.Addcount); Calculat(10, 10, Calculation.substract); Console.ReadKey(); } //中間方法,有一個參數為委托類型 public static void Calculat(int x, int y,myFirstDele myfirstDele) { myfirstDele(x,y); } }
8.面向對象的三大特性: 封裝、繼承、多態
9.簡要談談多態?
定義:相同類型的對象調用相同的方法卻表現出不同的行為(不同的子類對象賦值給基類對象,該對象調用各自重寫基類的方法,當然會產生不同的行為)
類別:編譯時的多態(函數的重載) 運行時的多態(重寫基類方法)
實際上,多態的應用和繼承緊密相關,當不確定具體返回類型(有多個類型)時,只需要返回基類,再將子類對象賦給基類對象,此時,可表達該子類對象
抽象方法、虛方法可通過子類重寫父類方法來實現多態
//抽象方法實現多態 public abstract class Animal { //抽象方法沒有方法體 public abstract void Skil(); } public class Cat : Animal { public override void Skil() { Console.WriteLine("(重寫基類方法)我是貓,會抓老鼠"); } public void Test() { Console.WriteLine("我是子類貓中特有的方法"); } } //小狗類 public class Dog : Animal { public override void Skil() { Console.WriteLine("<重寫基類方法>我是狗,我會看家護院"); } } //麻雀類,除了基類中的技能,還擁有自己獨特的飛能力 public class Sparrow:Animal,Interface1 { public override void Skil() { Console.WriteLine("<重寫基類方法>我是麻雀,我非常靈活"); } public void Fly() { Console.WriteLine("<接口中方法>麻雀,我能衝上雲霄"); } } ////虛方法實現多態 //public class Animal //{ // //虛方法有方法體 // public virtual void Skil() { } //}
接口亦如此,只是將繼承了接口的類對象賦值給接口類,而接口中方法的實現仍然在繼承接口的類的方法中
static void Main(string[] args) { Poly p = new Poly(); //將子類對象賦值給父類 Animal animal = new Cat(); animal.Skil(); //將繼承了接口的類對象賦值給接口類 Interface1 interface1 = new Sparrow(); interface1.Fly(); Console.ReadKey(); }
10.什么接口?有什么作用?
接口是對一組方法的聲明進行統一命名,不提供實現,默認訪問修飾符為Public,接口的產生源于C#中不允許多重繼承
調用接口:隱式, 對應繼承單一接口 public 返回類型 方法名( ) { ... }
如果某個類中繼承了多個具有相同名稱、參數的方法,則在實現該接口中的方法時,需用到顯示(指明具體來自的接口),注意:實現方法時,默認類型為Private私有,故無須添加訪問修飾符。 樣式為: 返回類型 接口名.方法名( ){ ... }
11.寫一個遞歸的階乘
public int Jchen(int n) { if (n==1) { return 1; } else { return Jchen(n-1)*n; } }
12.寫一個簡單的冒泡程序( 2 for + 1 foreach )
public void SSort(int [] ints) { for (int i = 1; i < ints.Length; i++) { for (int j = 0; j < ints.Length-1; j++) { int temp; if (ints[j]>ints[j+1]) { temp = ints[j+1]; ints[j + 1] = ints[j]; ints[j] = temp; } } } foreach (var item in ints) { Console.WriteLine(item); } }
13. 字符串中 string.Empty、null、"" 三者有何區別?
① string.Empty 其值為 "" ,在堆中分配了長度為0的一空間 . 可調用Tostring() , 與 "" 僅存在語法上的優化區別 , 只是Empty無須經過從字符串池中撈取 "" ,賦值給變量的過程.
② null 棧中存儲的地址的指向是不確定的,故在堆中不分配內存空間 . 故不可調用Tostring().
注:對于List<T> 泛型集合,null值不可調用對象的任何屬性、方法; New之后可調用.
文章列表