2013-05-16 2 views
11

В соответствии с this строка (или строка) является ссылочным типом.Почему Type.IsByRef для типа String возвращает false, если String является ссылочным типом?

Еще Дано:

Type t = typeof(string); 

затем

if (t.IsByRef) ...  

возвращает ложные

почему?

Редактирование: после некоторого быстрого тестирования я, очевидно, неправильно понимаю цель IsByRef ... , так как даже с использованием имени класса вместо 'string' также возвращает false. Я пишу общий класс и хочу проверить, прошел ли тип, в котором они были переданы, когда экземпляр generic является значением или ссылочным типом. Как можно проверить это?

+1

Слово ** 'By' ** есть не только для украшения, оно имеет смысл. ;) – Mehrdad

+0

@Mehrdad - хорошо сказано - теперь, когда я знаю цель. IsByRef! – PMBottas

ответ

9

Вы должны использовать вместо IsValueType:

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

Что касается IsByRef, цель этого свойства, чтобы определить, передается ли параметр в метод по реф или по значению.

Пример у вас есть метод, который a передается по исх:

public static void Foo(ref int a) 
{ 
} 

Вы можете определить, является ли a является передача по ссылке или нет:

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

Ahhhh! светлые рассветы на Марблхеде! Благодаря! – PMBottas

5

Вы хотите проверить, является ли это value type.

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

@ Хабиб Хорошо Пятнистый! –

9

Есть «ссылочные типы» - для которых у нас есть !type.IsValueType - и тогда есть типы, которые представляют ссылки на что-нибудь - являются ли их цели типы значений или ссылочные типы.

Когда вы говорите void Foo(ref int x), то x называется «прошло по ссылке», следовательно, ByRef.
Под капотом xявляетсяссылка типа ref int, который соответствовал бы typeof(int).MakeReferenceType().

Обратите внимание, что это два разных типа «ссылки», полностью ортогональные друг другу.

(На самом деле, есть третий вид «ссылки», System.TypedReference, который является только struct
Там также четвертый тип ссылки, вид, что каждый C программист знает -.. Указатель, T*)

+3

IsByRef также имеет больший смысл с фоном VB, где та же самая подпись метода будет: Sub Foo (ByRef x as Integer) – Jimmy

+0

Спасибо всем респондентам! Как я уже сказал, «явно непонимание цели .IsByRef» ... и думать, что я изначально использовал .IsValueType, но изменил на .IsByRef, поскольку я хотел проверить «нулевое» мышление, что .IsByRef был обратный .IsValueType (если бы это было так, это было бы .IsRefType d'oh!) – PMBottas