2015-06-30 12 views
5

Estratto dal Eric Lippert's Blog su What the meaning of "is", is:Come definire che cosa "Type" significa

Una concezione comune di tipi è che un tipo è un insieme [...] di valori, e che la compatibilità assegnazione è semplicemente controllando per vedere se un dato valore è un membro del set necessario. Ma non è il caso di C#.

Il contatore esempio che dà è che i rendimenti null is stringfalse, ma string b = null è totalmente bene per il compilatore C#.

Forse questa è una domanda stupida, ma quale è un modo migliore per definire l'idea di "tipo" in un contesto C# .Net? È solo una parola usata per definire ... le regole dell'impronta di memoria? ... al CLR? Mi rendo conto di quanto sia sciolta (e orribilmente sbagliata) quella definizione, ma mi sto sforzando di inserire un bel involucro e di piegarmi all'idea del tipo.

Nota: il più semplice, ma completamente preciso, meglio è. (forte N type, qui).

+1

'Type' è solo una parola usata da Microsoft. È un "edificio" come, dove l'edificio può essere una casa, una fabbrica, un ufficio o un garage; ognuno con le sue proprietà. E 'string s = null; bool b = s è una stringa; 'ha perfettamente senso per me. Poiché la stringa è un tipo di riferimento (di nuovo 'type'), la variabile' s' è semplicemente un puntatore e poiché punta a nulla 's' non è una stringa. Questo è ciò che 'sta' facendo - in questo caso, controllando' null' contro 'string' –

+0

Accetto con @ T.S. - "Tipo" è solo una parola. Capisci il concetto? –

+0

Type è una descrizione dei dati e del comportamento di un oggetto. – IllidanS4

risposta

10

qual è un modo migliore per definire l'idea di "tipo" in un contesto C# .Net? È solo una parola usata per definire ... le regole dell'impronta di memoria? Sto lottando per montare un bel involucro e piegarmi all'idea del tipo.

Questo è un problema complicato. Hai aperto con un link al mio articolo su is, ma penso che quello che si vuole veramente leggere è questo:

http://blogs.msdn.com/b/ericlippert/archive/2011/08/29/what-is-this-thing-you-call-a-quot-type-quot-part-one.aspx

http://blogs.msdn.com/b/ericlippert/archive/2011/09/07/what-is-this-thing-you-call-a-quot-type-quot-part-two.aspx

In breve:

Da un "matematico" punto di vista, un tipo è come un numero: una quantità astratta che possiamo manipolare usando le regole. Come "se T è un tipo allora T[] è anche un tipo", e così via.

Una volta che abbiamo una nozione astratta di tipo, possiamo assegnare ad ogni espressione un tipo, e quindi possiamo fare un verificatore che determina automaticamente se un programma segue o meno le regole di sicurezza del tipo.

3

La tradizionale definizione inglese di Type è un buon punto di partenza.

una categoria di persone o cose aventi caratteristiche comuni.

un tipo .NET definisce una categoria specifica di oggetto .NET (ad es .: System.IO.Stream). Contiene un insieme di proprietà e metodi (caratteristiche) di un particolare tipo di oggetto .NET.

Stai cercando una descrizione più tecnica (ad es .: gestione della memoria, ecc.)?

+0

Mi piace questa risposta, ma penso che più tecnico sarebbe d'aiuto. Vedi la mia modifica :) –

0

Penso che potrebbe essere più di pensare questo un po '.. secondo il Programming Guide

Le informazioni memorizzate in un tipo possono includere i seguenti:

  • Lo spazio di archiviazione che una variabile del tipo richiede.
  • I valori massimo e minimo che può rappresentare.
  • I membri (metodi, campi, eventi e così via) che contiene.
  • Il tipo di base ereditato da.
  • Il percorso in cui verrà allocata la memoria per le variabili in fase di esecuzione.
  • I tipi di operazioni consentite.

So che non rappresentano null ma in C# null è in realtà solo la mancanza di un indirizzo di memoria di riferimento.

+0

