2010-08-03 35 views
4

我正在創建一個內部類來爲合同模式提供構造。隱藏等於和ReferenceEquals

using System; 
using System.Runtime.Serialization; 

namespace DCS2000.Common35.Core 
{ 
    public class Assertion 
    { 
    public static void Ensure(bool test) 
    { 
     if (!test) 
     { 
      throw new PreconditionException("Precondition test failed"); 
     } 
    } 

    public static void Ensure(object obj) 
    { 
     if (obj == null) 
     { 
      throw new PreconditionException("Precondition null object failed"); 
     } 
    } 

    public static void Require(bool test) 
    { 
     if (!test) 
     { 
      throw new PostconditionException("Postcondition test failed"); 
     } 
    } 

    public static void Require(object obj) 
    { 
     if (obj == null) 
     { 
      throw new PostconditionException("Postcondition null object failed"); 
     } 
    } 
    } 
} 

當開發人員去使用他們將在智能感知認爲這些選項:

  • 確保
  • 的Equals
  • 的ReferenceEquals
  • 要求

這是混亂,我想知道是否有一個隱藏Equals和ReferenceEquals的方法。

注:我已經嘗試過這一點,但它並沒有爲我工作:

[EditorBrowsable(EditorBrowsableState.Never)] 
    public override bool Equals(object obj) 
    { 
     return base.Equals(obj); 
    } 

回答

2

用途:

[EditorBrowsable(EditorBrowsableState.Never)] 
    public override bool Equals(object obj) 
    { 
     throw new Exception("Assertion does not implement Equals, use Ensure or Require"); 
    } 

    [EditorBrowsable(EditorBrowsableState.Never)] 
    public new bool ReferenceEquals(object objA, object objB) 
    { 
     throw new Exception("Assertion does not implement ReferenceEquals, use Ensure or Require"); 
    } 

這將隱藏成員如果開發商擁有適當VS設定的設置,將立即通知,唉在運行過程中,他們不適當地使用等於或的ReferenceEquals開發商,應該他們無意中在代碼庫中使用它。

+0

這工作很好!謝謝。我發現在我最常用的對象中找到未使用的方法非常有用 - 特別是如果它使用流暢的界面。 – smdrager 2012-06-06 13:43:05

-2

說實話,我認爲任何人誰喜歡給自己一個.NET開發人員應使用圍繞具有這些方法和在不需要時忽略它們。

如果你真的想隱藏他們,如果他們都重寫(我忘了,如果ReferenceEquals是因爲我從來沒有使用過它),你可以重寫他們作爲private override

好的,這是行不通的。現在我看了一下,private override是沒有意義的,protected override也是不完全允許的,private newprotected new做了新的方法,而基類方法仍然可以訪問。我不認爲你可以使用訪問修飾符隱藏它們。

而且看起來整個事情都是關於靜態方法的。哎呀,我真的失敗了。

+0

私人覆蓋?我可以發誓*不能*改變覆蓋的保護級別。 – 2010-08-03 14:41:42

+1

'私人新...' – 2010-08-03 14:43:02

+0

@Kirk:真的嗎?我在想C++嗎?讓我檢查... – 2010-08-03 14:43:52

4

要添加到Matti的答案,EditorBrowsableState.Never取決於選項,文本編輯器,C#,常規下用戶的Visual Studio設置。

只有當用戶打開「隱藏高級成員」時纔會生效。 Visual Studio默認顯示所有成員。

+0

而且使用這個的程序集無法在解決方案中加載 - 您必須引用已編譯的DLL。 – smdrager 2012-06-06 13:43:59