- PR -

特集「私がJavaからC#に乗り換えた10の理由」について

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-07-21 10:44
公開を停止しました。


[ メッセージ編集済み 編集者: Jitta 編集日時 2003-07-23 11:37 ]
mei
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 114
投稿日時: 2003-07-22 00:31
なんかタイムリー。

Don Box氏
>Are delegates the moniker of .NET?
http://www.gotdotnet.com/team/dbox/

私はモニカが分かってないですが(汗)。
#「INSIDE OLE」分厚すぎ、モニカの章にたどり着く前に挫折でした。
yamasa
ベテラン
会議室デビュー日: 2003/02/15
投稿数: 80
投稿日時: 2003-07-22 15:43
yamasaです。
引用:

英-Ranさんの書き込み (2003-07-21 07:20) より:
# 親クラスへの参照がソースコード中に書いてない場合には、コンパイラが
# 参照を持たないように変換するような話をどこかで聞いたような……

【追記】↑javapで調べる限り上記記述のような最適化は行われないようです(j2sdk1.4.2で確認)


このような最適化は、Java言語仕様では認められていないようです。
http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#253028

ところで、同様の問題は C# の Anonymous methods にもあると思うのですが、
こちらはどのように対処されているのでしょうか? > 識者の方

あと、ついでに補足しておくと、
引用:

私の書き込み (2003-07-21 04:34) より:
また、Java の member class についても、うっかり static と宣言し忘れた場合は
不要な enclosing instance への参照を持つことになってしまいます。


C# にもネストしたクラスはありますが、Javaでいうところの
「static な member class」に相当するものしか存在しません。
よって、この部分の記述は C# には当てはまりません。
nak2k
ベテラン
会議室デビュー日: 2003/07/17
投稿数: 86
投稿日時: 2003-07-23 00:02
Anonymous methods のことが分からないでいたら、別スレッド(型定義のみが異なる複数のクラス(C#))のリンク先(C# プログラミング言語の将来の機能)に載ってました。

匿名メソッドについては、匿名のクラスが生成されるらしいですから、Javaの無名インナークラスと同じですね。おそらくその匿名クラスのインスタンスにローカル変数のコピーと、メソッドが定義されているクラスのインスタンスへの参照も詰め込まれることになるのかと。(問題点もJavaと一緒?)
ローカル変数への参照がない場合は、メソッドが定義されているクラスのメソッドそのものになる(匿名クラスのオブジェクトが介在しない)、とかいう最適化があるといいんですけどね。

リンク先の文で他に気になったのはジェネリクスですね。値型に対するジェネリクスを利用して、C#版の Graphic Template Library をだれかが開発してくれることに期待です (C#をDirectX9が出てから始めた身としては^^;)
未記入
大ベテラン
会議室デビュー日: 2003/06/28
投稿数: 219
投稿日時: 2003-07-23 00:09
恐れながら書き込みすみません。
Shared CLI for Mac OS X(マイクロソフト版)についてですが、tcsh上で
英文テキストは問題なく表示されますが、日本語を含んだ場合、コンパイル時点で
cs1010: Newline in Constant エラーとなってしまいました。
また、ウィンドウ表示も試みましたが、
The type or namespace name 'Windows'
does not exist in the class or namespace 'System' 〜〜
となり、コンパイルできませんでした。
以上より、まだ使用できるレベルではないと判断いたしました。

# ソースファイルはWin2K + .NET Framework1.1で動作確認済みのものです。

引き続き、FreeBSD、Linux上でも確認いたします。(成功した場合報告します。)
また、時間があればという条件付きですがMonoプロジェクト版も
確認したい、と考えています。

[ メッセージ編集済み 編集者: Ken-Lab 編集日時 2003-07-23 00:34 ]
mizu
会議室デビュー日: 2003/07/22
投稿数: 2
投稿日時: 2003-07-23 00:35
初めまして。mizuと申します。

引用:

yamasaさんの書き込み (2003-07-22 15:43) より:
yamasaです。
引用:

英-Ranさんの書き込み (2003-07-21 07:20) より:
# 親クラスへの参照がソースコード中に書いてない場合には、コンパイラが
# 参照を持たないように変換するような話をどこかで聞いたような……


このような最適化は、Java言語仕様では認められていないようです。
http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#253028



そうなんでしょうか?確かに、リンク先を見る限り、インナークラスはエンクロージング
インスタンスへの参照を保持していなければならないように思えますが、例えば、

http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html#25566

には全ての配列アクセスは実行時にチェックされると書いてありますが、実際には、
最近のJITコンパイラには、そのようなチェックが不要な場合には、省略する最適化
を行うものがありますよね?それと同様に、エンクロージングインスタンスを使わない
場合に、参照を保持しないように最適化することは(振る舞いが同じならば)許されそう
に思うのですが。

何か、問題の起きるケースがあるのでしょうか?インナークラスを継承する場合とか
でしょうか?

[ メッセージ編集済み 編集者: mizu 編集日時 2003-07-23 00:42 ]
Izumi, Y.
ベテラン
会議室デビュー日: 2002/03/19
投稿数: 77
お住まい・勤務地: 東京
投稿日時: 2003-07-23 01:02
引用:

Ken-Labさんの書き込み (2003-07-23 00:09) より:
恐れながら書き込みすみません。
Shared CLI for Mac OS X(マイクロソフト版)についてですが、tcsh上で
英文テキストは問題なく表示されますが、日本語を含んだ場合、コンパイル時点で
cs1010: Newline in Constant エラーとなってしまいました。


改行文字がないにも関わらず「改行が入っている」と怒られていることから,ひょっとしたら文字コードを変更すれば何とかなるかもしれません。
#すでにいろいろな文字コードを試されていたらごめんなさい。

引用:

Ken-Labさんの書き込み (2003-07-23 00:09) より:
また、ウィンドウ表示も試みましたが、
The type or namespace name 'Windows'
does not exist in the class or namespace 'System' 〜〜
となり、コンパイルできませんでした。


/r:System.Windows.Forms.dll オプションをつけてもだめでした?
yamasa
ベテラン
会議室デビュー日: 2003/02/15
投稿数: 80
投稿日時: 2003-07-23 01:21
yamasaです。
引用:
mizuさんの書き込み (2003-07-23 00:35) より:
それと同様に、エンクロージングインスタンスを使わない場合に、
参照を保持しないように最適化することは(振る舞いが同じならば)
許されそうに思うのですが。

何か、問題の起きるケースがあるのでしょうか?


すぐに思いつくものとしては、

  • inner class の instance への参照がまだ生きているのに、enclosing instance が回収されてしまうことがある。
  • inner class の instance をシリアライズするとき、enclosing instance が一緒にシリアライズされなくなる。

といったところでしょうか。

# まあ後者については、そもそも inner class のシリアライズ自体
# いろいろと問題がありますからねえ……
# ↓参考
# http://java.sun.com/j2se/1.4/ja/docs/ja/guide/serialization/spec/serial-arch.doc10.html

スキルアップ/キャリアアップ(JOB@IT)