2010-04-20 7 views
8

Je vais donc par l'ancien code (2.0) et je suis tombé sur ceci:Utilisation de "as bool?" au lieu de « quelque chose = objet ViewState [ » salut « ] »

object isReviewingValue = ViewState["IsReviewing"]; 

if (isReviewingValue is bool) 
{ 
    return (bool)isReviewingValue; 
} 

Ma première pensée nous était la « comme » mot-clé pour éviter les inutiles

(bool)isReviewingValue; 

Mais "as" ne fonctionne qu'avec les types sans valeur. Pas de problème, je suis allé de l'avant et a fait:

bool? isReviewingValue= ViewState["IsReviewing"] as bool?; 
if (isReviewingValue.HasValue) 
{ 
    return isReviewingValue.Value; 
} 

Question est: En plus de la recherche un peu plus facile à lire, est-ce mieux en fait?

EDIT:

public Stopwatch AsRun() 
{ 
    Stopwatch watch = new Stopwatch(); 

    watch.Start(); 
    for (Int32 loopCounter = 0; loopCounter < 10000; loopCounter++) 
    { 
    Object value = true; 
    Boolean? test = value as Boolean?; 
    if (test.HasValue) 
    { 
     Boolean something = test.Value; 
    } 
    } 
    watch.Stop(); 

    return watch; 
} 

public Stopwatch ObjectIsRun() 
{ 
    Stopwatch watch = new Stopwatch(); 

    watch.Start(); 
    for (Int32 loopCounter = 0; loopCounter < 10000; loopCounter++) 
    { 
    Object test = true; 
    if (test is Boolean) 
    { 
     Boolean something = (Boolean)test; 
    } 
    } 
    watch.Stop(); 

    return watch; 
} 

Réponse: Il s'avère que les méthodes ci-dessus fonctionnent en mode test, le code d'origine est d'environ 10 fois plus rapide.

+7

Je ne Comprenez pourquoi vous faites cela. Il n'y a pas d'amélioration. Ils contiennent le même nombre de lignes de code. Le second n'est pas plus clair que le 1er; en fait, il y a plus de «bruit» dans le second. Je dis laisser le premier seul. –

+0

Principalement parce qu'il semble vraiment idiot de taper comme objet, l'utilisation est, alors tapez back to boolean quand bool? J'en prendrai soin pour moi et me donne un moyen facile de vérifier si la valeur était booléenne en premier lieu (HasValue). Sachant que convertir des valeurs bool à null semble être un choix plus judicieux alors tout le tour de la chaîne à objecter à bool. –

+0

Cependant, cela étant dit, j'étais aussi curieux du point de vue de la performance. –

Répondre

5

Je pense que le premier est plus lisible, et il est plus rapide et [environ 10 nanosecondes par rapport à 100 nanosecondes, selon un test je viens de courir;) (ie ne va pas ralentir votre programme de toute façon)]

+0

Intéressant. C'est un peu ce que je cherchais. –

+0

Il s'avère qu'il est environ 10 fois plus lent de faire le second, comme vous l'avez dit. (J'ai testé un peu trop juste pour vérifier) ​​ –

0

C'est en fait un peu pire. Si la valeur dans "IsReviewing" n'est pas un bool ou null, votre code lèvera une exception. La version originale va simplement l'ignorer.

+1

Il a juste besoin d'ajouter une vérification null dans sa déclaration if et il est bon d'aller – juharr

+0

-1. isReviewingValue.HasValue * est une vérification nulle. – Jimmy

+1

** Quelle ** exception? – ANeves

0

Deuxièmement, mieux vaut, car si ViewState ["IsReviewing"] n'est pas un booléen, le mot clé le définit automatiquement comme nul. Dans la première option vous l'implémentez, vous ne pouvez pas le faire. Et le résultat ont dans le bon récipient.

0

Si dans le premier exemple vous êtes revenu nul autre, pourquoi ne pas utiliser ceci:

bool? MyMethod() 
{ 
    return ViewState["IsReviewing"] as bool?; 
} 
+0

Cela ne compilera pas. L'opérateur 'as 'ne peut être utilisé qu'avec des types nullables. – ChaosPandion

+0

Vous avez manqué le '?' bien sûr. – n535

+0

Down-vote enlevé :) – ChaosPandion

17

L'opérateur coalesce va supprimer du code pour vous. Pour répondre à votre question, comme Jimmy l'a dit très clairement, les différences techniques entre les deux sont minuscules, alors utilisez ce que vous préférez. Personnellement, je suis enclin à utiliser cette méthode. je pourrais être biaisé si ... envisageai

private bool GetIsReviewing() 
{ 
    return (ViewState["IsReviewing"] as bool?) ?? false; 
} 
+0

Seul problème est la valeur pourrait être faux. Est-ce que ça ne serait pas booléen? au lieu de bool aussi? –

+0

@Programmin Tool - Est-ce que cela clarifie un peu les choses? – ChaosPandion

0

Vous pouvez utiliser une approche de méthode d'extension générique pour ajouter le sucre syntaxique:

public static class TypecastExtensions { 
    public static T CastOrDefault<T>(this object o) where T : struct { 
     return o as Nullable<T> ?? default(T); 
    } 

    public static T CastOrDefault<T>(this object o, T defaultValue) where T : struct { 
     return o as Nullable<T> ?? defaultValue; 
    } 
} 

Utilisation:

bool isReviewingValue = ViewState["IsReviewing"].CastOrDefault<bool>(); 
Questions connexes