2010-04-13 7 views
3

Est-il possible de faire quelque chose comme ça en C#?Inverser ?? opérateur

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

ou

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

Répondre

5

:)

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

... Non, malheureusement, un tel opérateur n'existe pas.

+1

* un * heureusement? – mpen

+1

Oui. Pour HeavyWave c'est malheureusement puisque c'est ce qu'il cherchait. –

6

Vous essayez d'être trop intelligent ... Il suffit d'utiliser un if:

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

Trop de travail :) –

7

Non, le plus proche, vous pouvez venir est probablement via un plan d'objet nul:

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

où NullLogger.Instance est un enregistreur qui n'opère pas toutes ses méthodes. (Bien sûr, si vous avez besoin du comportement par défaut pour faire quelque chose plutôt que de ne pas opérer, vous pouvez remplacer un Logger.Default approprié ou autre au lieu de NullLogger.Instance.)

3

Ou, si vous aimez surprendre votre collègues, vous pouvez utiliser une méthode d'extension:

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

et juste faire

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

hey c'est sympa. –

+2

Je pense que vos collègues devraient (à juste titre) vous clouer dans un code de révision pour faire quelque chose comme ça. :) –

+1

C'est sympa, mais ça ne marche pas (du moins quand je l'essaie). La méthode Logger.Log a la priorité sur la méthode d'extension, de sorte que vous vous retrouvez avec une exception NullReferenceException. Bien sûr, vous pouvez contourner ce problème en renommant la méthode d'extension SafeLog ou quelque chose comme ça. – itowlson