C#基礎知識整理:C#類和結構(4)

來源:互聯網
上載者:User
1、什麼是介面? 功能特性? 實現代碼?
介面就是使用interface關鍵字定義的,由類的成員的組合組成的,描述一些功能的一組規範。在C#中可以看到,系統的一些介面都是這樣命名的:IComparable(類型的比較方法)、ICloneable(支援複製)、IDisposable(釋放資源)等等,I表示介面,able則反映了介面的特性:“能... ...”,表明這一組規範能幹什麼。
(1)、介面實現

   public interface IPrintAble    {        void PrintString();        void PrintInt();        void PrintBool();    }    public interface IComputeAble    {        void HandlerString();        void HandlerInt();        void HandlerBool();    }    public class MyInplementInterface : IPrintAble, IComputeAble    {        //隱式實現        public void PrintString()        {            Console.WriteLine(@"1");        }        public void PrintInt()        {            Console.WriteLine(1);        }        public void PrintBool()        {            Console.WriteLine(true);        }        public void HandlerString()        {            Console.WriteLine(@"1" + "1");        }        public void HandlerInt()        {            Console.WriteLine(1 + 1);        }        public void HandlerBool()        {            Console.WriteLine(true || false);        }        //顯示實現        //void IComputeAble.HandlerString()        //{        //    throw new NotImplementedException();        //}        //void IComputeAble.HandlerInt()        //{        //    throw new NotImplementedException();        //}        //void IComputeAble.HandlerBool()        //{        //    throw new NotImplementedException();        //}    }      class Program    {        static void Main(string[] args)        {            MyInplementInterface imple = new MyInplementInterface();            imple.PrintString();            imple.PrintInt();            imple.PrintBool();            imple.HandlerString();            imple.HandlerInt();            imple.HandlerBool();            Console.ReadLine();        }    }

結果:

(2)實現專用介面,即C#已經定義好的介面
例:

    public class ImplementSysInterface : IComparable    {        public int CompareTo(object obj)        {            //可以根據需要實現自己的比較方法            return 0;        }        private void UsingMenthod()        {            //報錯,因為NoIDisposeableClass沒有實現IDisposable介面,所以不支援using            //using (NoIDisposeableClass my = new NoIDisposeableClass())            //{            //}            //實現IDisposable介面後,可以使用using            using (IDisposeableClass my = new IDisposeableClass())            {            }        }    }    public class NoIDisposeableClass    {    }    public class IDisposeableClass : IDisposable    {        #region IDisposable 成員        public void Dispose()        {                    }        #endregion    }

介面有如下特性:
a、介面類似於抽象基類,不能直接執行個體化介面;介面中的方法都是抽象方法,實現介面的任何非抽象類別型都必須實現介面的所有成員:
b、當顯式實現該介面的成員時,實現的成員不能通過類執行個體訪問,只能通過介面執行個體訪問。
例如:

   public class MyInplementInterface2 : IComputeAble    {        void IComputeAble.HandlerString()        {            Console.WriteLine(@"1" + "1");        }        void IComputeAble.HandlerInt()        {            Console.WriteLine(true || false);        }        void IComputeAble.HandlerBool()        {            Console.WriteLine(true || false);        }    }    class Program    {        static void Main(string[] args)        {            IComputeAble imple2 = new MyInplementInterface2();            imple2.HandlerString();            Console.ReadLine();        }    }

c、當隱式實現該介面的成員時,實現的成員可以通過類執行個體訪問,也可以通過介面執行個體訪問,但是實現的成員必須是公有的。
d、介面不能包含常量、欄位、運算子、執行個體建構函式、解構函式或類型、不能包含靜態成員。
e、介面成員是自動公開的,且不能包含任何存取修飾詞。
f、介面自身可從多個介面繼承,類和結構可繼承多個介面,但介面不能繼承類。

2、什麼是泛型? 泛型有哪些優點?
所謂泛型,是將型別參數的概念引入到.NET,通過參數化型別來實現在同一份代碼上操作多種資料類型。是參考型別,是堆對象。
其實,一開始學泛型,是在學習java的時候,當時沒有搞明白,我一直都覺得泛型純屬多此一舉,用object一樣可以搞定。比如,如下,比如,有人以類型的值,都要列印出來,於是object實現:

    public class Test    {        private object model;        public object Model        {            get            {                return model;            }            set            {                model = value;            }        }        public Test(object model)        {            this.Model = model;        }        public void ShowRecord()        {            Console.WriteLine(model);        }    }   class Program    {        static void Main(string[] args)        {            int recordI = 2;            bool recordB = true;            Test testI = new Test(recordI);            testI.ShowRecord();            Test testB = new Test(recordB);            testB.ShowRecord();            Console.ReadLine();        }    }

但是當學的多了,就會發現還是有一定的問題的。首先,就是裝箱問題,int是實值型別,賦值給object類型時,要完成一次裝箱操作。什麼是裝箱?就是把recordI值複製到新的object分配的空間。浪費了時間和效能。所以泛型還是有作用的,那麼,用泛型來實現:

  public class TestGeneric<T>    {        private T model;        public T Model        {            get            {                return model;            }            set            {                model = value;            }        }        public TestGeneric(T model)        {            this.Model = model;        }        public void ShowRecord()        {            Console.WriteLine(model);        }    }    class Program    {        static void Main(string[] args)        {            int recordI = 2;            bool recordB = true;            TestGeneric<int> testGI = new TestGeneric<int>(recordI);            testGI.ShowRecord();            TestGeneric<bool> testGB = new TestGeneric<bool>(recordB);            testGB.ShowRecord();            Console.ReadLine();        }    }

這樣,當TestGeneric<int> testGI = new TestGeneric<int>(recordI)時,T就是int了,用不著裝箱了。
當然泛型不僅僅是要解決裝箱問題,功能特性如下:
a、避免裝箱拆箱,提高了效能;
b、提高了代碼的重用性;
c、型別安全的,因為在編譯的時候會檢測;
d、可以建立自己的泛型介面、泛型類、泛型方法、泛型事件和泛型委派。
以上就是C#基礎知識整理:C#類和結構(4)的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.