martes, 15 de diciembre de 2009

Curso de Programación C #: Modificadores de alcance, Constructores y Destructores

Alcance
El alcance delimita que regiones de código pueden referenciar un elemento del programa, los modificadores de acceso son los que definen el alcance de los miembros de la clase y son:
Capacidad de Acceso Significado
public El acceso no se encuentra restringido
protected El acceso está limitado a la clase actual, así como a las clases que hereden de ella
internal El acceso está limitado al proyecto actual
internal protected El acceso está limitado al proyecto actual, así como a los tipos derivados de ella private El acceso está limitado a la clase actual
Reglas
Los espacios de nombre siempre son públicos (implícitamente).
Las clases siempre son públicas (implícitamente).
Los miembros de clase son privadas por predeterminación.
Todo esto a menos que se agregue un modificador de alcance para variar la capacidad de acceso el elemento.
Recomendaciones
Solo deben hacerse públicos aquellos datos que los usuarios de su clase necesiten ver, aunque siempre es más recomendable en medida de lo posible el uso de atributos para acceder a dichos valores, NO DECLARE COMO PUBLICA UNA VARIABLE A MENOS QUE SEA E-S-T-R-I-C-T-A-M-E-N-T-E necesario. Para los efectos del curso se tratarán las variables de una manera no completamente segura por razones de legibilidad del código, pero una vez que obtengan más experiencia deben evitarlo.

Constructores y Destructores
Los constructores nos permiten inicializar la memoria y convertirla en un objeto listo para usarse, pero ahi ciertas reglas:
+ El Constructor Inicializa la memoria y la convierte en un objeto utilizable
+ Si no se especifica un constructor:
- El compilador genera un constructor predeterminado
- Accesibilidad pública
- Mismo nombre que el de la clase
- Sin tipo de retorno, ni siquiera null
- No espera argumentos
- Inicializa todos los campos en cero, falso o nulo
+ Si se especifica un constructor
- Se invoca cuando se inicializa el objeto
- Se puede sobrecargar
Caracteristicas del Constructor Predeterminado:
+ Todos los campos se inicializan con cero
- Campos numéricos (int, double, decimal, etc..) se inicializan a cero.
- Campos bool se inicializan en false.
- Tipos de referencia(como los objetos) se inicializan en null.
- Tipos struct se inicializan para contener valores de cero.
+ Accesibilidad pública

No siempre es recomendable el utilizar el constructor predeterminado, por ejemplo, no siempre es bueno el hecho de que el acceso sea público o quizás sea un problema el hecho de que se inicialicen a 0 ciertos valores, así mismo el código invisible es dificil de mantener, el código del constructor predeterminado es invisible. Debemos recordar que aunque los constructores son tipos especiales de métodos eso no implica que no puedan ser sobrecargados.

Ejemplo:
class Persona
{
public Persona( ) //Constructor personalizado
{
Nombre = "";
Apellido = "";
Console.WriteLine("Objeto Construido");
}
public string ObtenerNombreCompleto()
{
return ( Nombre+" "+Apellido );
}
public string nombre
{
get{ return Nombre; }
set{ Nombre = value ; }
}
public string apellido
{
get{ return Apellido; }
set{ Apellido = value; }
}
private string Nombre,Apellido;
}

Algo importante es que podemos modificar la accesibilidad de un constructor.
Constructores privados: Se utilizan para evitar que los objetos se creen a partir de una clase especifíca, imaginemos que desea crear una clase que provea cierta funcionalidad, pero no desea que los usuarios de esa clase puedan crear objetos con base en ella, bueno en este caso ponemos metodos y variables estáticas dentro de la clase, en este caso ya no es necesario crear instancias de la clase (objetos), sin embargo el constructor predeteminado es public por predeterminación, lo cual implica que SI se pueden crear instancias de esa clase, aunque dichos objetos no tendrán ningún sentido ya que la clase está compuesta únicamente de métodos y variables estáticas, para evitar esto basta con modificar la accesibilidad del constructor haciendolo private impidiendo que se creen instancias de la clase. Al declarar un constructor C# no generará ningún constructor y al hacerlo privado evita que se creen instancias de esa clase.
Constructores estáticos: Se emplean para asegurarse de que una clase siempre es inicializada antes de utilizarse, esto nos asegura que la clase se encuentra en un estado inicial bien definido antes de utilizarse.

Destructores y Terminadores
Provocan que las acciones finales de los objetos sean diferentes y no pueden ser determinadas por recolección de residuos, así mismo todos los objetos en la plataforma .NET tienen un método de Finalizar, si está presente, la recolección de residuos llamará al Destructor antes de reclamar la memoria binaria, en C# no se puede llamar o sobrescribir Object.Finalize. Un destructor es un mecanismo de limpieza de memoria.


Finalización
Cuando el recolector de basura libera los recursos utilizados por un objeto no referenciado, verifica primero si la clase del objeto no tiene un destructor o método Finalize propio, si la clase cuenta con uno el será invocado antes de reciclar la memoría a la pila. Las instrucciones escritas en el destructor o método Finalize son únicamente para esa clase.

Destructores
En C# el método Finalize no está disponible de manera directa y no puede ser invocado y/o cancelado, se deberá colocar código para que sea ejecutado durante la finalización dentro de un estructor, dicho destructor tendrá el nombre de la clase antecedido por el simbolo ~. Ejemplo:
Puede escribir un destructor para implementar la limpieza de un objeto. En C#, el método Finalize no está disponible directamente, y no puede invocar o cancelar el método Finalize. Debe colocar código para que sea ejecutado durante la finalización dentro de un destructor.
class Persona
{
public Persona( ) //Constructor personalizado
{
Nombre = "";
Apellido = "";
Console.WriteLine("Objeto Construido");
}
~Persona()
{
Console.WriteLine("Objeto Destruido");
}
public string ObtenerNombreCompleto()
{
return ( Nombre+" "+Apellido );
}
public string nombre
{
get{ return Nombre; }
set{ Nombre = value ; }
}
public string apellido
{
get{ return Apellido; }
set{ Apellido = value; }
}
private string Nombre,Apellido;
}

No hay comentarios:

Publicar un comentario