Va mai aduceti aminte ca in C++ puteam sa declaram o variabila sa fie constanta, fara a ne face probleme ca un utilizator ii poate schimba valoarea. In C# putem sa facem un lucru asemanator folosindu-ne de readonly.
. Aceasta colectie nu contine metode prin care putem sa adaugam elemente sau sa stergem elemente din lista. Totodata indexer-ul ne permite sa facem doar get si atat.
Orice lista contine metoda AsReadOnly(), care ne returneaza o lista de tip ReadOnlyCollection.
, nu o sa putem, .NET ne returneaza o eroare de genul: collection is read-only.
Exemplul dat cu clasa de tip Car, poate sa rescris in forma urmatoare:
public class Car
{
internal readonly int _id;
public Car(int id)
{
_id = id;
}
}
Doar in contructor se va putea initializa field-ul _id. Valoarea acestui camp nu se va putea modifica in nici o locatie din cod. Dar daca in loc de int am aveam o lista, ar aparea probleme. Chiar daca nu se va putea instanta din nou acest camp, continutul acestuia se va putea modifica.public class Car
{
internal readonly List<Component> _components;
public Car(List<Component> components)
{
_components = components;
}
}
public class Logan : Car
{
// ...
public void SomeMethod()
{
_components.Add(..);
_components.Remove(..);
}
}
Oricine ar putea sa adauge sau sa stearga elemente din lista. Am avea nevoie de o lista care sa permita doar operatii de read. Pentru acest lucru .NET ne vine in ajutor si ne ofera clasa generica ReadOnlyCollectionOrice lista contine metoda AsReadOnly(), care ne returneaza o lista de tip ReadOnlyCollection.
List<int> items = new List<int>(){ 1, 2 ,3};
items.Add(4);
items.Remove(1);
items[1] = 10;
ReadOnlyCollection<int> itemsReadOnly = items.AsReadOnly();
itemsReadOnly.Add(4); //Eroare la compilare, metoda nu exista;
itemsReadOnly.Remove(1); //Eroare la compilare, metoda nu exista;
itemsReadOnly[1] = 10; //Doar get se poate face;
Chiar daca incercam sa facem apoi o conversie la ListExemplul dat cu clasa de tip Car, poate sa rescris in forma urmatoare:
public class Car
{
internal readonly ReadOnlyCollection<Component> _components;
public Car(ReadOnlyCollection<Component> components) //sau public Car(List<Component> components)
{
_components = components; //sau _components = components.AsReadOnly();
}
}
Comments
Post a Comment