C#と諸々

C#がメインで他もまぁ諸々なブログです
おかしなこと書いてたら指摘してくれると嬉しいです(´・∀・`)
つーかコメント欲しい(´・ω・`)

2011/03/22 00:03

C#と諸々 ローカル変数に参照渡し

ローカル変数に参照渡しはできないけれど、参照を扱うことはできるということに気付きました。
実は C# には隠しキーワードがいくつかあって、その内の __makeref と __refvalue を使うことで参照を扱うことができます。

using System;
class Program
{
    static void Main()
    {
        int v0 = 0;
        TypedReference r0 = __makeref(v0);
        __refvalue(r0, int) = 5;

        Console.WriteLine(v0); //=> 5
    }
}


タグ: .NET C#


コードだけ見ると、なんかぜんぜんタイプセーフじゃない気がするんですけど…
メモリ破壊しようとしても大丈夫(ダメ?つまり実行時エラーになるとか)なんでしょうか。
__refvalue の第二引数で指定する型とかなんか、チェック入ってても微妙な感じ…
ぞわぞわしちゃいます><

2011.04.05 17:01 URL | いさを #- [ 編集 ]


タイプセーフじゃないですよ
第二引数で型指定するのは、Boxing/Unboxing を伴わずに値型を扱うためです
C# だと TypedReference はローカル変数やパラメータ (ref/out 除く) 以外の宣言には使用できず、基本クラスへのキャストも禁止されているので、C# の中でだけ使用する分にはメモリ破壊は起きないはずですが、
そもそもは C++ との相互運用のために使用するものなので、普通はまず使わない機能ですね

2011.04.05 17:28 URL | よこけん #Ay6tTHf6 [ 編集 ]


TypedReference がわかんないなぁ。
けど、ローカルのスタック内ならコンパイラでセーフか否か判断できるからってことかな。
例えば.NETで言えば Object にキャストして何型か(プログラマが)忘れちゃっても、次に任意の型にキャストするときに、参照先のインスタンス自身の型に応じて適切にキャストされたりランタイムエラーになりますよね。そういうチェックはないんですね。

2011.06.01 11:57 URL | いさを #yr/lUjYY [ 編集 ]












トラックバックURL↓
http://csharper.blog57.fc2.com/tb.php/303-06253afb