2009-10-12 42 views
3

我有許多類表示業務事務調用的類:執行適當的存儲過程。在C#中編寫靜態和非靜態方法時,如何避免「調用不明確...」錯誤?

現在這個樣子的:

public static class Request 
{ 
    public static void Approve(..) { 
     using(connection) { 
      command.Text = "EXEC [Approve] ,,"] 
      command.ExecuteNonQuery(); 
     } 
    } 
} 

我想給他們更多的線程安全:

public class Request { 
    public static void Approve(..) { 
     new Request().Approve(..); 
    } 

    internal void Approve(..) { 
     using(connection) { 
      command.Text = "EXEC [Approve] ,,"] 
      command.ExecuteNonQuery(); 
     } 
    } 
} 

但是,讓下一個錯誤信息:

電話是 以下方法或屬性之間不明確: 'MyNamespace.Request.Approve(..)'和 「MyNamespace.Request.Approve(..)」

我怎麼能強迫,標誌是我打電話非靜態,從靜態實例方法?

或者我不能這樣做,而不重命名的方法之一?或者將靜態方法移動到另一個類中,等等。

+3

您可能會對某些涉及C#中實例方法的靜態方法消歧的設計決策感興趣。規則看起來有點奇怪,但實際上他們是精心設計的。這是我最近在這方面寫的一篇文章:http://blogs.msdn.com/ericlippert/archive/2009/07/06/color-color.aspx – 2009-10-12 22:19:03

+0

@Eric Lippert Hello,Eric。非常感謝鏈接!我收到了很多新的信息。順便說一句我正在讀你的博客(蓋達爾的俄文翻譯) – abatishchev 2009-10-13 18:19:50

回答

3

如果您正在從實例撥打電話(例如requestVar.Approve()),則不需要重命名該實例。但是,可以使用Request.Approve()來調用靜態。

+1

是的,因爲你從'Request'類的一個實例調用'Approve()'。要明確地調用靜態方法,您可以執行Request.Approve()。無論如何,做一個靜態方法和一個具有相同簽名的實例方法會產生一個編譯器錯誤。 – mgbowen 2009-10-12 19:41:51

+0

你是對的,對不起,沒有仔細閱讀你的答案 – abatishchev 2009-10-12 19:44:34

+1

這是沒有問題的:)。但根據LBushkin的回答,您應該只需將內部方法重命名爲InternalApprove()或類似的東西,或者重新考慮您的類結構。 – mgbowen 2009-10-12 19:47:30

4

C# 允許 不允許通過實例引用調用靜態方法。因此 - 方法必須以不同的方式命名,或者使用參數重載來區分靜態方法和實例方法。

在您的示例中,由於Approve()方法是內部的,所以重命名它可能是最簡單的選項。

至於標記一種方法是靜態的......我(個人)認爲這個名稱是區分這兩者的完美手段 - 爲什麼要發明更復雜的東西。

+1

你的第一句話是錯誤的。 C#肯定不允許通過實例引用調用靜態方法。 – 2009-10-12 22:14:50

+0

確實。多麼尷尬。 – LBushkin 2009-10-13 01:26:13

相關問題