2010-06-08 15 views
10

¿Hay alguna desventaja de una clase como?C# Desventaja de ajuste Valor inicial en la Declaración

UPDATE:
Session [ "usuario"] se encuentra en el Global.asax Session_Start. Entonces si esto falla Nada debería funcionar de todos modos.

+0

¿Se ha inicializado la sesión? – ANeves

+0

pregunta de actualización – BuddyJoe

+0

uno de mis usos favoritos del operador coalescente UserId = (cadena) Session ["user"] ?? "0"; – kenny

Respuesta

5

Su problema más grande es si este protected string UserId = (string)Session["user"]; falla. No tienes ningún recurso para degradar con gracia. Poniéndolo en el constructor, etc. Puede verificar la Sesión y tomar una decisión sobre qué hacer.

Como regla general, solo intento y pongo valores que sé que van a tener éxito como UserId = -1; etc. y luego los modifico en un bloque de código cuando sea necesario. Nunca se sabe cuando algo va a salir mal y hay que recuperarse de él.

2

El inconveniente principal es que solo puede establecer el valor con una sola instrucción. Si, por ejemplo, deseaba verificar que existiera la clave de sesión y, de no ser así, quería asignarle un valor, entonces no podría hacerlo estableciendo el valor inicial.

2

Si ingresa el depurador, la configuración del valor en la declaración (Ejemplo 1) ocurre antes de que se llame al constructor, por lo que debe asegurarse de que no se base en nada configurado desde el constructor.

+0

Buen punto. Recordaré verificar estas situaciones +1 – BuddyJoe

1

Recomiendo usar un modelo "seguro".

UserId = Session["user"] as string; 

De esta manera, si el artículo que la sesión no existe, o no es una cadena, que nunca faltan. Simplemente obtiene un nulo, que puede probar antes de usar UserId.

+3

La transmisión segura se usa demasiado en situaciones como esta. Si no es una cadena, me imagino que probablemente quieras un error. Está escribiendo el código en primer lugar, y está esperando una cadena, por lo que si no es una cadena, debería plantearse como un problema que debe corregirse. He visto demasiados sistemas que demuestran un comportamiento extraño porque el tipo incorrecto se almacenó en alguna parte, y el yeso seguro oculta el verdadero error y lo hizo parecer un error variable no inicializado. Solo mis dos centavos. –

+0

Su comentario (añadido después de su respuesta) señala que 'Session [" user "]' * must * debe ser una cadena, por lo que una excepción sería mejor cortar un problema de raíz – STW

+0

Elevar una excepción siempre debe ser una opción , siempre que sepa que una excepción es posible. Quizás sea correcto dejar volar la excepción en este caso, pero también, quizás no. Safe casting te da una elección. –

1

AFAIK, no hay diferencia real entre los inicializadores de valores en línea y la inicialización del constructor, excepto en el orden de ejecución de los enunciados, y el hecho de que está muy restringido a sentencias de línea única en el código en línea.

El orden de ejecución es que los inicializadores de valor se ejecutan antes de cualquier lógica de constructor, en un orden no específico, por lo que si alguna de las instrucciones de inicialización tiene efectos secundarios, puede que tenga sorpresas desagradables. Sin embargo, se garantiza que ese código se ejecutará, por lo que no existe la posibilidad de agregar un constructor adicional más tarde y olvidarse de inicializar algún campo.

Prefiero usar constructores (encadenados) para la inicialización en línea, porque creo que el código es más legible de esa manera, y también puedo hacer comprobaciones adicionales que puedan ser necesarias en el futuro.

0

La guía que utilizo: Use los inicializadores de campo para valores básicos conocidos en el tiempo de compilación. Si está haciendo algo así como buscar una colección global o alguna lógica no trivial, muévala al codificador (para el manejo/recuperación de errores como han señalado otros).

Suponiendo que usted está seguro de que no habría ningún error, el alza

  • : inicializadores de campo son fáciles de leer.
  • desventaja: si tiene un grupo de inicializadores de campo y múltiples ctors, la IL para los inicializadores se insertará en la parte superior de cada ctor que conduce a IL bloat. Entonces, en este caso, llamar a un método Initialize like sería mejor.

Aparte de eso, no veo ningún inconveniente en los inicializadores de campo.

0

Es difícil saber cómo empezar a decir que no es una buena idea por muchas razones. La primera sesión debe ser una variable global; de lo contrario, su código ni siquiera se compilará. Supongo que la Sesión en su contexto aquí es la System.Web.HttpContext.Current.Session, entonces, su código ni siquiera se compilará. Supongamos que tiene Session como variable global, entonces debe inicializarla adecuadamente y asignar Session ["user"], entonces, ¿cómo lo va a hacer? Luego creas esta dependencia entre tu clase y la sesión, entonces, ¿cómo pruebas tu unidad? Además de todas las otras razones de todas las otras respuestas.

0

Es posible que algún día desee un segundo constructor con un valor diferente de UserId.

0

AFAIK el constructor siempre se invoca después de que se inicialicen todos los campos. Por lo tanto, en el Ejemplo 2, primero está inicializando el campo en Null y luego en (string)Session["user"].

Cuestiones relacionadas