2013-05-16 19 views
11

thisによれば、文字列(または文字列)は参照型です。String型のためのType.IsByRefは、String型が参照型の場合、falseを返すのはなぜですか?

しかし、与えられた:その後、

Type t = typeof(string); 

if (t.IsByRef) ...  

はfalseを返します

なぜですか?

編集:いくつかの簡単なテストの後、私は明らかにIsByRefの目的を誤解しています。 'string'の代わりにクラス名を使用していても、falseも返します。私はジェネリッククラスを書いていて、ジェネリックがインスタンス化されたときに渡される型が値か参照型かどうかをテストしたい。どのようにこれをテストするのですか?

+1

** ** By ** **という言葉は装飾のためだけではなく、意味を持っています。 ;) – Mehrdad

+0

@Mehrdad - うまく言った - 今私は目的を知っている。 – PMBottas

答えて

9

あなたが代わりにIsValueTypeを使用する必要があります。IsByRefについては

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

を、このプロパティの目的は、パラメータが参照によってまたは値によってメソッドに渡されているかどうかを決定することです。

例あなたはaが参照によって渡される方法があります:あなたはaが参照渡しであるか否かを判定することができます

public static void Foo(ref int a) 
{ 
} 

を:

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

ああ! Marbleheadに光が当たる!ありがとう! – PMBottas

5

value typeであるかどうかをチェックします。

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

@ハビブよく目をつけた! –

9

「参照型」があります - そのためには!type.IsValueTypeがあり、次にが参照を表すタイプがあります何か - ターゲットが値型または参照型。

あなたがvoid Foo(ref int x)を言うとき、xByRefしたがって、「参照でを通過した」と言われています。ボンネットの下
xtypeof(int).MakeReferenceType()に対応するタイプref int参照あります。

これらは互いに完全に直交する2種類の「参照」であることに注意してください。

(実際には、単にstructある「参照」の三種類、System.TypedReferenceは、あります
参照の第4のタイプ、すべてのCプログラマが知っているようなものもあります - 。。ポインタ、T*は)

+3

IsByRefはVBのバックグラウンドでも同じ意味を持ちます。Sub Foo(ByRef x as Integer) – Jimmy

+0

すべてのレスポンダーに感謝します!私が言ったように、 "明らかに.IsByRefの目的を誤解しています" ...そして私がもともと.IsValueTypeを使っていたと思っていましたが、.IsByRefに変更しました。 .IsValueTypeの逆です(もしあれば、それは.IsRefTypeだよ!) – PMBottas

関連する問題