2010-11-25 15 views
5

Je suis la mise à niveau d'un système et je passe par un autre code de développeurs (ASP.NET en C#).Est-ce que ce code est redondant?

je suis tombé sur ceci:

private ReferralSearchFilterResults ReferralsMatched 
{ 
    get 
    { 
     if (Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] == null || Session[SESSION_REFERRAL_SEARCHFILTERRESULTS].GetType() != typeof(ReferralSearchFilterResults)) 
      return null; 
     else 
      return (ReferralSearchFilterResults)Session[SESSION_REFERRAL_SEARCHFILTERRESULTS]; 
    } 
    set 
    { 
     if (value == null) 
     { 
      Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] = value; 
     } 
     else if (value.GetType() == typeof(ReferralSearchFilterResults)) 
     { 
      Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] = value; 
     } 
    } 

} 

vérifie le type du setter inutile? Sûrement, si je définissais la propriété à autre chose qu'un objet ReferralSearchFilterResults, le code ne serait même pas compiler? Est-ce que je manque quelque chose ou suis-je raison de penser cela peut être réalisé en utilisant simplement:

set 
{ 
    Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] = value; 
} 
+0

:) Je serais plus inquiet de savoir pourquoi une valeur de propriété est stockée dans une variable de session. À moins que je manque quelque chose ici. –

+0

Ceci est une mauvaise pratique IMO. Personne n'aime les propriétés smartass qui décident de leur propre chef de ne pas faire ce que vous leur avez demandé de faire, et ne vous préviennent même pas à ce sujet. – Groo

Répondre

3

Le code d'origine empêche toute sous-classes de ReferralSearchFilterResults d'être ou de fixer ou de la propriété. C'est parce que value.GetType() va retourner le Type réel de l'objet référencé par value. Si ce Type est une sous-classe de ReferralSearchFilterResults, il ne sera pas égal à typeof(ReferralSearchFilterResults).

Je ne suis pas sûr de votre contexte ici, donc je ne peux pas vous dire si c'est un comportement correct ou non. Si c'est le comportement prévu, il sent un peu sale car il ignorera silencieusement toutes les affectations de sous-classes. Mais je ne peux pas vraiment juger sans plus de contexte.

+0

Je ne savais pas qu'une sous-classe pouvait être définie sur une propriété de type classe parent, je pensais que c'était l'inverse - peut-être que je devrais faire un peu plus de lecture. De toute façon, j'ai appris quelque chose de cette réponse et j'ai donc accepté comme réponse. – Jamie

+0

Les propriétés ne sont pas spéciales dans la façon dont elles gèrent l'héritage et le polymorphisme. Tout comme une variable locale ou un champ, vous pouvez affecter une sous-classe à une référence de son type de base. –

3

Je pense que vous avez raison - le poseur ne doit pas compiler si elle est fournie avec quelque chose de qui ne peut pas être implicitement à une ReferralSearchFilterResults.

0

Je peux comprendre le type de vérification dans le bit get, mais comme vous le dites, dans le setter, vous ne pouvez pas passer dans tout ce qui n'est pas un ReferralSearchFilterResults, car le code échouerait au moment de la compilation.

(Peut-être une vieille habitude, l'autre développeur a)

+0

En effet, il semble que ce type utilise beaucoup de langues faiblement typées. –

3

Pour la partie get, vous pouvez utiliser

return Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] as ReferralSearchFilterResults; 

Cela renvoie la valeur si elle peut être casté en ReferralSearchFilterResults, sinon null.

1

Jamie vous avez raison. La vérification de type sur le Setter n'est pas nécessaire dans ce cas car valuedoit être un ReferralSearchFilterResults.

Un autre changement que vous pourriez envisager est d'utiliser les mots-clés is et as au lieu de comparer Type objets.

private ReferralSearchFilterResults ReferralsMatched 
{ 
    get 
    { 
     if (Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] == null || !(Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] is ReferralSearchFilterResults)) 
      return null; 
     else 
      return Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] as ReferralSearchFilterResults; 
    } 
    set 
    { 
     Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] = value; 
    } 

} 
+0

Comme noté par Rik, vous pouvez simplement utiliser comme dans le getter. –

+0

@Nathan Taylor: Je ne comprends pas la partie exception. Vous pourriez écrire 'FilterResults fr = null en tant que FilterResults' et il ne lancerait pas d'exception. C'est pourquoi vous utilisez le mot clé 'as' en premier lieu. Où exactement cette exception serait-elle lancée? – Groo

+0

@Nathan: qu'est-ce qu'un objet "non-initialisé", exactement? Et quelle exception serait lancée, précisément? – Groo

1

variables de session sont l'objet de type, de sorte que vous pouvez stocker quoi que ce soit à l'intérieur de ceux-ci. Mais dans ce cas, le setter lui-même empêche le programmeur d'affecter un autre type d'objet que ReferralSearchFilterResults et les objets dérivés. Donc le chèque, comme vous l'avez souligné, n'est pas nécessaire. De plus, il ne permet pas à un programmeur d'assigner un objet dérivé de ReferralSearchFilterResults. Mais j'utiliserais Session.Remove plutôt que de simplement définir la variable sur null, car la variable de session existerait toujours dans le contexte http si elle était définie sur null uniquement.

Alors:

set 
{ 
     if (value == null) 
      Session.Remove(SESSION_REFERRAL_SEARCHFILTERRESULTS); 
     else 
      Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] = value; 
}