2013-03-18 28 views
0

你覺得呢? 我正在嘗試創建一個log方法。我想知道如何使用以下調用語法來定義它:如何使用自定義調用語法「using」或「try」或「catch」或「set」來定義方法?

logging(var loggerContext = new LogManager(input)){ // create a new logger context and store input 

    //var results = Method(); 

} // store results in logger context 

如何實現日誌記錄?

+1

爲什麼想要到一個新的關鍵字添加到語言?即使你可以這樣做,它會使代碼變得不易移植,除了你(用你編寫的自定義編譯器),任何人都無法支持它。有一個記錄器對象的方法在它上面有什麼問題? – David 2013-03-18 13:57:03

+1

這不是'C#'可能的,你不能定義自定義語言的語法,類似'using' – 2013-03-18 13:57:04

+2

我認爲你正在嘗試使用不存在語言的一個特徵。 – 2013-03-18 13:57:35

回答

3

另一種模式我經常使用的是這樣的:

void WithLogging(Action action) 
{ 
    // set up logging here 
    action(); 
    // save results here 
} 

然後你可以使用它像這樣:

WithLogging(() => 
{ 
    //do some things here 
}); 
0

有時是有道理的實施IDisposable在構造這樣的情況下與自定義邏輯和Dispose方法:

class Logmanager : IDisposable 
{ 
    public Logmanager() 
    { 
     this.Log("Start"); 
    } 

    private void Log(string message) 
    { 
     // some logging implementation 
    } 

    public void Dispose() 
    { 
     this.Log("Finish"); 
    } 
} 

然後你可以把它放在using聲明:

using (var logger = new Logmanager()) 
{ 
    // you can add something to logger here, e.g. store results 
} 
+1

我不認爲任何會閱讀這段代碼的人會說它確實有道理。 – aush 2013-03-18 14:06:36

+0

謹慎解釋?我在很多項目和圖書館都看到了這種方法。不肯定這是適合記錄的目的,雖然,但至少它不需要增加新的C#構造) – 2013-03-18 14:10:46

+0

我將與阿富汗麪湯同意,去遠一點:我認爲這是有害的。 using語句與清理資源相關聯。 「重載」這個含義使得你的代碼不易讀,更容易混淆。 – 2013-03-18 14:11:24

1

正如其他海報注意到,定義新的關鍵字並不是你在C#中可以做到的。你可能會發現Boo有趣,特別是宏。