文章出處

      年時,北風吹雁雪紛紛,一條秋褲凍上頭。冷的連手都懶得動,就隨便翻翻書,也沒有更新博客,如今年已過,開始投入到正常的工作狀態中,趁現在需求還沒有來,把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之后可調用.

  


文章列表


不含病毒。www.avast.com
全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()