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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
オカピーα
記事: 120
登録日時: 8年前

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

#1

投稿記事 by オカピーα » 7年前

こんばんは、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;
            //アクセス不可能!コンパイルエラー!
        }
    }
}
なぜコンパイルエラーなのでしょう?わからなくなってきました。
どなたか教えてください。お願いします。
C,C++,C#,これらを極めることを「3C政策」と言う

nil
記事: 428
登録日時: 8年前

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

#2

投稿記事 by nil » 7年前

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

オカピーα
記事: 120
登録日時: 8年前

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

#3

投稿記事 by オカピーα » 7年前

涼雅 さんが書きました:C#には詳しくはないので違うかもしれませんが、
後者がコンパイルエラーになるのはListView1がstaticなオブジェクトではないからではないでしょうか?
前者の場合はthisというオブジェクトのインスタンスを指定していますが、
後者はそうではないのでエラーになるのではないでしょうか?
オブジェクトとインスタンスの違いの区別があいまいなのですが、お願いできますか?
C,C++,C#,これらを極めることを「3C政策」と言う

nil
記事: 428
登録日時: 8年前

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

#4

投稿記事 by nil » 7年前

オブジェクト、という言葉には様々な用法があるようなのですが、
そのうちの一つとして変数の「型」を表す、というものが有り、私はその意味としてオブジェクトという言葉を選びました。

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

アバター
GRAM
記事: 164
登録日時: 9年前
住所: 大阪

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

#5

投稿記事 by GRAM » 7年前

thisの使い方云々ではないもっと根本的な話なような気がするのですが…

THISTEST.MainWindow.ListView1.Dock は

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

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

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

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

アバター
沖 滉均
記事: 237
登録日時: 9年前
住所: K県F市

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

#6

投稿記事 by 沖 滉均 » 7年前

後者(実験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
There is no royal road to learning.
codeタグで指定できる言語
画像

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

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

#7

投稿記事 by YuO » 7年前

私も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.

オカピーα
記事: 120
登録日時: 8年前

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

#8

投稿記事 by オカピーα » 7年前

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」とはどういうことでしょう?

みなさん本当にありがたいのですが、せっかくですので徹底的に理解させてください!
引き続きよろしくお願いします!
C,C++,C#,これらを極めることを「3C政策」と言う

オカピーα
記事: 120
登録日時: 8年前

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

#9

投稿記事 by オカピーα » 7年前

沖 滉均 さんが書きました:後者(実験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」を持っているクラスというのは一体何なのでしょう?

※放置していた質問の件、解決にしておきました。
※お騒がせしました。
C,C++,C#,これらを極めることを「3C政策」と言う

nil
記事: 428
登録日時: 8年前

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

#10

投稿記事 by nil » 7年前

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.
これは失礼しました。
ご指摘ありがとうございます。

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

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

#11

投稿記事 by YuO » 7年前

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

コード:

this.Foo
というコードは,

コード:

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

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

#12

投稿記事 by softya(ソフト屋) » 7年前

私もC#のちゃんとした入門書を読まれた上で質問されたほうが良いと思います。
用語を調べられる辞書としても役立つのでは?

入門書を避けられる理由があるんでしょうか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

オカピーα
記事: 120
登録日時: 8年前

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

#13

投稿記事 by オカピーα » 7年前

分かりました!入門書を買ってじっくり取り組むことにします!
みなさんありがとうございました!頑張ります!
C,C++,C#,これらを極めることを「3C政策」と言う

閉鎖

“C言語何でも質問掲示板” へ戻る