2010-11-25 13 views
5

Estoy actualizando un sistema y estoy pasando por otro código de desarrollador (ASP.NET en C#).¿Es este código redundante?

me encontré con esto:

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; 
     } 
    } 

} 

está comprobando el tipo en el colocador innecesario? Seguramente, si configuro la propiedad a algo que no sea un objeto ReferralSearchFilterResults, ¿el código ni siquiera se compilaría? Me estoy perdiendo algo o estoy derecho a que esto puede lograrse sólo mediante el uso:

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

:) Me preocuparía más por qué el valor de una propiedad se almacena en una variable de sesión. A menos que me falta algo aquí. –

+0

Esto es una mala práctica IMO. A nadie le gustan las propiedades inteligentes que deciden por sí mismas que no deben hacer lo que les pediste que hagan, y ni siquiera te informan sobre eso. – Groo

Respuesta

3

El código original impide cualquier subclase de ReferralSearchFilterResults de ser o llegar a establecer o de la propiedad. Esto es porque value.GetType() devolverá el Type real del objeto al que hace referencia el value. Si ese tipo es una subclase de ReferralSearchFilterResults, entonces no será igual a typeof(ReferralSearchFilterResults).

No estoy seguro de su contexto aquí, así que no puedo decir si ese es el comportamiento correcto o no. Si se trata de un comportamiento intencionado, huele un poco sucio ya que ignorará silenciosamente cualquier asignación de subclases. Pero realmente no puedo juzgar sin más contexto.

+0

No sabía que una subclase podría establecerse en una propiedad de tipo clase primaria, pensé que era al revés, tal vez tenga que leer un poco más. De todos modos, aprendí algo de esta respuesta y, por lo tanto, acepté como respuesta. – Jamie

+0

Las propiedades no son especiales en la forma en que manejan la herencia y el polimorfismo. Al igual que una variable local o un campo, puede asignar una subclase a una referencia de su tipo base. –

3

creo que tienes razón - la incubadora no debe compilar si se les proporciona algo de que no se puede emitir de forma implícita a una ReferralSearchFilterResults.

0

Puedo entender la comprobación de tipo en el bit de obtención, pero como dices, en el setter, no puedes pasar nada que no sea un ReferralSearchFilterResults, ya que el código fallaría en el momento de la compilación.

(podría ser algún hábito de edad, el otro desarrollador tenía)

+0

De hecho, parece que ese tipo usó muchos lenguajes débilmente tipados. –

3

Para la parte get, puede utilizar

return Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] as ReferralSearchFilterResults; 

Esto devuelve el valor si se puede lanzar a ReferralSearchFilterResults, de lo contrario null.

1

Jamie Estás en la razón. La comprobación de Tipo en Setter no es necesaria en este caso porque valuedebe ser un ReferralSearchFilterResults.

Otro cambio que podría considerar es utilizar las palabras clave is y as en lugar de comparar los objetos Type.

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

Según lo observado por Rik, podrías usarlo como en el getter. –

+0

@Nathan Taylor: No entiendo la parte de la excepción. Podrías escribir 'FilterResults fr = null como FilterResults' y no arrojaría una excepción. Es por eso que usas la palabra clave 'as' en primer lugar. ¿Dónde exactamente se arrojaría esta excepción? – Groo

+0

@Nathan: ¿qué es un objeto "no inicializado", exactamente? ¿Y qué excepción se lanzaría, precisamente? – Groo

1

Las variables de sesión son del tipo objeto, por lo que puede almacenar cualquier cosa dentro de ellas. Pero en este caso el colocador impide que el programador le asigne otro tipo de objeto que ReferralSearchFilterResults y los objetos derivados. Entonces el cheque, como usted señaló, es innecesario. Además, no permite que un programador asigne un objeto derivado de ReferralSearchFilterResults.

Pero yo usaría Session.Remove en lugar de solo establecer la variable en nulo, porque la variable de sesión todavía existiría en el contexto http si solo se establece en nulo.

Así:

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