Treść książki

Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
Punkt3:Preferowanieniezmiennościtypówwartościowych|
19
//Modyfikowanielistyphone:
//powodujerównieżzmianęzawartości(podobno)
//niezmiennegoobiektu.
phones[5]:Phone.GeneratePhoneNumber();
Tablicetypemreferencyjnym.Wtymprzykładzietablicawskazywanawe-
wnątrzstruktury
PhoneList
odnosisiędopewnejtablicy(numerówtelefo-
nów),którejpamięćalokowanajestnazewnątrznaszegoobiektu.Takjak
jesttoteraz,programistamógłbyzmodyfikowaćnasząniezmiennąstruktu-
poprzezinnązmiennąodwołującąsiędotegosamegoobszarupamięci.
Abywyeliminowaćmożliwość,musimywykonaćochronnąkopiętablicy.
Arrayjesttypemzmiennym,zatemjednązalternatywbędzieużycieklasy
ImmutableArray
,należącejdoprzestrzeninazw
System.Collections.Immutable
.
Poprzedniprzykładpokazujezagrożeniastwarzaneprzezzmiennąkolekcję.
Jeszczewięcejmożliwościszkódmożepowstać,jeślitypPhonejestzmiennym
typemreferencyjnym.Kodklienckimógłbyzmodyfikowaćwartościzawarte
wkolekcji,nawetjeślikolekcjajestzabezpieczonaprzeddowolnymimo-
dyfikacjami.Remediumdlategoproblemumożebyćużycietypukolekcji
ImmutableList:
publicstructPhoneList
{
privatereadonlyImmutableList<Phone>phones;
publicPhoneList(Phone[]ph)
{
phones:ph.ToImmutableList();
}
publicIEnumerable<Phone>Phones:>phones;
}
To,którejztrzechstrategiinależyużyćdozainicjowaniatypuniezmienne-
go,zależyodzłożonościtegotypu.Popierwsze,możemyzdefiniowaćjeden
konstruktor,pozwalającyklientomnainicjowanieobiektu,takjakstruktura
Addressdefiniowałakonstruktorpozwalającyklientomzainicjowaćadres.
Utworzenierozsądnegozestawukonstruktorówczęstojestnajprostszym
podejściem.
Podrugie,możemyutworzyćmetodyfabrykującedoinicjowaniastruktu-
ry.Metodytakiesprawiają,żełatwiejszejesttworzenietypowychwartości.