Benvenuto C # 9.012/06/2020

TheMummichogblog è un partecipante al Amazon Services LLC Associates programma, un programma di affiliazione pubblicitario progettato per fornire un mezzo per siti per guadagnare tariffe pubblicitarie con la pubblicità e il link al amazon.com. Amazon, il logo di Amazon, AmazonSupply, e il logo AmazonSupply sono marchi di Amazon.com, Inc. o delle sue affiliate.

tuffo di entrare!

Init proprietà di sola
inizializzatori di oggetti sono abbastanza impressionante. Essi danno il cliente di un tipo un formato molto flessibile e leggibile per la creazione di un oggetto, e sono particolarmente grande per la creazione di oggetti nidificato in cui viene creato un intero albero di oggetti in una volta sola. Ecco un semplice:

nuova persona
{
FirstName = “Scott”,
Cognome = “Hunter”
}
inizializzatori oggetto anche liberare il tipo di autore dalla scrittura un sacco di testo standard di costruzione – tutto quello che devono fare è scrivere alcune proprietà!

Person public class
{
public string FirstName {get; impostato; }
public string Cognome {get; impostato; }
}
L’unico grande limite oggi è che le proprietà devono essere mutabile per inizializzatori oggetto al lavoro: Essi funzionano in primo luogo denominando costruttore dell’oggetto (l’impostazione predefinita, senza parametri uno in questo caso) e poi assegnare ai setter di proprietà.

proprietà init-unica correzione che! Essi presentano una funzione di accesso init che è una variante di accesso set che può essere chiamato solo durante l’inizializzazione oggetto:

Person public class
{
public string FirstName {get; dentro; }
public string Cognome {get; dentro; }
}
Con questa dichiarazione, il codice del client di cui sopra è ancora legale, ma qualsiasi successiva assegnazione alle proprietà FirstName e LastName è un errore.

di accesso init e campi di sola lettura
A causa di accesso init possono essere chiamati solo durante l’inizializzazione, essi sono autorizzati a mutare i campi di sola lettura della classe contenitrice, proprio come si può in un costruttore.

Person public class
{
privato stringa di sola lettura firstName;
stringa di sola lettura privata cognome;

Public string FirstName
{
get => firstName;
init => firstName = (valore ?? gettare nuova ArgumentNullException (nameof (FirstName)));
}
Cognome public string
{
get => lastName;
init => lastName = (valore ?? gettare nuova ArgumentNullException (nameof (Cognome)));
}
}
Records
proprietà init-solo sono grandi se si vuole fare singole proprietà immutabile. Se si desidera che l’intero oggetto sia immutabile e si comportano come un valore, allora si dovrebbe considerare dichiarandolo come un record:

Persona di classe di dati pubblici
{
public string FirstName {get; dentro; }
public string Cognome {get; dentro; }
}
I dati sulle parole chiave sui marchi di dichiarazione di classe come un record. Questo impregna con diversi valore-come ulteriore comportamenti, che ci scavare nel seguito. In generale, i record sono fatti per essere visti più come “valori” – di dati! – e meno come oggetti. Essi non sono destinati ad avere lo stato Encapsulated mutevole. Invece rappresentate cambiare nel tempo con la creazione di nuovi record che rappresentano il nuovo stato. Essi sono definiti non dalla loro identità, ma per il loro contenuto.

Con-espressioni
Quando si lavora con dati immutabili, un modello comune è quello di creare nuovi valori da quelli esistenti per rappresentare un nuovo stato. Per esempio, se la nostra persona dovesse cambiare il proprio cognome avremmo rappresentiamo come un nuovo oggetto che è una copia di quello vecchio, se non con un diverso cognome. Questa tecnica viene spesso definita come la mutazione non distruttivo. Invece di rappresentare la persona nel corso del tempo, il record rappresenta lo stato della persona in un dato momento.

Per contribuire a questo stile di programmazione, record consentono per un nuovo tipo di espressione; la con-espressione:

var = otherPerson persona con {Cognome = “Hanselman”};
Con-espressioni utilizzano inizializzazione degli oggetti sintassi per lo stato cosa c’è di diverso nel nuovo oggetto dal vecchio oggetto. È possibile specificare più proprietà.

Un record definisce implicitamente un protetto “costruttore di copia” – un costruttore che prende un oggetto record esistente e lo copia campo per campo a quello nuovo:

protetta soggetto (persona originale) {/ * copiare tutti i campi * /} // generato
Il con l’espressione provoca il costruttore di copia per ottenere chiamato, e poi applica l’inizializzatore di oggetto sulla parte superiore per modificare le proprietà di conseguenza.

Se non ti piace il comportamento predefinito del costruttore di copia generato è possibile definire il proprio posto, e che saranno prelevati dal con l’espressione.

uguaglianza basata sul valore
Tutti gli oggetti ereditano un metodo virtuale Equals (Object) dalla classe oggetto. Questo viene utilizzato come base per le Object.Equals (oggetto, oggetto) metodo statico quando entrambi i parametri sono non nulli.

Le strutture ignorare questo per avere “l’uguaglianza basato sul valore”, confrontando ogni campo della struct chiamando Equals su di loro in modo ricorsivo. Records fanno lo stesso.

Ciò significa che, in conformità con il loro “valore-ness” due oggetti di registrazione possono essere uguali l’uno all’altro senza essere lo stesso oggetto. Per esempio, se modifichiamo il cognome della persona modificato di nuovo:

var = originalPerson otherPerson con {Cognome = “Hunter”};
Vorremmo ora hanno ReferenceEquals (persona, originalPerson) = false (non sono lo stesso oggetto), ma Equals (persona, originalPerson) = TRUE (hanno lo stesso valore).

Se non ti piace il comportamento predefinito di campo per campo comparazione del Eguali di override generato, è possibile scrivere il proprio posto. Hai solo bisogno di stare attenti che si capisce come valore a base di opere di uguaglianza nei record, soprattutto quando l’ereditarietà è coinvolto, che torneremo al di sotto.

Insieme con Eguali basate sul valore c’è anche un GetHashCode () Azionamento basato sul valore di andare con esso.

membri di dati
I record sono prevalentemente destinati ad essere immutabile, con init di sola proprietà pubbliche che possono essere non distruttiva modificato attraverso con-espressioni. Al fine di ottimizzare per quel caso comune, record cambiano le impostazioni predefinite di ciò che una semplice dichiarazione membro dei mezzi FirstName stringa modulo. Invece di un campo implicitamente privata, come in altre dichiarazioni di classe e struct, nei record questo è considerato una scorciatoia per un pubblico, init-solo auto-proprietà! Così, la dichiarazione:

classe di dati pubblici Person {string FirstName; stringa Cognome; }
Significa esattamente la stessa di quella che avevamo prima:

Persona di classe di dati pubblici
{
public string FirstName {get; dentro; }
public string Cognome {get; dentro; }
}
Pensiamo che questo rende per le dichiarazioni di registrazione belle e chiare. Se si vuole veramente un campo privato, si può semplicemente aggiungere il modificatore privato esplicitamente:

Amazon e il logo di Amazon sono marchi di Amazon.com, Inc., o delle sue affiliate.