- PR -

C#でJavaのfinalの1機能を使いたい

投稿者投稿内容
梅吉
会議室デビュー日: 2003/08/19
投稿数: 16
投稿日時: 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;
}

根本的な間違いのご指摘でも結構ですので、
どなたかご教授ください。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-22 18:47
引用:

tosiroさんの書き込み (2005-12-22 18:32) より:

C#でも同様のことをしたいのですが、
finalに変わるものを見つけられません。


プライベート以上のメンバであれば readonly が付けられます。
ローカルの定数には const キーワードが使えます。
が、それだけです。
引数には当てられないです。

C# ではなく J# 使いましょう (w

  J# は final の嵐

私も上記の記事で言ってますが、ちょっと欲しいと思ってます。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
梅吉
会議室デビュー日: 2003/08/19
投稿数: 16
投稿日時: 2005-12-22 18:52
早速のお返事ありがとうございます。
やはり、簡単に実現するものはないのですね。

J#ですかぁ...。
私にとってはそれはないですねぇ。
なぜMicrosoftはこれをJavaからC#に引数final機能を
取り入れなかったんだろう...。
(いや、J#で取り入れたんだけど...)

でも無いと分かって吹っ切れました。
バグを出さないように違う「努力」をします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-22 18:58
引用:

tosiroさんの書き込み (2005-12-22 18:52) より:

J#ですかぁ...。
私にとってはそれはないですねぇ。


そうですか、残念です。(^^;)

引用:

なぜMicrosoftはこれをJavaからC#に引数final機能を
取り入れなかったんだろう...。
(いや、J#で取り入れたんだけど...)


Java からというより VC++ では引数に const が使えました。
これは、VC++.NET でも使えます。

引用:

でも無いと分かって吹っ切れました。
バグを出さないように違う「努力」をします。


引数を加工する必要があるのであれば、別の変数を使うべきでしょうからね。(コンパイラの最適化)
final がなくとも、どの言語でも (たとえ VB でも) そうするようにと体が覚えている人が多いのでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-12-22 19:09
引数にfinalを付けるのは、無名クラスを使うケースが多いですね。
メソッド内の変数を無名クラスで使用するには、
finalが付いてないと参照できません。

コード:
public void xxx(final int i){
    new Anonymous(){
        void xxx(){
            //ここで仮引数のiの値が参照可能
        }
    }.xxx();
}



クロージャまでは言いませんが、
似たような事が可能になりますね。
梅吉
会議室デビュー日: 2003/08/19
投稿数: 16
投稿日時: 2005-12-22 20:00
引用:
引数を加工する必要があるのであれば、別の変数を使うべきでしょうからね。(コンパイラの最適化)
final がなくとも、どの言語でも (たとえ VB でも) そうするようにと体が覚えている人が多いのでしょう。


↑は理解できなかったので、ググって勉強してみました。
「変更しない引数はコンパイラが理解してメモリを食わないようにしてくれる」
ってことですかね?
どっか掲示板で見ましたが、現在のコンパイラにはその力量はない
とか書いてあったような...。
(すべてがあやふや)


かつのりさんお返事ありがとうございます。
引用:
引数にfinalを付けるのは、無名クラスを使うケースが多いですね。
メソッド内の変数を無名クラスで使用するには、
finalが付いてないと参照できません。


知りませんでした。勉強になりました。
(Javaでのお話ですよね?)
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-24 11:40
引数が final でなくとも、参照したい引数を final 変数に渡せば可能ですね。
ということは、C# で言えば const なローカル変数を使えば良いという話になります。

あ、const は右辺も定数でないといけないからダメですね。
ローカルで readonly な変数がないですからね...
無名クラスを使えない時点で意味のない話ではありますが。

引用:

tosiroさんの書き込み (2005-12-22 20:00) より:

「変更しない引数はコンパイラが理解してメモリを食わないようにしてくれる」
ってことですかね?
どっか掲示板で見ましたが、現在のコンパイラにはその力量はない
とか書いてあったような...。


メモリは、直接は関係ないような...
今のコンパイラは賢いのですが、そのようなクセがついている人も多いってことです。

引用:

知りませんでした。勉強になりました。
(Javaでのお話ですよね?)


Java ですね。(J# でも出来ます)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2005-12-24 12:06
こんにちは。

引用:

じゃんぬねっとさんの書き込み (2005-12-22 18:58) より:
Java からというより VC++ では引数に const が使えました。



たしかにC++は、引数にconstが使えます。
けれども”値渡しの引数”にconstを使うコードなんて見たことないです(~_~;)
メモリの節約になるわけでもないし、
ローカルスコープにしか影響しないからバグ回避に役立つわけでもないし…

例えばこんなC++コード…
コード:
void foo(const A a);




ただし、”参照渡し”や”ポインタ渡し”の場合、意図的にconstを使うことは普通にありますね。
これは呼び出し側からの引き渡された変数/オブジェクトの状態が、
呼び出した関数/メソッド内で変更されないことを保障することができるためです。

例えばこんなC++コード…
コード:
void foo(const A& a);
void foo(const A* a);




引用:

tosiroさんの書き込み (2005-12-22 18:32) より:

希望するコーディングは以下の通り

private int func1(final int a, final int b)
{
int x = 0;

x = a + b;
//a = x + b;
//コンパイル時にエラーになる為、コーディングによるバグを減らせる

return x;
}



正直言って、それほどバグ減少に効果なさそうな気がします(~_~;)
引数にfinalが付いていようと付いていなくても、
func1メソッドのスコープ内だけの問題ですよね!?

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