El C# té un munt de paraules reservades i cada dia que passa m'adono de quantes en desconec. Fins ara feia servir const per definir constants, però clar, constants no hi ha tantes, ja que només es poden definir quan es declaren, algo com:
public const string foo = "foo";
Llavors quan s'intenta fer qualsevol modificació del valor salta un error. Algo com això:
public class MyClass
{
public const string foo = "foo";
public MyClass()
{
foo = "bar";
}
}
Doncs a vegades volem que una variable sigui tingui un valor que un cop assignat no es pugui modificar, en aquest cas el const no ens pot ajudar, perque el valor s'assigna en temps de compilació. Per això està el readonly , que permet assignar un valor en temps d'execució.
public class MyClass
{
public readonly string foo = "foo";
public MyClass(string abc)
{
foo = abc;
En canvi l'assignació fora del constructor no està permesa i sí dóna error. Si afegim aquest mètode a la classe anterior no funciona.
public void SetFoo(string newFoo)
{
foo = newFoo;
}
Les propietats readonly només es poden assignar en la declaració (com les constants) i en el constructor. Però si un objecte deriva del que conté les propietats readonly aleshores si s'intenta accedir a aquestes, encara que sigui en el constructor de l'objecte derivat, no ens deixa. Això és així per que quan s'executa el constructor de l'objecte derivat el contructor de l'objecte base ja s'ha executat. Aleshores cal una forma que quan s'invoca al constructor de l'objecte derivat es pugui invocar al base. Es fa així:
public class MyClass
{
public readonly string foo = "foo";
public MyClass(string abc)
{
foo = abc;
}
}
public class MyExtClass : MyClass
{
public MyExtClass(string abc1, string abc2) : base(abc1)
{
foo = abc2;
}
}
|