2010-05-28 64 views
11

我不知道只在運行時檢查過時的屬性嗎?僅在編譯時檢查Obsolete屬性?

認爲你有兩個組件。程序集A使用程序集B中的方法。之後,我們將程序集B中的方法標記爲過時,這會在編譯程序集A時導致編譯時錯誤。

到目前爲止沒有問題,但問題是舊程序集A是否繼續與新的B組合還是不合作?謝謝

回答

13

這取決於你在做什麼。 [Obsolete]屬性爲主要爲供編譯時使用,但請注意,運行時的某些部分在存在時具有不同的行爲(請參見下文)。它可能會導致問題,即使是現有的代碼不重建,所以我們必須得出結論,編號[Obsolete]不僅僅在編譯時檢查。

例如,下面的代碼會寫Foo但不Bar

using System; 
using System.Xml.Serialization; 
public class Data 
{ 
    public int Foo { get; set; } 
    [Obsolete] public int Bar {get;set;} 

    static void Main() 
    { 
     var data = new Data { Foo = 1, Bar = 2 }; 
     new XmlSerializer(data.GetType()).Serialize(Console.Out, data); 
    } 
} 

XmlSerializer是一個運行時過 - 不是編譯器的一部分)

+0

感謝您的詳細回覆Marc。 – mkus 2010-05-28 13:40:58

+0

我遇到了這個問題。我在Web服務中用[Obsolete]標記了一些枚舉條目。使用該服務的客戶端將不再在運行時接收這些枚舉條目。但是網絡引用仍然會包含它們。這看起來像是我的序列化中的一個錯誤 - 或者充其量只是一個糟糕的設計決策。在我看來,賦予這個標誌運行時的意義完全失敗了。 – LOAS 2012-09-03 05:57:52

6

構建一個使用另一個程序集標記爲Obsolete的方法的程序集會導致編譯時警告(除非您將'顯示警告顯示爲錯誤')。

沒有什麼能阻止你使用這種方法,而它仍然在引用程序集中。 Obsolete屬性是圖書館開發人員的一種方式,讓圖書館使用者知道他們應該使用不同的方法來實現他們需要的東西。

要回答你的問題,是的,舊的裝配A將繼續與新的裝配B.工作(提供程序集的版本保持不變)

+0

+1打我給它。 – 2010-05-28 12:17:16

+2

這在所有情況下都不能保證;看到我的回覆爲什麼...... – 2010-05-28 12:26:23

+0

'[Obsolete(「nitpicking」,true)]'應該會在編譯時給你一個錯誤,如果直接引用,即使你的_display警告爲errors_ disabled。 – mbx 2014-02-27 13:27:54