2010-04-13 79 views
3

在C#中可以這樣做嗎?反向?運算符

logger != null ? logger.Log(message) : ; // do nothing if null

logger !?? logger.Log(message); // do only if not null

回答

5

:)

if (logger!=null) logger.Log(message); 

不......遺憾的是這樣的操作符不存在。

+1

*聯合國*幸運? – mpen 2010-04-13 06:10:58

+1

是的。對於HeavyWave而言,這很不幸,因爲這正是他所期待的。 – 2010-04-13 07:02:43

6

你想成爲太聰明......只需使用一個if

if(logged != null) logger.Log(message); 
+0

工作太多:) – 2010-04-13 05:43:37

7

號你能來最接近的可能是通過一個空對象設計:

(logger ?? NullLogger.Instance).Log(message); 

哪裏NullLogger.Instance是一個記錄器,它只是沒有運行它的所有方法。 (當然,如果你需要默認行爲而不是沒有選擇的行爲,你可以用一個合適的Logger.Default或者其他的代替NullLogger.Instance來代替)。

3

或者,如果你喜歡令人驚訝同事,你可以使用一個擴展方法:

public static void Log(this Logger logger, string message) 
{ 
    if(logger != null) 
     logger.ReallyLog(message); 
} 

,只是做

logger = null; 
logger.Log("Hello world, not."); 
+0

嘿,那很好。 – 2010-04-13 05:50:55

+2

我認爲你的同事應該(正確地)在代碼審查中指導你做這樣的事情。 :) – 2010-04-13 05:57:08

+1

這很好,但不起作用(至少當我嘗試它)。 Logger.Log方法優先於擴展方法,所以最終會出現NullReferenceException。當然你可以通過重命名擴展方法SafeLog或類似的東西來解決這個問題。 – itowlson 2010-04-13 05:59:38