たまに「じゃんぬねっと」が生存確認をする日記

役員より労働者の方が楽だと思う

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  984  : 記事  4  : コメント  38837  : トラックバック  277

ニュース

My Website

初心者向けのサイトです。

C# と VB.NET の入門サイト

最近のできごと

低学歴の IT エンジニア兼管理職です。ずっとリモートワーク中。

駆け出しはブラック企業で低年収でしたが、転職を繰り返して年収は 5 倍以上になりました。

年収はこれ以上増えても幸せ指数は増えませんので、趣味の時間を増やすため早期の半リタイアを考えています。

最高の配偶者、可愛い娘、ハンサムな息子と幸せな日々を送っています。

Sponsored Link1

Sponsored Link2

Archive

書庫

J# には、final というキーワードがあります。
この final というキーワードは意味合いを幾つか持っています。

クラスに final を修飾した場合は「継承禁止」になります。(最後のクラス)
C# では sealed キーワード (シール クラス) に、VB.NET では NotInheritable キーワードに当たります。

メソッドに final を修飾した場合は「オーバーライド禁止」になります。(最終定義のメソッド)
C# では sealed キーワードに、VB.NET では NotOverridable キーワードに当たります。
C# と VB.NET は、デフォルトでオーバーライド禁止なのですが J# はオーバーライドを許可しています。
私は .NET では "オーバーライド禁止が基本" と考えていますので、殆どのメソッドに final を修飾しています。

通常の変数に final を修飾すると「定数」になります。(最終変数)
これは、C# や VB.NET での const と同じです。

# 慣れとは恐ろしいもので、Java で最近「const」と書いてしまうクセが... (^ω^;)

メソッドの引数に final を修飾すると「不変な変数」になります。
これは C での const 修飾子と同じ働きで、引数がメソッド内で変更不可であることを保証できます。

検証メソッドなどでは引数を元に検証するため、私は final を修飾するようにしています。
(C だと関数で多用しまくってました)

J#

public static final boolean IsDate(final int iYear, final int iMonth, final int iDay) {
         :
    // ここで検証するであろう「年月日」が変更されては困る
         :
}

引数を元に加工して何かをする場合は、別の変数を定義すべきだと思います。
引数の不変の約束って不要でしょうかね? (^-^;)

投稿日時 : 2005年11月23日 13:22

コメント

# re: J# は final の嵐 2005/11/23 18:55 なおこ(・∀・)
J# は詳しくないのですが、
Java の場合、
オーバーライドを許可しといてくんないと
ヘタレ会社が組んだ、フレームワークの基底などから
呼ばれる業務処理のメソッドがあって、
(上の年月日なんかは間違えようがなさそうですが)
フレームワークはもちろん、
そのヘタレなメソッドを弄るなって言われてた場合、
直しようがないという罠が...

# re: J# は final の嵐 2005/11/23 20:46 じゃんぬ
そういうこと言うと J な人からマークされますよw

# re: J# は final の嵐 2005/11/23 21:51 masa
こんばんは。

C#の勉強でちょくちょく拝見させて頂いてましたが、書き込みは初めてです。
Javaな人なのでうっかり反応してしまいました^-^;

Javaの場合でオーバーライド禁止にすると なおこ(・∀・) さんの例にあるような事態はちょくちょく発生しそうですね。逆によっぽどの裏付けと自信がない限り、メソッドへのfinalの修飾はして欲しくないです^^;

C#の場合は.NET Frameworkという精練された基盤があって、オーバーライド対象が明確に出来るから、デフォルトでのオーバーライド禁止が許容されるのではないしょうか。そういった意味だと、J#でもデフォルトオーバーライド禁止が有効そうですが、そうするとJavaな人からクレーム殺到するので
そうはいかなかいのかなーと。

引数を値渡しするケースは、メソッド内でいじくり回されても別になんの害もないですし、引数を参照渡しするケースは、いじくるなで済まないことがほとんどだと思うので、特別なケースで明示的にfinalを修飾した方が直感的にも分かりやすいかと思います。


# re: J# は final の嵐 2005/11/23 22:35 じゃんぬ
> そうするとJavaな人からクレーム殺到するので

なので「J#」って書いたんですよね。
昔、J の畑にいたこともあり、J な方々が怖いので保険です。(^-^;)

Java と .NET の違いは、完全にポリモーフィズムに頼るかどうかですね。

デメリットとしては、"逆に" オーバーライドを明示化するキーワードがないため、
オーバーライドしているつもりがしていなかったり、とかですね。
C# や VB.NET の場合はコンパイラが叱ってくれます。

> 引数を値渡しするケースは、メソッド内でいじくり回されても別になんの害もないですし

そういう意味合いで付けるべきという話はしておりません。
参照渡しも普通はしませんから、除外しています。

どんな場合でも引数を加工する場合は、別の変数を用意して可読性を良くして最適化すべきだと思います。

> 特別なケースで明示的にfinalを修飾した方が直感的にも分かりやすいかと思います。

C だとポインタを引数にした場合に多用しているのもこれでしょうね。
今回、例となったメソッドでは何かされても困る (何もしてない) という意味で付けるべきかなと思います。

# J を擁護する発言をひとつ。
# delegate は簡素で結構好きなのですが、最初は受け付けませんでした。
# ただ、プロパティ、struct, enum は欲しくてたまらなかったですね。
# あ、脱線しそうだ...

# re: J# は final の嵐 2005/11/24 0:59 masa
あー、誤解を招く記述になってしまいました。
すいませんΤ-Τ

× J#でもデフォルトオーバーライド禁止が有効そうですが、
○ .NETの思想がデフォルトでオーバーライド禁止になっているのだから、J#の言語仕様もデフォルトでオーバーライド禁止になっていてよさそう。
といった感じのことが言いたかったのです。
それだとJavaの言語仕様をくつがえすからJ#でもなくなっちゃいますけど^^;
なので、J#でのメソッド定義はfinal多用がよい選択なのかなーと思います。

誤解してしまった仮引数のfinal定義についてですが、害はないけど、そこまでやるか!って感じを受けました。

脱線ネタでは「プロパティ」これは是非ともJavaにも欲しいです。

# re: J# は final の嵐 2005/11/24 8:40 じゃんぬ
> といった感じのことが言いたかったのです。

これは読み取れました。
J# は、デフォルトが final でも良いと思います。

> 害はないけど、そこまでやるか!って感じを受けました。

クラス ライブラリを作る立場であれば、やりますよ。
実はあんまりやった試しもないんですけどねw

> 脱線ネタでは「プロパティ」これは是非ともJavaにも欲しいです。

JavaBeans プロパティだと、振る舞いを表すようにしか見えないんですよね。
同じ名前で定義できて、コンパイラがチェックしてくれる制約があるプロパティが好きですね。
よもや、フィールドにはできませんし...

J 陣営でも、プロパティは欲しいと考える方も多いみたいですね。

# re: J# は final の嵐 2005/11/24 15:34 囚人
>メソッドに final を修飾した場合は「オーバーライド禁止」になります。(最終定義のメソッド)
>VB.NET では NotOverridable キーワードに当たります。(C# では該当なし)

一応 C# にもありますよー。sealed

>引数の不変の約束って不要でしょうかね? (^-^;)

メソッドの中身(実装)からみたら、final が付いているほうが良さそうですが、メソッドを使う側(クライアント)からしたら、不要(冗長)な気がしますね。

使う側「値で渡してるんだから、中身で弄ろうが弄らまいが、カンケーねーよ」って^^;


# re: J# は final の嵐 2005/11/24 15:52 じゃんぬ
> 一応 C# にもありますよー。sealed

ああ、冗長なキーワードは C# にはないと思っていたらあった...
ということは、VB のおまけは Overloads だけですね...

> 不要(冗長)な気がしますね。

確かに、独自のビジネス ロジックなメソッドでしか使わないかも。
(複数人が修正することを考えて)

# re: J# は final の嵐 2005/11/24 16:00 囚人
>ああ、冗長なキーワードは C# にはないと思っていたらあった...

いや、冗長というか、

public sealed override void hoge()

「俺はオーバーライドしたけど、俺の子供にはさせてやんねー」
ってな感じで、すご~~くたまに使用しますね^^



# re: J# は final の嵐 2005/11/24 16:11 じゃんぬ
ああ、そっかぁ。

子で修飾を変えることを失念していました。

ああ、ダメダメですねぇ。(^^;)

今、風邪ひいてます。えらい...
今日は (も) 定時に帰るぞー。

# re: J# は final の嵐 2005/11/24 22:12 なおこ(・∀・)
マークされるのは "J"eanne さんでお腹一杯ですw

# Illikebuisse cqlrh 2021/07/05 1:45 www.pharmaceptica.com
tadalafil cost https://www.pharmaceptica.com/

# hydroxychloroquine 200 mg 2022/12/25 15:39 MorrisReaks
hydroxychloroquine for sale over the counter https://www.hydroxychloroquinex.com/

Post Feedback

タイトル
名前
Url:
コメント: