jump to navigation

Const Vs ReadOnly y Clases definidas como Static April 30, 2009

Posted by xdcarp in .NET, coding.
Tags: ,
trackback

Constantes

Una constante es un valor invariable durante toda la ejecución de la aplicación (web, consola, de escritorio). En C# se declaran anteponiendo la palabra const y el tipo debe ser uno de los tipos integrados del lenguaje (int, string, bool, byte, char, decimal, entre otros http://msdn.microsoft.com/es-ar/library/ya5y69ds.aspx) excluyendo System.Object.

Si tratamos de cambiar el valor de una constante obtendremos el siguiente error de compilación.

const int T = 0;

T = T + 1;

The left-hand side of an assignment must be a variable, property or indexer

No se puede crear una variable de un tipo definido por el usuario ya que obtendremos el siguiente error de compilación:

public const TipoParaPrueba NOCONSTANTE = new TipoParaPrueba(1, 2);

‘ConstVsStaticVsReadOnly.Program.NOCONSTANTE’ is of type ‘ConstVsStaticVsReadOnly.TipoParaPrueba’. A const field of a reference type other than string can only be initialized with null.

Una constante puede ser declarada como public, private, protected, internal o protectedinternal pero no puede ser declarada como static porque se obtiene el siguiente error de compilación:

static public const int NUM = 9;

The constant ‘ConstVsStaticVsReadOnly.Program.NUM’ cannot be marked static

Si definimos la clase del ejemplo, la constante HOY mantendrá el valor 30 durante toda la ejecución del programa.

class Program

{

const int HOY = 30;

static void Main(string[] args)

{

Console.WriteLine(“Hoy = “ + HOY);

Console.WriteLine(“Presione cualquier tecla para continuar…”);

Console.ReadKey();

Console.WriteLine(“Hoy + 1 = “ + (HOY+1));

Console.WriteLine(“Presione cualquier tecla para salir…”);

Console.ReadKey();

}

}

Cuando el compilador encuentra un identificador de constante en el código fuente de C# sustituye directamente el valor literal en el código de lenguaje intermedio (IL) que genera. Dado que no hay ninguna dirección de variable asociada a una constante en tiempo de ejecución, los campos const no se pueden pasar mediante referencia y no pueden aparecer como un valor literal en una expresión.

Si se quiere usar una constante definida en una clase distinta de aquella en la que fue definida se debe seguir la forma ClaseEnLaQueFueDefinida.Constante.

ReadOnly

A diferencia de una constante, un valor definido como readOnly puede ser inicializado al declararse y el valor no cambia durante la ejecución del programa, o puede ser inicializado una sola vez dentro del o de los constructores de una clase y su valor no varia durante toda la ejecución del programa. El siguiente ejemplo muestra lo descrito anteriormente:

class Program

{

static void Main(string[] args)

{

Prueba prueba1 = new Prueba();

Prueba prueba2 = new Prueba(20);

Prueba prueba3 = new Prueba(1,1);

Console.WriteLine(“Si creo una instancia de Prueba y muestro Var tiene el valor 10 = “ + prueba1.VAR);

Console.WriteLine(“Presione cualquier tecla para continuar…”);

Console.ReadKey();

Console.WriteLine(“Si creo un objeto con el constructor numero 2 Var tiene el valor pasado por parametro(20): “ + prueba2.VAR);

Console.WriteLine(“Presione cualquier tecla para continuar…”);

Console.ReadKey();

Console.WriteLine(“Si creo un objeto con el constructor numero 3 Var tiene como valor la suma de los parametros(1,1): “ + prueba3.VAR);

Console.WriteLine(“Presione cualquier tecla para salir…”);

Console.ReadKey();

}

}

class Prueba

{

public readonly int VAR = 10;

public int A { get; set; }

public int B { get; set; }

//constructor 1

public Prueba()

{

}

//constructor 2

public Prueba(int prueba)

{

this.VAR = prueba;

this.A = 1;

this.B = 2;

}

//constructor 3

public Prueba(int a, int b)

{

this.A = a;

this.B = b;

this.VAR = a + b;

}

public int Sumar()

{

return this.A + this.B;

}

}

Como las constantes, no se puede cambiar el valor de una variable declarada como readonly porque se obtiene el error de compilación:

public readonly int VAR = 10;

VAR = 15;

The left-hand side of an assignment must be an l-value

A diferencia de una constante, el tipo de una variable readonly puede ser una clase, struct o array y ser inicializado una vez en tiempo de ejecución (en un constructor) pero no una puede ser una enumeración.

Clases Static

Si definimos una clase como static, no podemos crear instacias suyas, es decir, no se puede usar la palabra reservada new para crear una instancia. Para hacer referencia a sus métodos, es necesario usar el nombre de la clase, como en el siguiente ejemplo:

class Program

{

static void Main(string[] args)

{

Console.WriteLine(“Valor del campo A: “ + Prueba.A);

Console.WriteLine(“Presione cualquier tecla para continuar…”);

Console.ReadKey();

Console.WriteLine(“Valor del campo B: “ + Prueba.B);

Console.WriteLine(“Presione cualquier tecla para continuar…”);

Console.ReadKey();

Console.WriteLine(“Suma 5 y 2: “ + Prueba.SumarDosNumeros(5,2));

Console.WriteLine(“Presione cualquier tecla para continuar…”);

Console.ReadKey();

Console.WriteLine(“Resta 7 menos 2: “ + Prueba.RestarDosNumeros(7, 2));

Console.WriteLine(“Presione cualquier tecla para salir…”);

Console.ReadKey();

}

}

static class Prueba

{

public static int A = 20;

public static int B

{

get

{

return 15;

}

}

public static int SumarDosNumeros(int a, int b)

{

return a + b;

}

public static int RestarDosNumeros(int a, int b)

{

return a – b;

}

}

Como podemos observar todos los miembros de la clase Prueba son estáticos, una clase estática no puede tener constructores de instancia pero si constructores estáticos si posee campos que deben ser inicializados con valores no triviales, no se instacia y está sellada (no se puede heredar de esta clase).

Comments»

No comments yet — be the first.