最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于C# 中可以new一個接口?的問題分析

 更新時間:2013年05月13日 12:36:59   作者:  
本篇文章是對C#中可以new一個接口?的問題進行了詳細的分析介紹,需要的朋友參考下

如果有人問你,C# 中可以new 一個接口嗎?,你會怎么回答?

假設ITestInterface 是一個接口,那么這樣的代碼是否有問題?

ITestInterface testInterface = new ITestInterface();

很多書上都會說,當然有問題,接口不能用new ,然后你就認為上面這句語句肯定通不過編譯器的編譯了。

可是凡事無絕對,C# 竟然允許你這么寫,當然你需要加點”料”才行。

VS2005 中新建控制臺程序CA2005.添加 Microsoft.Office.Interop.Excel 引用

image

image

Program 的Main函數(shù)只有一句話:

image

注意,可以通過編譯,看下Application的定義:

image

很明顯Application 是個interface,

這里我要扯一下,經(jīng)??吹接腥苏fstring 是類還是結構什么的,看下string 的定義:

image

 String 是用class 來修飾的,所以string 100% 是類。

還是扯回來吧,Application 是個接口,但是我們卻可以用new  .為什么 ?

先看下反編譯后的代碼吧:

image 

可以看到雖然我們寫的是new Application,但是編譯器為我們生成的卻是new ApplicationClass();

難道Application 有什么特別的地方?

仔細的同學一眼就看出了Application是被這兩個特性修飾的:

[CoClass(typeof(ApplicationClass))]

[Guid("000208D5-0000-0000-C000-000000000046")]

關于CoClass的解釋可以看msdn

image 

有些人不喜歡看msdn,而喜歡看博客的一個原因就是msdn太不直白了。

我個人的理解是CoClass 就好像concrete Class(具體類)。

這個特性指示編譯器在編譯Application的時候,使用ApplicationClass 來實現(xiàn)。

回到上面的最初的問題上:

如何讓這段代碼通過編譯:

ITestInterface testInterface = new ITestInterface();

通過上面的分析,我們很容易將這個特性來修飾我們的自己的接口:

namespace CA2005

{

    [CoClass(typeof(TestClass))]

    [Guid("6C8BF7FE-1F6B-437E-BCC8-6D2FF04E66B3")]

    public interface ITestInterface

    {

        void DoSomething();

    }

    [Guid("68C7CB18-0DEE-4689-845D-741525281C76")]

    public class TestClass : ITestInterface

    {

        public void DoSomething()

        {

            Console.WriteLine("TestClass:DoSomething");

        }

    }

    class Program

    {

        static void Main(string[] args)

        {

            Microsoft.Office.Interop.Excel.Application excelApplication =

                new Microsoft.Office.Interop.Excel.Application();

            ITestInterface testInterface = new ITestInterface();

            testInterface.DoSomething();

        }

    }

}

編譯,結果如下:

image

接口被標記了CoClassAttribute,而不是ComImportAttribute.

image

原來想要new 一個接口使用的是編譯器對COM的優(yōu)化和支持。

很明顯上面的Application是一個COM對象,所以可以new Application

 

ITestApplication中添加ComImportAttribute 特性:

clip_image002

再次運行,結果如下:

image

查看下反編譯的代碼:

image

之所以我對VS2005 用紅色字體,是因為如果你用VS2010 創(chuàng)建的程序,那么你會看到不一樣的反編譯結果:

public static void Main()

{

      Application application1 = (Application) Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid("00024500-0000-0000-C000-000000000046")));

      ITestInterface interface1 = new TestClass();

      interface1.DoSomething();

      Console.ReadLine();

}

這里的Type.GetTypeFromCLSID 中的guidApplicationClassGuid,也就是CoClassTypeGuid

[ComSourceInterfaces("Microsoft.Office.Interop.Excel.AppEvents")]

    [Guid("00024500-0000-0000-C000-000000000046")]

    [TypeLibType(2)]

    [ClassInterface(0)]

    public class ApplicationClass : _Application, Application, AppEvents_Event

{

}

這點一定要注意。

樓下有些同學說這有什么意義,下面是我的項目實例,也是這個問題才讓我研究了這個問題:

在項目中使用了一種C3讀卡器,這種讀卡器提供了讀卡接口(C3ReadCard),但是開發(fā)環(huán)境是2005,所以不能夠C3ReadCard c3=new C3ReadCard();

