2013-05-16 15 views
11

Secondo this una stringa (o stringa) è un tipo di riferimento.Perché Type.IsByRef per type String restituisce false se String è un tipo di riferimento?

ancora dato:

Type t = typeof(string); 

poi

if (t.IsByRef) ...  

rendimenti falsi

perché?

Edit: Dopo alcuni test rapido, sto ovviamente equivoco lo scopo di IsByRef ... come anche utilizzando un nome di classe al posto di 'stringa', restituisce false pure. Sto scrivendo una classe generica e voglio testare se uno dei tipi passati quando il generico è un'istanza è un valore o un tipo di riferimento. Come si fa a testare questo?

+1

La parola ** 'By' ** non c'è solo per la decorazione, ha un significato. ;) – Mehrdad

+0

@ Mehrdad - ha detto bene - ora che conosco lo scopo. IsByRef! – PMBottas

risposta

9

Si dovrebbe usare IsValueType invece:

bool f = !typeof (string).IsValueType; //return true; 

Per quanto riguarda IsByRef, lo scopo di questa proprietà è quello di determinare se il parametro è passato in modo da ref o per valore.

esempio si dispone di un metodo che a viene passato da ref:

public static void Foo(ref int a) 
{ 
} 

È possibile determinare se a è passaggio per riferimento o no:

bool f = typeof (Program).GetMethod("Foo") 
           .GetParameters() 
           .First() 
           .ParameterType 
           .IsByRef; //return true 
+0

Ahhhh! spuntano luci su Marblehead! Grazie! – PMBottas

5

Si desidera verificare se è un value type.

typeof(object).IsValueType :- false 
typeof(int).IsValueType :- true 
+0

@Habib Well Spotted! –

9

Ci sono "tipi di riferimento" - per cui abbiamo !type.IsValueType - e poi ci sono tipi che rappresentano riferimenti a nulla - se i loro obiettivi sono tipi di valore o tipi di riferimento.

Quando si dice void Foo(ref int x), il x è detto di essere "passati per riferimento ", quindi ByRef.
Sotto il cofano, xè un riferimento del tipo ref int, che corrisponderebbe a typeof(int).MakeReferenceType().

Si noti che si tratta di due diversi tipi di "riferimenti", completamente ortogonali tra loro.

(In realtà, c'è un terzo tipo di "riferimento", System.TypedReference, che è solo un struct
C'è anche un quarto tipo di riferimento, di quelli che ogni programmatore C sa -.. Il puntatore, T*)

+3

IsByRef ha anche molto più senso con uno sfondo VB, dove la stessa firma del metodo sarebbe: Sub Foo (ByRef x come numero intero) – Jimmy

+0

Grazie a tutti i risponditori! Come ho detto, "un evidente fraintendimento dello scopo di .IsByRef" ... e pensare che originariamente stavo usando .IsValueType ma cambiato in .IsByRef come volevo testare per "nullità" pensando che. IsByRef fosse il contrario di .IsValueType (se lo fosse, sarebbe .IsRefType d'oh!) – PMBottas

Problemi correlati