這是我的情況:
class A : IDisposable
{
public void Dispose() { Console.WriteLine("A Dispose"); }
}
class B : A
{
public new void Dispose(){ Console.WriteLine("B Dispose"); }
}
class Program
{
static void Main(string[] args)
{
using (B b = new B())
{
}
}
}
最終輸出是“A Dispose”。我已經閱讀了一些介紹 override 和 new 區別的檔案,以及一些說明“using”基本上等于“try-finally”的檔案。但我仍然無法回答為什么它不是 B::Dispose 被自動呼叫。比較以下的輸出是“B Dispose”
B b = new B();
try
{
}
finally
{
b.Dispose();
}
請幫忙,我錯過了什么。
uj5u.com熱心網友回復:
根據C# 語言規范,對于參考型別:
using (ResourceType resource = ?expression? ) ?statement?
相當于
{
ResourceType resource = ?expression?;
try {
?statement?;
}
finally {
IDisposable d = (IDisposable)resource;
if (d != null) d.Dispose();
}
}
如您所見,資源首先被轉換為IDisposable,這意味著A'sDispose是被呼叫的資源,因為B'sDispose只是隱藏它而不是覆寫它。
如果您想IDisposable在類層次結構中正確實作,請參閱檔案中的最佳實踐。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/432510.html
下一篇:用普通的舊資料結構繼承