這點很奇怪,Excel的可以new,但是C3ReadCard卻不可以new,但是通過反射去調(diào)用實現(xiàn)類就可以使用C3ReadCard的接口。

這個問題的意義在于你明白編譯器如何去處理new一個接口所生成的代碼,也許還有其他的用處,等待你的發(fā)現(xiàn)。

相關文章

  • 在Linux上運行C#的方法

    在Linux上運行C#的方法

    這篇文章主要介紹了在Linux上運行C#的方法,實例分析了Linux平臺下Mono軟件包的應用技巧,以及在此基礎之上的C#運行方法,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-12-12
  • C# 延遲Task.Delay()和Thread.Sleep()的具體使用

    C# 延遲Task.Delay()和Thread.Sleep()的具體使用

    Thread.Sleep()是同步延遲,Task.Delay()是異步延遲,本文主要介紹了C# 延遲Task.Delay()和Thread.Sleep()的具體使用,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2024-01-01
  • C#程序優(yōu)化-有效減少CPU占用率

    C#程序優(yōu)化-有效減少CPU占用率

    本文給大家介紹的是C#程序優(yōu)化的小技巧,通過此方法可以有效的降低CPU的占用率,十分的簡單實用,有需要的小伙伴可以參考下。
    2015-06-06
  • c#獲取本機的IP地址的代碼

    c#獲取本機的IP地址的代碼

    c#獲取本機的IP地址的代碼,需要的朋友可以參考一下
    2013-03-03
  • C#聯(lián)合VisionPro實現(xiàn)TCP/IP通信詳解

    C#聯(lián)合VisionPro實現(xiàn)TCP/IP通信詳解

    TCP/IP(傳輸控制協(xié)議/互聯(lián)網(wǎng)協(xié)議)是一組用于在網(wǎng)絡上進行通信的通信協(xié)議,本文主要為大家詳細介紹了C#如何聯(lián)合VisionPro實現(xiàn)TCP/IP通信,希望對大家有所幫助
    2024-02-02
  • C# 中的委托與事件機制詳解

    C# 中的委托與事件機制詳解

    本文詳細介紹了C#中委托和事件的概念、使用方法和應用場景,包括委托定義、匿名方法、Lambda表達式、事件機制和多播委托的詳細說明,委托作為類型安全的函數(shù)指針,文章還探討了如何通過匿名方法和Lambda表達式簡化委托的使用,以及多播委托在事件處理中的應用
    2024-10-10
  • C#中List和數(shù)組之間轉換的方法

    C#中List和數(shù)組之間轉換的方法

    這篇文章主要介紹了C#中List和數(shù)組之間轉換的方法,涉及比較簡單的轉換技巧,需要的朋友可以參考下
    2015-02-02
  • c#斐波那契數(shù)列(Fibonacci)(遞歸,非遞歸)實現(xiàn)代碼

    c#斐波那契數(shù)列(Fibonacci)(遞歸,非遞歸)實現(xiàn)代碼

    c#斐波那契數(shù)列(Fibonacci)(遞歸,非遞歸)實現(xiàn)代碼,需要的朋友可以參考一下
    2013-05-05
  • 一個可攜帶附加消息的增強消息框MessageBoxEx

    一個可攜帶附加消息的增強消息框MessageBoxEx

    一個可攜帶附加消息的增強消息框MessageBoxEx分享給大家,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • C# 嵌入dll 的方法

    C# 嵌入dll 的方法

    這篇文章主要介紹了C# 嵌入dll 的方法,本文圖文并茂給大家及時的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-07-07

最新評論

枞阳县| 双江| 攀枝花市| 马龙县| 北宁市| 贺州市| 哈巴河县| 温州市| 江永县| 类乌齐县| 新巴尔虎右旗| 镇平县| 信丰县| 肇州县| 浦东新区| 绥棱县| 霸州市| 日喀则市| 射洪县| 会同县| 临沭县| 饶河县| 平罗县| 自贡市| 泰来县| 甘肃省| 当雄县| 南陵县| 卢龙县| 普安县| 东港市| 阳春市| 亳州市| 清苑县| 潼南县| 天镇县| 叙永县| 铁力市| 尉氏县| 湟源县| 和硕县|