ページ 11

[C#] thisキーワードの使い方

Posted: 2013年3月25日(月) 18:19
by オカピーα
こんばんは、C#の質問です。
最近はC#にもだいぶ慣れてきましたがひとつ疑問が生じました。
それは「this」の使い方です。
いったい「this」はどのように使うのでしょうか?ワケが分かりません。
VC# 2008でちょっと実験しただけでもワケが分からなくなりました。

[ 実験内容 ]
フォーム「MainWindow」にリストビューを貼り付け、どうやったらアクセスできるかをやってみた

[ 実験1 ] thisを使用

コード:

namespace THISTEST
{
    public partial class MainWindow : Form
    {
        public MainWindow()
        {
            InitializeComponent();
            this.ListView1.Dock = DockStyle.Fill;
            //「this」キーワード内にリストビュークラスの存在を確認
            //アクセス可能
        }
    }
}
[ 実験2 ] 親をどんどんたどっていった

コード:

namespace THISTEST
{
    public partial class MainWindow : Form
    {
        public MainWindow()
        {
            InitializeComponent();
            THISTEST.MainWindow.ListView1.Dock = DockStyle.Fill;
            //アクセス不可能!コンパイルエラー!
        }
    }
}
なぜコンパイルエラーなのでしょう?わからなくなってきました。
どなたか教えてください。お願いします。

Re: [C#] thisキーワードの使い方

Posted: 2013年3月25日(月) 18:30
by nil
C#には詳しくはないので違うかもしれませんが、
後者がコンパイルエラーになるのはListView1がstaticなオブジェクトではないからではないでしょうか?
前者の場合はthisというオブジェクトのインスタンスを指定していますが、
後者はそうではないのでエラーになるのではないでしょうか?

Re: [C#] thisキーワードの使い方

Posted: 2013年3月25日(月) 18:35
by オカピーα
涼雅 さんが書きました:C#には詳しくはないので違うかもしれませんが、
後者がコンパイルエラーになるのはListView1がstaticなオブジェクトではないからではないでしょうか?
前者の場合はthisというオブジェクトのインスタンスを指定していますが、
後者はそうではないのでエラーになるのではないでしょうか?
オブジェクトとインスタンスの違いの区別があいまいなのですが、お願いできますか?

Re: [C#] thisキーワードの使い方

Posted: 2013年3月25日(月) 19:20
by nil
オブジェクト、という言葉には様々な用法があるようなのですが、
そのうちの一つとして変数の「型」を表す、というものが有り、私はその意味としてオブジェクトという言葉を選びました。

なので、この場合、
型であるMainWindowがオブジェクト、newをした結果生成されたオブジェクトの実体がインスタンスということです。

Re: [C#] thisキーワードの使い方

Posted: 2013年3月25日(月) 23:19
by GRAM
thisの使い方云々ではないもっと根本的な話なような気がするのですが…

THISTEST.MainWindow.ListView1.Dock は

前半部分THISTEST.MainWindowについていえば
THISTEST名前空間の中のMainWindowクラスを指していますが、(つまりこれは型ですが)

後半部分はMainWindowクラスのインスタンスのListView1プロパティー(もしくは単にメンバ)の中のDockプロパティーなので、
意味不明となりコンパイルエラーとなります。

自分自身をさしたいなら前半のthisでいいです。
そもそも何もつけないという選択肢もありです。

thisはどちらかというと自分自身を何かに代入するときに使います。 a = this;みたいな

Re: [C#] thisキーワードの使い方

Posted: 2013年3月26日(火) 11:12
by 沖 滉均
後者(実験2)はそもそもthisの使い方の話ではないような気がするのですが?

THISTEST.MainWindowはあくまでTHISTESTという名前空間内にあるMainWindowというクラスを参照しているだけで
MainWindowのインスタンスを参照しているわけではないですよね?
もちろん、MainWindowクラスはListView1を持ってないですし、継承元のFormもListView1は持っていないです。

あと、本件とは別途いくつか質問を放置されているようですが解決されたのでしょうか?
[C#] ツールバーの背景色
http://dixq.net/forum/viewtopic.php?f=3&t=12689
【 C# 】 エディットの色分け
http://dixq.net/forum/viewtopic.php?f=3&t=12609

Re: [C#] thisキーワードの使い方

Posted: 2013年3月26日(火) 12:01
by YuO
私もthis云々というよりも,メンバーへのアクセス方法に関する知識の問題だと思います。

メンバーへのアクセス方法は,そのメンバーがインスタンスメンバー (非staticメンバー) か,静的メンバー (staticメンバー) かで異なります。
  • インスタンスメンバー
    • 原則は,「呼び出し対象になっているオブジェクト . メンバー名」でアクセスする
    • 「呼び出し対象になっているオブジェクト」が「this」の場合,「メンバー名」のみでアクセスできる。この時,「this.」が省略されたとみなされる
  • 静的メンバー
    • 原則は,「型 . メンバー名」でアクセスする
    • 「型」が「現在実行しているメソッド(等)が定義されている型」またはその先祖の型の場合,「メンバー名」のみでアクセスできる。この時,「そのメンバーが定義されている型」とそれに続く「.」が省略されたとみなされる
さて,thisは,
現在実行しているメソッド/コンストラクター/プロパティ/イベントが定義されている型を持ち,呼び出し時に利用した「呼び出し対象になっているオブジェクト」を指し示す
識別子です。
# 一応,コンストラクターもプロパティもイベントも全部特殊なメソッドとしても扱われていますが……。

体系だったC#の入門書を一冊きちんと読んでみた方がよいのではないでしょうか。
面白くないのは百も承知ですが,基本的なところを押さえないと,プログラムは書けません。
オフトピック
thisの細かい取り扱いなんて普通は載っていなかったりしますが (構造体中でのthisは代入可能,とか)。
私も仕様書見て初めて知りましたし (後述仕様書 7.6.7 this-access / 11.3.6 this の概念 - 第2段落)。

また,名前の検索関係は非常にややこしい仕様があります。
仕様書上は上記の「省略できる」という書き方ではなく,simple-nameの名前検索方法として記述されています (後述仕様書 7.6.2 簡易名)。
涼雅 さんが書きました:オブジェクト、という言葉には様々な用法があるようなのですが、
そのうちの一つとして変数の「型」を表す、というものが有り、私はその意味としてオブジェクトという言葉を選びました。
あー……C#においてその用法で使うとまずいですね。
明確に,「インスタンスはオブジェクトとも呼びます。」と書かれています。
in C# 言語仕様 Version 4.0 - 1.6 クラスとオブジェクト - 第1段落
クラスは、クラスから動的に作成されるインスタンスの定義を提供します。インスタンスはオブジェクトとも呼びます。
A class provides a definition for dynamically created instances of the class, also known as objects.

Re: [C#] thisキーワードの使い方

Posted: 2013年3月26日(火) 12:47
by オカピーα
YuO さんが書きました:私もthis云々というよりも,メンバーへのアクセス方法に関する知識の問題だと思います。

メンバーへのアクセス方法は,そのメンバーがインスタンスメンバー (非staticメンバー) か,静的メンバー (staticメンバー) かで異なります。
  • インスタンスメンバー
    • 原則は,「呼び出し対象になっているオブジェクト . メンバー名」でアクセスする
    • 「呼び出し対象になっているオブジェクト」が「this」の場合,「メンバー名」のみでアクセスできる。この時,「this.」が省略されたとみなされる
  • 静的メンバー
    • 原則は,「型 . メンバー名」でアクセスする
    • 「型」が「現在実行しているメソッド(等)が定義されている型」またはその先祖の型の場合,「メンバー名」のみでアクセスできる。この時,「そのメンバーが定義されている型」とそれに続く「.」が省略されたとみなされる
さて,thisは,
現在実行しているメソッド/コンストラクター/プロパティ/イベントが定義されている型を持ち,呼び出し時に利用した「呼び出し対象になっているオブジェクト」を指し示す
識別子です。
# 一応,コンストラクターもプロパティもイベントも全部特殊なメソッドとしても扱われていますが……。

体系だったC#の入門書を一冊きちんと読んでみた方がよいのではないでしょうか。
面白くないのは百も承知ですが,基本的なところを押さえないと,プログラムは書けません。
オフトピック
thisの細かい取り扱いなんて普通は載っていなかったりしますが (構造体中でのthisは代入可能,とか)。
私も仕様書見て初めて知りましたし (後述仕様書 7.6.7 this-access / 11.3.6 this の概念 - 第2段落)。

また,名前の検索関係は非常にややこしい仕様があります。
仕様書上は上記の「省略できる」という書き方ではなく,simple-nameの名前検索方法として記述されています (後述仕様書 7.6.2 簡易名)。
涼雅 さんが書きました:オブジェクト、という言葉には様々な用法があるようなのですが、
そのうちの一つとして変数の「型」を表す、というものが有り、私はその意味としてオブジェクトという言葉を選びました。
あー……C#においてその用法で使うとまずいですね。
明確に,「インスタンスはオブジェクトとも呼びます。」と書かれています。
in C# 言語仕様 Version 4.0 - 1.6 クラスとオブジェクト - 第1段落
クラスは、クラスから動的に作成されるインスタンスの定義を提供します。インスタンスはオブジェクトとも呼びます。
A class provides a definition for dynamically created instances of the class, also known as objects.
みなさんご丁寧にありがとうございます!
YuOさんに質問です。
「 「呼び出し対象になっているオブジェクト」が「this」の場合,「メンバー名」のみでアクセスできる。この時,「this.」が省略されたとみなされる」
ここの意味がよく分からないです。「呼び出し対象になっているオブジェクト」が「this」とはどういうことでしょう?

みなさん本当にありがたいのですが、せっかくですので徹底的に理解させてください!
引き続きよろしくお願いします!

Re: [C#] thisキーワードの使い方

Posted: 2013年3月26日(火) 12:48
by オカピーα
沖 滉均 さんが書きました:後者(実験2)はそもそもthisの使い方の話ではないような気がするのですが?

THISTEST.MainWindowはあくまでTHISTESTという名前空間内にあるMainWindowというクラスを参照しているだけで
MainWindowのインスタンスを参照しているわけではないですよね?
もちろん、MainWindowクラスはListView1を持ってないですし、継承元のFormもListView1は持っていないです。

あと、本件とは別途いくつか質問を放置されているようですが解決されたのでしょうか?
[C#] ツールバーの背景色
http://dixq.net/forum/viewtopic.php?f=3&t=12689
【 C# 】 エディットの色分け
http://dixq.net/forum/viewtopic.php?f=3&t=12609
な、なんとなくですが分かってきました!
では、「ListView1」を持っているクラスというのは一体何なのでしょう?

※放置していた質問の件、解決にしておきました。
※お騒がせしました。

Re: [C#] thisキーワードの使い方

Posted: 2013年3月26日(火) 12:56
by nil
YuO さんが書きました:
涼雅 さんが書きました: オブジェクト、という言葉には様々な用法があるようなのですが、
そのうちの一つとして変数の「型」を表す、というものが有り、私はその意味としてオブジェクトという言葉を選びました。
あー……C#においてその用法で使うとまずいですね。
明確に,「インスタンスはオブジェクトとも呼びます。」と書かれています。
in C# 言語仕様 Version 4.0 - 1.6 クラスとオブジェクト - 第1段落
クラスは、クラスから動的に作成されるインスタンスの定義を提供します。インスタンスはオブジェクトとも呼びます。
A class provides a definition for dynamically created instances of the class, also known as objects.
これは失礼しました。
ご指摘ありがとうございます。

Re: [C#] thisキーワードの使い方

Posted: 2013年3月27日(水) 14:08
by YuO
オカピーα さんが書きました:「 「呼び出し対象になっているオブジェクト」が「this」の場合,「メンバー名」のみでアクセスできる。この時,「this.」が省略されたとみなされる」
ここの意味がよく分からないです。「呼び出し対象になっているオブジェクト」が「this」とはどういうことでしょう?

コード:

this.Foo
というコードは,

コード:

Foo
と書ける,ということです。
「呼び出し対象になっているオブジェクト . メンバー名」の「呼び出し対象になっているオブジェクト」が「this」で,「メンバー名」が「Foo」です。
オカピーα さんが書きました:みなさん本当にありがたいのですが、せっかくですので徹底的に理解させてください!
C#の文法に特化した書籍を買って,それを読む方が早いし確実だと思いますけどね……。

Re: [C#] thisキーワードの使い方

Posted: 2013年3月27日(水) 14:41
by softya(ソフト屋)
私もC#のちゃんとした入門書を読まれた上で質問されたほうが良いと思います。
用語を調べられる辞書としても役立つのでは?

入門書を避けられる理由があるんでしょうか。

Re: [C#] thisキーワードの使い方

Posted: 2013年3月27日(水) 15:49
by オカピーα
分かりました!入門書を買ってじっくり取り組むことにします!
みなさんありがとうございました!頑張ります!