2016-01-14 52 views
0

我的庫有一些方法,它的返回值不應該被丟棄。作者,即使對我來說,泄漏它們也是一個非常流行的錯誤。所以我希望編譯器在程序員提醒時提醒。確保方法返回值不會丟棄用於庫

這樣的值可以被存儲或用作另一種方法的參數。這不是嚴格使用存儲的值,但如果簡單地丟棄它是100%的錯誤。

是否有任何簡單的設置方式來爲我的圖書館用戶強制執行此操作?

var x = instance.Method(); // ok 
field = instance.Method(); // ok 
instance.OtherMethod(instance.Method()); // ok 
MyMethod(instance.Method()); // ok, no need to check inside MyMethod 
instance.Method(); // callvirt and pop - error! 

我想過讓IL分析儀,用於生成後事件,但感覺像這樣過於複雜...

+0

你想達到什麼目標? var x = instance.Method();'比'instance.Method();'更好,在變量'x'在賦值之後永遠不會被讀取的場景中嗎?如何通過反射來調用方法,並忽略返回值? – dasblinkenlight

+0

@dasblinkenlight 1)目標是防止難以調試的錯誤。 2)這不是關於安全性,反射是好的 – Vlad

+1

我強迫自己一次通過使用out參數來處理這種情況。不漂亮,但有效。 – Stefan

回答

0

Nicolai的答案啓用了任何類型的規則集,但我只需要此檢查僅適用於我的庫類型(我不想強制我的庫用戶對其所有代碼應用規則集)。

根據註釋中的建議使用無處不在使庫使用變得困難。

因此我選擇了另一種方法。

  1. 在終結器中,我檢查是否有任何方法被調用(這足以讓我確認使用情況)。如果沒有 - InvalidOperationException。對象創建StackTrace可選地被記錄並附加到錯誤消息中。
  2. 用戶可能會調用SetNotLeaked()以遞歸方式禁用特定對象和所有內部對象的檢查。

這不是編譯時檢查,但它肯定會被注意到。

這不是一個非常優雅的解決方案,它打破了一些準則,但它做什麼,我需要的,不會使用戶查看通過不必要的警告(規則集解決方案),並不會影響代碼的整潔(出來)。

對於測試中,我不得不做出一個基類,我設置Appdomain.UnhandledException處理程序SetUp方法和檢查(GC.Collect後)任何異常是否是在TearDown拋出,因爲終結是從另一個線程調用和NUnit否則顯示測試的通過。

1

如果實現Code Analysis/FxCop的,規則CA1806 - 不要忽略方法結果會涵蓋這種情況。

參見:How to Enable/Disable Code Analysis for Managed Code

基本上,這是因爲要到項目文件,代碼分析選項卡,選中複選框,選擇什麼樣的規則錯誤/警告的那樣簡單。

enter image description here

基本上勾選複選框@ 1,然後用2得到一個窗口,在這裏你可以配置規則集文件(這可以是一個你的庫或更多的東西的全球之間共享(如果你有一個構建服務器,確保其儲存的地方構建可以得到,即與源不是本地計算機上)

這裏與我的意思是規則的規則集。

enter image description here

+0

1.您的鏈接「代碼分析」未打開。 2.我怎樣才能爲我的圖書館「實施」它?或者你的意思是在全球範圍內啓用此規則? – Vlad

+0

@Vlad我檢查了鏈接,他們再次工作,無論是與MSDN解決了自己。 – NikolaiDante