2010-03-24 12 views
5

Tengo dos objetos que se usarán principalmente dentro de una clase. Los inicializaré al principio y los usaré a lo largo de la vida del programa. Ahora, mi pregunta es si debería simplemente crearlos como variables globales y acceder a ellos en cualquier parte del código (en el lado de la clase individual) o debería crearlos como variables locales y pasarlos como parámetros a otras funciones. Solo quiero ver cuál sería la mejor práctica de programación.Acceso global frente a variables locales

Estoy usando C#.

Gracias.

Respuesta

5

En general, debe evitar las variables globales. Si es práctico, recomiendo mantenerlos como locales y pasarlos como parámetros a sus funciones.

Como Josh señaló, si estas variables son única utiliza dentro de una única instancia de la clase, a continuación, sólo debe hacer que los miembros privados (o protegidas) de esa clase y hacer con ella. Por supuesto, entonces solo podrían pasarse como parámetros a otros métodos con el mismo nivel de acceso (IE, privado).

Como alternativa, puede considerar usar el Singleton Design Pattern, que es un poco más limpio (y preferible) que usar globals.

+0

Supongo que debe evitar el uso de globales, y uso Singleton's todo el tiempo, pero ¿cómo se pueden crear variables globales en .NET? – Merritt

+0

Puede definir una variable 'Public Static' string/int/float/etc, que sería efectivamente global. Pero estoy de acuerdo, realmente no hay un concepto "global" en C# en comparación con otros idiomas como C. Quizás debería haber sido más claro al respecto en mi respuesta. –

+0

.Net admite variables globales e incluso métodos globales. Pero la sintaxis para C# no (esto probablemente sea algo bueno). –

2

Si el alcance de los objetos es la duración de la clase en la que se crean las instancias, entonces deben ser variables de miembros privados.

Si no mantienen el estado ellos mismos, entonces debe hacer que sean clases estáticas.

Debe todavía páselos como variables, o al menos cree accesos a propiedades para llegar al campo de respaldo. De esta forma puede cambiar los detalles de implementación sin explotar su código.

SOLID design principles son un buen lugar para comenzar a pensar en estas cosas.

0

Si los objetos serán los mismos para todas las instancias de la clase entonces

static const double PI = 3.14158; 
0

En general, usted debe utilizar métodos de acceso (por ejemplo, captadores y definidores) y mantener sus variables internas privado. De esta forma, el resto de su código, fuera de su clase, no depende de sus variables reales.

Ver this tutorial.

0

Si su clase depende de estos 2 objetos, probablemente deberían ser miembros de la misma clase. Algo como esto (en la que A es la clase que usted está hablando y B es uno de los objetos de inicializar:

public class A 
{ 
    private B _b; 

    public A(B b) 
    { 
     _b = b; 
    } 

    public void DoSomething() 
    { 
     //do something with _b; 
    } 

    private void DoSomethingElse() 
    { 
     //do something else with _b; 
    } 
} 

En este ejemplo A depende de B (por lo que se pasa la instancia de B en el constructor de A o a través de alguna dependencia marco de inyección). no tendría mucho sentido para todos los métodos de la clase A a necesitar un parámetro de tipo B ser pasado a ella.

2

tengo dos objetos que seré utilizar principalmente dentro de una sola clase.I los inicializará al principio y los usará durante toda la vida del programa .

Parece el momento perfecto para usar una variable private static readonly. Estos pueden inicializarse en su declaración, o puede crear un constructor estático para inicializarlos.

El hecho de que solo esté haciendo referencia a estos objetos en una sola clase es un punto clave. Hay otras formas mejores de hacer las cosas si estos objetos alguna vez se necesitan fuera de la clase individual.

0

Creo que en este caso debe preguntar qué tiene más sentido. ¿Hay algún tipo de relación entre los 2 objetos y la nueva clase? Además, con qué frecuencia se usan en la clase.

En general, si solo un par de métodos usan los objetos, páselos de otra forma, ejemplifíquelos como variables de nivel de clase (posiblemente utilizando un solo estático privado como sugiere Jefferey) y úselos en la clase. Hacer que el código sea más legible debe ser su objetivo aquí.

Cuestiones relacionadas