Mi sono imbattuto in un sito interessante, in cui vengono affrontate alcune delle nuove funzionalità (proposte) di C# 6.0. Puoi leggerlo qui: Probable C# 6.0 features.Controllo null monadico in C# 6.0
Quello che trovo particolarmente interessante è il controllo null monadico (noto anche come operatore di propagazione null ?.). Secondo il sito, la seguente dichiarazione
var bestValue = points?.FirstOrDefault()?.X ?? -1;
contiene il controllo di nulla monade, che è attualmente implementato con questo pezzo di codice:
if (points != null)
{
var next = points.FirstOrDefault();
if (next != null && next.X != null) return next.X;
}
return -1;
Il mio primo sguardo era, hey, quello che è scritto diamine Qui? Ma dopo aver visto il "vecchio" codice, sto iniziando a piacermi.
Tuttavia, sto anche iniziando a ricevere alcune domande, che vorrei chiedere.
- Suppongo che questo operatore con propagazione nulla sia thread-safe. Ma come viene effettivamente eseguito? Le condizioni di gara saranno rimosse o persistono?
In che modo questo operatore gestisce i tipi generici? Inoltre, come gestirà i tipi generici non vincolati? Ad esempio, si consideri
var resultAfterNullCheck = x?.Y;
Se il tipo Y qui viene istanziata con tipi di riferimento, tipi di valore non annullabili e tipi di valore nullable, non ci sarebbe nulla ragionevole fare (poichè non posso pensare a cosa fare, come Semplicemente non so cosa fare). Quindi c'è un valore predefinito che verrà restituito? O genererà un errore?
Osservando l'esempio fornito dal sito (e che ho copiato sopra) presumo che uno dei principali vantaggi dell'operatore di propagazione nullo sarà che valuterà l'istruzione solo una volta. Tuttavia (forse a causa della mia mancanza di conoscenza di CLR), sono abbastanza curioso su come potrebbe essere eseguita.
Per quanto mi riguarda, la prima valutazione (se i punti equivalgono a null) deve attivare il metodo di estensione FirstOrDefault() per l'attivazione quando i punti non sono nulli, seguito dalla valutazione del tipo restituito da null o no, in caso contrario, X sarà restituito. Quindi queste sono in realtà tre valutazioni combinate in una? O lo sto capendo in modo errato? Ciò influenzerà la velocità di esecuzione?
In altre parole, cosa sarà più veloce, il vecchio modo di eseguire i controlli nulli o questo nuovo operatore adorabile? Cercherò di esaminare questo facendo qualche ricerca non appena il download di Visual Studio 2015 è finito ... Ma questo richiede un po 'di pazienza ...
Ci sono pensieri su questo nuovo tipo di operatore? E 'davvero ancora una proposta, o possiamo davvero aspettarci di lavorare con questo nuovo assegno nulla monadico?
EDIT
Come Matthew Watson fornito una bella MSDN article discutere di questo argomento (s) (e più), ero curioso se menzionato la mia precedente domanda per quanto riguarda i farmaci generici non vincolati e come questo operatore con offerte che. Sfortunatamente, non ho ancora trovato una risposta. Mentre suppongo che il programmatore dovrebbe cercare di prevenire l'uso di generici non vincolati, posso ancora immaginare che a volte questo non sia fattibile. Se questo è il caso, sarà davvero necessaria una riprogettazione?
Si chiama ["Null condizionale operator"] (http://blogs.msdn.com/b/csharpfaq/archive/2014/11/20/new-features-in-c-6.aspx) ora. –
Puoi trovare molte informazioni qui https://roslyn.codeplex.com/discussions/540883. – adrianm
@MatthewWatson 'if (MyEvent! = Null) MyEvent (this, EventArgs.Empty);' è un noto esempio di ciò che dovrebbe essere riscritto come 'var myEvent = MyEvent; if (myEvent! = null) myEvent (this, EventArgs.Empty); ': anche se l'accesso a' MyEvent' è atomico, potrebbe passare da non null a null tra il confronto e l'invocazione. Questo è il tipo di cosa che 'MyEvent? .Invoke (this, EventArgs.Empty);' dovrebbe già occuparsi, come ho capito. – hvd