- - PR -
C#でJavaのfinalの1機能を使いたい
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-12-22 18:32
お世話様です。tosiroと申します。
以前O'REILLY社より出版された「Java魂」に 「値を変更する予定のない変数にはfinalをつけるべきだ」 といった内容を読みました。 C#でも同様のことをしたいのですが、 finalに変わるものを見つけられません。 希望するコーディングは以下の通り private int func1(final int a, final int b) { int x = 0; x = a + b; //a = x + b; //コンパイル時にエラーになる為、コーディングによるバグを減らせる return x; } 根本的な間違いのご指摘でも結構ですので、 どなたかご教授ください。 | ||||||||||||||||
|
投稿日時: 2005-12-22 18:47
プライベート以上のメンバであれば readonly が付けられます。 ローカルの定数には const キーワードが使えます。 が、それだけです。 引数には当てられないです。 C# ではなく J# 使いましょう (w J# は final の嵐 私も上記の記事で言ってますが、ちょっと欲しいと思ってます。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2005-12-22 18:52
早速のお返事ありがとうございます。
やはり、簡単に実現するものはないのですね。 J#ですかぁ...。 私にとってはそれはないですねぇ。 なぜMicrosoftはこれをJavaからC#に引数final機能を 取り入れなかったんだろう...。 (いや、J#で取り入れたんだけど...) でも無いと分かって吹っ切れました。 バグを出さないように違う「努力」をします。 | ||||||||||||||||
|
投稿日時: 2005-12-22 18:58
そうですか、残念です。(^^;)
Java からというより VC++ では引数に const が使えました。 これは、VC++.NET でも使えます。
引数を加工する必要があるのであれば、別の変数を使うべきでしょうからね。(コンパイラの最適化) final がなくとも、どの言語でも (たとえ VB でも) そうするようにと体が覚えている人が多いのでしょう。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2005-12-22 19:09
引数にfinalを付けるのは、無名クラスを使うケースが多いですね。
メソッド内の変数を無名クラスで使用するには、 finalが付いてないと参照できません。
クロージャまでは言いませんが、 似たような事が可能になりますね。 | ||||||||||||||||
|
投稿日時: 2005-12-22 20:00
↑は理解できなかったので、ググって勉強してみました。 「変更しない引数はコンパイラが理解してメモリを食わないようにしてくれる」 ってことですかね? どっか掲示板で見ましたが、現在のコンパイラにはその力量はない とか書いてあったような...。 (すべてがあやふや) かつのりさんお返事ありがとうございます。
知りませんでした。勉強になりました。 (Javaでのお話ですよね?) | ||||||||||||||||
|
投稿日時: 2005-12-24 11:40
引数が final でなくとも、参照したい引数を final 変数に渡せば可能ですね。
ということは、C# で言えば const なローカル変数を使えば良いという話になります。 あ、const は右辺も定数でないといけないからダメですね。 ローカルで readonly な変数がないですからね... 無名クラスを使えない時点で意味のない話ではありますが。
メモリは、直接は関係ないような... 今のコンパイラは賢いのですが、そのようなクセがついている人も多いってことです。
Java ですね。(J# でも出来ます) _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2005-12-24 12:06
こんにちは。
たしかにC++は、引数にconstが使えます。 けれども”値渡しの引数”にconstを使うコードなんて見たことないです(~_~;) メモリの節約になるわけでもないし、 ローカルスコープにしか影響しないからバグ回避に役立つわけでもないし… 例えばこんなC++コード…
ただし、”参照渡し”や”ポインタ渡し”の場合、意図的にconstを使うことは普通にありますね。 これは呼び出し側からの引き渡された変数/オブジェクトの状態が、 呼び出した関数/メソッド内で変更されないことを保障することができるためです。 例えばこんなC++コード…
正直言って、それほどバグ減少に効果なさそうな気がします(~_~;) 引数にfinalが付いていようと付いていなくても、 func1メソッドのスコープ内だけの問題ですよね!? |