2007年09月27日
川俣晶の縁側ソフトウェア技術雑記total 2770 count

C# 2.0において、値型と参照型の境界線はどこにあるのか?

Written By: 川俣 晶連絡先

 やることが多く時間がないのですが、もしかしたら重要かもしれないので、メモだけ。

επιστημηさんのブログの値型/参照型より

あたしゃ参照か値かは作る人じゃなくて使う人が決めるもんだと思ってんだけども、.Netでは作る人が決めちゃうわけで、なんかこー、しっくりこないっちゅーか。

 これを読んで、C#は(というかCLIでは?)型を宣言する際に値型か参照型かを最初から決めなければならないが、その本質的な必然性とは何だったかな? と考えているうちに、話が単純ではないことに気付きました。

 C# 1.0時代、値型と参照型の相違は明瞭です。それらはメモリを確保する方法が違い、それに伴い必然的にパフォーマンス、メモリ消費量、寿命、継承、コンストラクタ、etcに相違が生じます。

 たとえば、ローカル変数として値型の値を作れば、寿命はスコープを抜けるまでです。しかし、参照型の値を作ると、その寿命はガベージコレクションで回収されるまでです。(このあたりの説明は大ざっぱすぎて不正確かもしれない。以下の同じ)

 ところが、C# 2.0になるとこの単純なモデルが通用しなくなります。

 たとえば、ローカル変数として値型の変数を宣言し、それを匿名メソッドから参照すると、その「値型のローカル変数」の寿命は匿名メソッドが有効である限り延命されます。つまり、シンプルなint a;のようなローカル変数が、匿名メソッドから参照されているか否かで振るまいが全く変わってしまうわけです。

 具体的な実装としては、匿名メソッドから参照される値型の変数は、内部的に生成されるクラスに格納され、このクラスのインスタンスが匿名メソッドから参照されます。しかし、このようなメカニズムはソースコードからは見えない形で用意されていて、表面的には値型のローカル変数の寿命が延びたように見えます。

 では、そのような実装レベルの構造を忘れ、構文上の表面的なレベルにおいて、C# 2.0の値型と参照型の本質的な差とはどこに求められるのか?

 疑問のメモなので、結論は無し。

Facebook

キーワード【 川俣晶の縁側ソフトウェア技術雑記
【技術雑記】の次のコンテンツ
2007年
10月
03日
Visual Studio 2005で1行が長いテキストを横スクロール無しで編集する方法
3days 0 count
total 3549 count
【技術雑記】の前のコンテンツ
2007年
09月
12日
Cでポインタの足し算はできるのにかけ算はできない根拠は何だろう?
3days 0 count
total 4637 count

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

http://mag.autumn.org/tb.aspx/20070927104628
サイトの表紙【技術雑記】の表紙【技術雑記】のコンテンツ全リスト 【技術雑記】の入手全リスト 【技術雑記】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.33 (Alpha-Test) Copyright (c) 2004-2018 Pie Dey.Co.,Ltd.