亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

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

2020-01-24 03:21:30
字體:
來源:轉載
供稿:網友

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

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

ITestInterface testInterface = new ITestInterface();

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

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

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

image

image

Program 的Main函數只有一句話:

image

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

image

很明顯Application 是個interface,

這里我要扯一下,經常看到有人說string 是類還是結構什么的,看下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 來實現。

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

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

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的優化和支持。

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

 

ITestApplication中添加ComImportAttribute 特性:

clip_image002

再次運行,結果如下:

image

查看下反編譯的代碼:

image

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

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),但是開發環境是2005,所以不能夠C3ReadCard c3=new C3ReadCard();

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本精品一区二区三区在线| 欧美一级淫片丝袜脚交| 日韩精品一区二区三区第95| 欧美一区二粉嫩精品国产一线天| 日韩av在线网页| 精品美女久久久久久免费| 福利一区视频在线观看| 中日韩午夜理伦电影免费| 日韩成人av网址| 欧美大成色www永久网站婷| 国产日韩在线视频| 国产视频自拍一区| 欧美电影电视剧在线观看| 国产精品美女www爽爽爽视频| 黑人巨大精品欧美一区免费视频| 亚洲精品女av网站| 亚洲欧美日韩天堂| 久久全国免费视频| 久久精品国产成人精品| 亚洲自拍偷拍网址| 日韩av影视综合网| 三级精品视频久久久久| 欧美最顶级的aⅴ艳星| 日韩天堂在线视频| 久久免费视频观看| 亚洲精品不卡在线| 日韩精品有码在线观看| 久久天天躁狠狠躁夜夜av| 国产精品最新在线观看| 欧美国产日韩一区二区在线观看| 久久亚洲精品一区二区| 免费av一区二区| 亚洲人成电影网站色www| 国产色综合天天综合网| 亚洲欧美激情四射在线日| 中文字幕国产亚洲| 岛国av在线不卡| 久久亚洲一区二区三区四区五区高| 黑丝美女久久久| 国产极品精品在线观看| www.xxxx欧美| 亚洲日韩中文字幕| 亚洲高清免费观看高清完整版| 欧美激情亚洲自拍| 黑人巨大精品欧美一区二区一视频| 国产在线久久久| 国产精品99久久久久久www| 韩国精品久久久999| 91亚洲国产成人精品性色| 88xx成人精品| 欧美激情精品久久久久| 日韩电影免费在线观看中文字幕| 亚洲免费av电影| 久久91亚洲精品中文字幕奶水| 亚洲免费电影一区| 国模精品系列视频| 欧美国产日韩xxxxx| 欧美一性一乱一交一视频| 午夜精品一区二区三区在线视| 懂色av一区二区三区| 日韩欧美国产中文字幕| 日韩在线观看你懂的| 欧美最猛黑人xxxx黑人猛叫黄| 国产精品一区专区欧美日韩| 这里只有精品在线观看| 国产精选久久久久久| 九九热这里只有精品免费看| 欧美精品生活片| 日本免费久久高清视频| 久久精品小视频| 欧美国产日韩精品| 日韩免费视频在线观看| 亚洲va欧美va国产综合久久| …久久精品99久久香蕉国产| 国产精品美腿一区在线看| 亚洲综合一区二区不卡| 久久精品亚洲精品| 精品视频偷偷看在线观看| 久久久亚洲影院| 久久久久免费精品国产| 亚洲的天堂在线中文字幕| 中文字幕免费国产精品| 日韩欧美在线中文字幕| 亚洲人精选亚洲人成在线| 欧美一区三区三区高中清蜜桃| 九九热这里只有精品免费看| 中文字幕国产日韩| 欧美亚洲第一页| 91久久久久久久| 国产精品美女www爽爽爽视频| 日韩欧美在线看| 亚洲女人天堂av| 久久成人人人人精品欧| 98精品国产自产在线观看| 77777少妇光屁股久久一区| 国产精品一区二区久久| 亚洲剧情一区二区| 国产精品成人一区二区| 亚洲精品视频免费在线观看| 啊v视频在线一区二区三区| 久久精品电影一区二区| 成人在线免费观看视视频| 国产精品久久久久免费a∨| 色综合久久久久久中文网| 欧美成人性色生活仑片| 7777免费精品视频| 欧美激情视频一区二区三区不卡| 亚洲аv电影天堂网| 成人免费看吃奶视频网站| 欧美大肥婆大肥bbbbb| 欧美日韩第一视频| 日本不卡高字幕在线2019| 久久天天躁狠狠躁夜夜躁| 91经典在线视频| 日本精品va在线观看| 日韩久久免费电影| 国产日韩中文在线| 一个色综合导航| 国产成人精品一区二区三区| 亚洲一区亚洲二区| 欧美老少配视频| 欧美精品videosex牲欧美| 欧美日韩免费区域视频在线观看| 色婷婷av一区二区三区在线观看| 欧美第一黄网免费网站| 成人网页在线免费观看| 91在线免费网站| 91精品啪在线观看麻豆免费| 亚洲国产日韩欧美综合久久| 欧美激情一区二区三区久久久| 亚洲欧美日韩中文在线制服| 国产欧美日韩最新| 国产美女扒开尿口久久久| 国产精品h片在线播放| 亚洲欧美中文日韩在线| 最近2019中文字幕mv免费看| 国内精品国产三级国产在线专| 久久久亚洲天堂| 亚洲人成网站在线播| 国产精品久久久久7777婷婷| 国产一区二区三区在线观看视频| 91美女高潮出水| 日韩精品极品视频| 另类天堂视频在线观看| 亚洲免费伊人电影在线观看av| 亚洲永久在线观看| 欧美性生活大片免费观看网址| 欧美亚洲第一区| 国产精品自产拍在线观看中文| 色综合视频网站| 国内精品久久久久久久久| 欧美日韩国产999| 国产成+人+综合+亚洲欧美丁香花| 在线色欧美三级视频| 92国产精品视频| 欧美激情在线观看视频| 国产精品自产拍在线观| 亚洲第一网站男人都懂| 91免费综合在线| 日本精品在线视频| 国产欧美精品日韩精品| 国产精品成人av性教育| 欧美成人精品影院| 日韩中文字幕不卡视频|