Non sono sicuro che 'null' debba essere correlato al concetto di un indirizzo di memoria. Considera una variabile con un tipo di valore nullable. Quando la variabile ha un valore, la variabile contiene un indirizzo o un valore? Quando è nullo, contiene improvvisamente un indirizzo? Vorrei rimuovere il concetto di "indirizzo" dall'equazione se fossi in te. È troppo fisico. Troppi dettagli di implementazione. –

+0

Mentre sono generalmente d'accordo con te, la sua domanda ha mostrato in modo specifico un esempio di null assegnato a una stringa. Quindi ho pensato che sarebbe stato utile menzionare almeno il motivo per cui non è davvero un problema per il compilatore quando si tratta di digitare. –

0

Avere un po 'più di contesto sarebbe di aiuto nel rispondere alla tua domanda ("[...] define the idea of 'type' in a C#.Net context[...]"), ma ecco una rapida pugnalata. Il concetto di un tipo in .NET deriva da object-oriented programming ed è una generalizzazione del concetto datatype da linguaggi di programmazione pre-OOP. Nella sua forma più semplice, si potrebbe dire che ...

Un tipo è un modello di nome per una struttura , le istanze di cui detengono i dati e/o comportamenti.


Le risposte alle domande nella sezione EDIT:

[...] come fa il CLR trattare l'idea di un tipo?

Non so esattamente cosa vuoi dire con questo, ma un tipo nel CLR - il 'chiamato modello' nella mia definizione di cui sopra - sono fisicamente memorizzati come CIL ed è rappresentato nel sistema da un oggetto che stesso (come tutti gli oggetti) è di un tipo.

In questo caso, tale tipo è denominato, è sufficiente, System.Type. (Nel caso tu sia curioso, questo tipo è fisicamente conservato nell'assemblaggio mscorlib.) So che sto usando un termine nella sua definizione, ma è difficile non farlo, poiché il concetto è intrinsecamente ricorsivo.

[...] il CLR ha bisogno di eseguire il cast implicito di null su una stringa nella stringa di assegnazione s = null? Le risposte finora non implicano no, ma no, ma cosa consente questo incarico? Null è stato trattato come un caso speciale qui?

Sì, si tratta di un caso speciale e non, né il compilatore né il CLR gettato null ad un string (o qualsiasi altra cosa). null ha alcun tipo (1) e non possono essere convertiti a qualsiasi tipo - è un "valore" speciale che indica l'assenza di un valore (2) ed è quindi assegnabile a una variabile di qualsiasi tipo di riferimento (3).



(1) A seconda di dove si guarda, si may o may not essere di tipo "null type".

(2) Tale valore corrisponderebbe a reference a un'istanza di quel tipo.

(3) Non ci sono two kinds of types-reference types e value types - e null veramente only applies to the former kind. Può apparire nel codice sorgente (ad esempio int? i = null;) come assegnato a una variabile di uno nullable value type, ma questo è solo zucchero sintattico e ciò che accade dietro le quinte è molto diverso e legato solo in modo tangenziale a questa discussione.

1

Ci sono alcune buone risposte a una domanda simile qui: Why does the is operator return false when given null?

Una discussione più elaborata del nulla letterale è qui: What is the type of null literal?

Sembra che ha usato per essere un tipo null in precedenza versioni di .NET per scopi simbolici, ma successivamente è stata rilasciata nelle versioni successive.

Dal punto di vista di un programmatore IL, posso dire che quando una dichiarazione del genere 'se (myvar == null)' è scritto in IL, sarebbe più o meno così:

Ldloc myvar 
brfalse IfNullLabel 

viene controllato La variabile per un riferimento null con una sola istruzione IL, indipendentemente dal suo tipo. Se questo è stato confrontato con un'altra stringa, verrà chiamato il metodo Equals. Quindi internamente, un valore è nullo quando il suo riferimento punta al valore letterale nulla. Così semplice.

+0

Quindi è esatto dire che 'null' è un caso speciale per l'operatore' is'? –

+1

Sì, è completamente accurato. In effetti, 'return null is string' in un metodo sempre compilato per restituire false. Quindi è gestito a livello di compilatore.Non è una cosa di runtime. –