程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#隱式/顯示完成接口辦法詳解

C#隱式/顯示完成接口辦法詳解

編輯:C#入門知識

C#隱式/顯示完成接口辦法詳解。本站提示廣大學習愛好者:(C#隱式/顯示完成接口辦法詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C#隱式/顯示完成接口辦法詳解正文


接口界說了一系列的行動標准,為類型界說一種Can-Do的功效。例如,完成IEnumerable接口界說了GetEnumerator辦法,用於獲得一個列舉數,該列舉數支撐在聚集長進行迭代,也就是我們常說的foreach。接口只是界說行動,詳細的完成須要由詳細類型擔任,完成接口的辦法又分為隱式完成與顯示完成。

1、隱式/顯示完成接口辦法

  簡略的說,我們日常平凡“默許”應用的都是隱式的完成方法。例如:

interface ILog
{
  void Log();
}
 
public class FileLogger : ILog
{
  public void Log()
  {
    Console.WriteLine("記載到文件!");
  }
}

  隱式完成很簡略,平日我們商定接口定名以 I 開首,便利浏覽。接口內的辦法不須要用public,編譯器會主動加上。類型中完成接口的辦法只能是public,也能夠界說成虛辦法,由子類重寫。如今看顯示完成的方法:

public class EventLogger : ILog
{
  void ILog.Log()
  {
    Console.WriteLine("記載到體系事宜!");
  }
}

  與下面分歧的是,辦法用了ILog指明,並且沒有(也不克不及有)public或許private潤飾符。

  除語法上的分歧,挪用方法也分歧,顯示完成只能用接口類型的變量來挪用,如:

FileLogger fileLogger = new FileLogger();
fileLogger.Log(); //准確
EventLogger eventLogger = new EventLogger();      
eventLogger.Log(); //報錯
ILog log = new EventLogger();
log.Log(); //准確

2、什麼時候應用

  1. c#許可完成多個接口,假如多個接口界說了雷同的辦法,可以用顯示完成的方法加以辨別,例如:

interface ISendable
{
  void Log();
}
 
public class EmailLogger : ILog, ISendable
{
  void ILog.Log()
  {
    Console.WriteLine("ILog");
  }
 
  void ISendable.Log()
  {
    Console.WriteLine("ISendable");
  }
}

  2. 加強編譯時的類型平安和防止值類型裝箱

  有了泛型,我們天然可以做到編譯時的類型平安和防止值類型裝箱的操作。但有時刻能夠沒有對應的泛型版本。例如:IComparable(這裡只是舉例,現實有IComparable<T>)。如:

interface IComparable
{
  int CompareTo(object obj);
}
 
struct ValueType : IComparable
{
  private int x;
  public ValueType(int x)
  {
    this.x = x;
  }
 
  public int CompareTo(object obj)
  {
    return this.x - ((ValueType)obj).x;
  }
} 

  挪用:

ValueType vt1 = new ValueType(1);
ValueType vt2 = new ValueType(2);
Console.WriteLine(vt1.CompareTo(vt2));

  因為形參是object,下面的CompareTo會產生裝箱;並且沒法取得編譯時的類型平安,例如我們可以隨意傳一個string,編譯不會報錯,比及運轉時才拋出InvalidCastException。應用顯示完成接口的方法,如:

public int CompareTo(ValueType vt)
{
  return this.x - vt.x;
}
 
int IComparable.CompareTo(object obj)
{
  return CompareTo((ValueType)obj);
} 

  再次履行下面的代碼,就不會產生裝箱操作,並且可以取得編譯時的類型平安了。然則假如我們用接口變量挪用,就會再次產生裝箱並損失編譯時的類型平安檢測才能。

IComparable vt1 = new ValueType(1); //裝箱
ValueType vt2 = new ValueType(2);
Console.WriteLine(vt1.CompareTo(vt2)); //再次裝箱

3、缺陷

  1. 顯示完成只能用接口類型變量挪用,會給人的感到是某類型完成了該接口卻沒法挪用接口中的辦法。特殊是寫成類庫給他人挪用時,顯示完成的接口辦法在vs中按f12都不會顯示出來。(這點有人在csdn發問過,為何某個類型可以不消完成接口辦法)

  2. 關於值類型,要挪用顯示完成的辦法,會產生裝箱操作。

  3. 沒法被子類繼續應用。

以上就是C#顯示完成接口的全體內容,願望對年夜家的進修有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved