- PR -

現在のインスタンスを参照するthisキーワード、付ける? or 付けない?

投票結果総投票数:259
付ける 99 38.22%
付けない 66 25.48%
付けたり付けなかったり 94 36.29%
  • 投票は恣意的に行われます。統計的な調査と異なり、投票データの正確性や標本の代表性は保証されません。
  • 投票結果の正当性や公平性について、@ITは一切保証も関与もいたしません。
投稿者投稿内容
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2007-07-17 12:33
流し読みしかしていないし、こんなことで議論する気はまったくありませんが。書きたいことだけ書いておきます。ちなみに、私は this についてあまり意識したことがなかったので、付いていたり、付いていなかったりしてます。何かの基準で決めてるわけではなく、なんとなく付いてたり、付いてなかったり。こういうのが一番良くないのでしょうね。

引用:

オブジェクトのステータスの変更と言うものに対して特に注意を払え


変更ということであれば代入左辺値として現れるときだけ this を付ければ十分? 参照するだけならフィールド変数に this を付けなくてもよい?

引用:

警告がでますので、このIDE下では名前が同じであるが故の実用上の問題はありません。


Eclipse 大好きです。フィールド変数 hoge とローカル変数 fuga を使用しているメソッドが存在しているとき、フィールド変数 hoge をリファクタリングの一環として fuga に名前変更しようとすると、ローカル変数 fuga に隠されちゃうよ! という警告まで出してくれます。すばらしい。ここまでできるなら this いらないと思えるかも。(this を付けている場合は、fuga に隠されることがないので、この警告は出ません。)

ただし、まだ不完全な部分もあります。フィールド変数 piyo を使用しているメソッドがあるとき、ここにローカル変数 piyo の宣言を追加すると、フィールド変数 piyo は隠されてしまいますが、Eclipse はこれを警告してくれません。このようなローカル変数の追加によってフィールド変数が隠されてしまう事故の可能性を考えると、フィールド変数には this を付けておいたほうが安全かもしれません。

引用:

thisを入力することによる自動補完が便利。これにより自然と記述するのでは?


Eclipse なら this を入力しなくても補完機能使えますよ。何もないところで、Ctrl + Space を押せば、ローカル変数、フィールド変数の順で一覧を出してくれます。

Eclipse ということで言えば、デフォルトの装飾が フィールド変数は青い細字、ローカル変数は黒い細字というのも区別が付きにくくていやです。設定変更すればいいだけの話ですがプロジェクト全体で統制をとるとなるとデフォルト設定を変更するのも結構大変で。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-07-17 12:42
引用:

未記入さんの書き込み (2007-07-17 12:33) より:
引用:

オブジェクトのステータスの変更と言うものに対して特に注意を払え


変更ということであれば代入左辺値として現れるときだけ this を付ければ十分? 参照するだけならフィールド変数に this を付けなくてもよい?



鋭い突っ込みありがとうございます。
ご理解いただけているとは思いますが、参照はどうでもいいや、という意味ではありません。
更新のほうがより注意すべきだとは思いますが、オブジェクトの状態を参照しての処理というのも注意を払うべきです。
とくにオブジェクトの参照の場合、ローカル変数に代入した後にオブジェクト操作を行ってもやはり状態が変更されますので。

そうではない場合、どちらかといえば読み手に対しての配慮の意義が大きいかと思います。
オブジェクトの状態を参照してる箇所はオブジェクトの挙動としては重要な部分にあるだろうと思われます。
重要なポイントを読むにあたって誤読の可能性を極力減らすことが重要だというのは同意いただけるのではないでしょうか。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-07-17 13:33
ちょっと脱線気味になってしまうのですが...

引用:

未記入さんの書き込み (2007-07-17 12:33) より:

Eclipse なら this を入力しなくても補完機能使えますよ。何もないところで、Ctrl + Space を押せば、ローカル変数、フィールド変数の順で一覧を出してくれます。


Visual Studio でも同様の方法でインテリセンスは表示できます。 が、ローカル変数 > フィールド変数 > ... などのように優先的に表示ということはできないです。 Visual Studio でもこういったことができるようにオプションを付けてくれると嬉しいなと思いました。 (要望あげてみようかな)

引用:

Eclipse ということで言えば、デフォルトの装飾が フィールド変数は青い細字、ローカル変数は黒い細字というのも区別が付きにくくていやです。設定変更すればいいだけの話ですがプロジェクト全体で統制をとるとなるとデフォルト設定を変更するのも結構大変で。


一昔前しか使っていなかったので良く知らないのですが、Eclipse では 「設定のインポート / エクスポート」 はできないのでしょうか? Visual Studio 2005 であれば、.vssettings というファイルによって自動的にエクスポートされます。 また 「チーム設定ファイル」 を使うこともできます。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-07-17 13:49
引用:

じゃんぬねっとさんの書き込み (2007-07-17 13:33) より:
一昔前しか使っていなかったので良く知らないのですが、Eclipse では 「設定のインポート / エクスポート」 はできないのでしょうか? Visual Studio 2005 であれば、.vssettings というファイルによって自動的にエクスポートされます。 また 「チーム設定ファイル」 を使うこともできます。



可能ですよ。
操作としては、「ファイル」→「エクスポート」→「一般 - 設定」となります。

引用:

未記入さんの書き込み (2007-07-17 12:33) より:
ただし、まだ不完全な部分もあります。フィールド変数 piyo を使用しているメソッドがあるとき、ここにローカル変数 piyo の宣言を追加すると、フィールド変数 piyo は隠されてしまいますが、Eclipse はこれを警告してくれません。このようなローカル変数の追加によってフィールド変数が隠されてしまう事故の可能性を考えると、フィールド変数には this を付けておいたほうが安全かもしれません。



インスタンスフィールド名とローカル変数が同じ場合、つまり、ハイディングしている場合だと思いますが、
デフォルトのコンパイル警告では無視かもしれませんね。
コンパイラの警告設定で検出できるようになります。

これにCheckstyleによるコーディング規約設定(命名ルールも正規表現で設定できる)と
FindBugによる潜在的な危険のあるコードの警告をつけるとかなり強力です。
確かFindBugは各言語版が存在しましたよね?
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2007-07-17 14:18
引用:

コンパイラの警告設定で検出できるようになります。


いえ、ローカル変数による隠蔽警告とは微妙に意味合いが異なります。ローカル変数による隠蔽警告を設定すると、フィールド変数に this が付いていてローカル変数と区別できる(つまり実際には隠蔽されていない)場合でも、ローカル変数に警告が出てしまいます。

これはつまり「ローカル変数とフィールド変数に同じ名前を付けてはいけない」という規約を守るための設定です。(偏った規約なのでデフォルトではないのだと思います。)

ローカル変数とフィールド変数に同じ名前を付けたい立場としては、この警告設定をすることはできません。

ただ、this を付けていなかったコードで、いままで、フィールド変数として認識されていたものが、ローカル変数宣言の追加によって、ローカル変数として認識されてしまう、対象変数の変化を警告して欲しいのです。
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2007-07-23 11:20
thisキーワードは必ず付ける派だったのですが、囚人さんの発言(投稿日時: 2007-07-06 17:40)を読んで、ずっと悩んでました。
ふとこんなケースを思いつきました。

コード:
private string _hoge;

public void SetHoge(string hoge)
{
  _hoge = hoge;
}



コード:
private static string _hoge;

public void SetHoge(string hoge)
{
  _hoge = hoge;
}



つまり、インスタンスフィールドを誤って静的フィールドにしてしまった場合に、thisキーワードを付けていればコンパイラが検出してくれるわけです。

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