Cosa viene modificato applicando Operatore nullable su tipo di tipo di dati valore che ora può memorizzare null.? (nullable) operatore in C#
risposta
Come altri hanno già detto, "?" è solo una scorciatoia per cambiarlo in Nullable<T>
. Questo è solo un altro tipo di valore con un flag booleano per dire se c'è davvero un valore utile o se è il valore nullo per il tipo. In altre parole, Nullable<T>
sembra un po 'come questo:
public struct Nullable<T>
{
private readonly bool hasValue;
public bool HasValue { get { return hasValue; } }
private readonly T value;
public T value
{
get
{
if (!hasValue)
{
throw new InvalidOperationException();
}
return value;
}
}
public Nullable(T value)
{
this.value = value;
this.hasValue = true;
}
// Calling new Nullable<int>() or whatever will use the
// implicit initialization which leaves value as default(T)
// and hasValue as false.
}
Ovviamente nel codice vero e proprio ci sono più metodi (come GetValueOrDefault()
) e operatori di conversione, ecc Il compilatore C# aggiunge sollevato operatori che di fatto delega all'originale operatori per T
.
A rischio di sembrare un record interrotto, questo è ancora un tipo di valore. Si non si coinvolgono la boxe ... e quando si scrive:
int? x = null;
che non è un nulla di riferimento - è il valore nullo di Nullable<int>
, vale a dire quello in cui è hasValue
false
.
Quando un tipo nullable è inscatolato, il CLR ha una caratteristica per cui il valore sia viene inscatolato ad un riferimento nullo, o un semplice scatola T. Quindi, se si dispone di codice come questo:
int? x = 5;
int y = 5;
object o1 = x;
object o2 = y;
I valori in scatola a cui si riferisce o1
e o2
non sono distinguibili. Non si può dire che uno è il risultato del pugilato di un tipo nullable.
La sintassi ?
è zucchero sintattico nella struttura Nullable<T>
.
In pratica, quando si scrive int? myNullableInt
, il compilatore lo modifica in Nullable<int> myNullableInt
.
Da MSDN (scorrere fino a "Tipi Nullable Panoramica"):
La sintassi T? è una scorciatoia per Nullable, dove T è un tipo di valore. Le due forme sono intercambiabili.
In termini di base, un tipo nullable è una versione in scatola del tipo normale che ha un campo booleano aggiuntivo chiamato hasValue su di esso. Quando questo campo è impostato su false, l'istanza è nullo.
Partenza questa risposta per un po 'più in dettaglio sulla realizzazione CLR, e perché avrebbero potuto scelto: Boxing/Unboxing Nullable Types - Why this implementation?
No, non è affatto una versione in scatola. È ancora un tipo di valore. –
Non lo chiamerei una versione in scatola. La boxe crea una rappresentazione del tipo di riferimento di un tipo di valore. Nullable
Il tipo di cambiamenti da quello che ha usato per essere a un tipo Nullable.
Se tu avessi un int, e ha deciso di renderlo un int ?:
int myInt;
E si rendono:
int? myInt;
è ora:
Nullable<int> myInt;
In la realtà.
Non viene modificato nulla sul tipo di valore stesso, è semplicemente racchiuso in una struttura System.Nullable<T>
. http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx
- 1. Valori Nullable in C++
- 2. C# ?? operatore in Ruby?
- 3. Operatore esponenziale in C++
- 4. operatore sizeof() in C
- 5. Operatore ternario in C
- 6. operatore [] [] C++
- 7. Confronto Nullable double NaN in C#
- 8. argomenti del metodo Nullable in C#
- 9. L'operatore + = con i tipi nullable in C#
- 10. Che cos'è il tipo nullable in C#?
- 11. C# casting al tipo nullable?
- 12. C# ?? Domanda operatore coalescente null
- 13. NON è operatore in C#
- 14. uso del: operatore in C
- 15. operatore freccia in Objective-C
- 16. Operatore di coalizzamento in C#?
- 17. operatore Implementazione <in C++
- 18. punto asterisco operatore in C++
- 19. Modulo operatore in Objective C
- 20. sovraccarico -> operatore in C++
- 21. Esiste un operatore C# IN?
- 22. tipo di operatore in C
- 23. operatore ternario in C vs C++
- 24. Operatore risoluzione-spazio :: operatore di accesso membro. in C#
- 25. operatore lambda C# learning
- 26. C# scoping operatore
- 27. C++: Operatore di overloading =
- 28. C# a operatore sovraccarico
- 29. C++ operatore ternario
- 30. C# 'o' operatore?
grazie mille. –