連載改訂版 C#入門第9章 ステートメント |
![]() |
プログラムの中に同じ名前の変数名がいくつも登場することは、決して珍しくない。まったく独立して混乱をきたさない文脈で、同じ名前の変数名を別個に宣言することは、コンパイラを混乱させることはなく、曖昧さもなく、実行コードを生成することができる。しかし、ときとして、コンパイラは混乱しなくてもソースを読み書きする人間が混乱する場合もある。そこで、C#では同じ名前の変数を制限する機能を持っている。以下はその機能を調べるために作成してみたソース・コードである。コンパイル・エラーを見るためのソースなので、実行することはできない。
1: using System; |
このソースには、クラスClass1にxという名前のメンバ変数が存在する。そして、それぞれのメソッド内部で、あらためてxというローカル変数を宣言することを試みている。まず8〜12行目のメソッドsample1と、13〜17行目のメソッドsample2を比較していただきたい。sample1は、まずクラスのメンバ変数xにアクセスした後で、ローカル変数xを宣言しようとしている。1つのブロックの中で、同じxという名前が別の変数を示すために使用することは許されておらず、コンパイル・エラーが発生する。しかし、sample2のほうは、15行目も16行目も同じ1つのxを扱っているため、これはエラーにならない。26行目は、22〜28行目の親スコープ内でxという変数が宣言されている状態で、25〜27行目の子スコープで同じ変数名を宣言しようとしたものである。この場合、子スコープ内で異なる変数を同じ内容で参照しようとしたわけではないがエラーになる。29行目は、クラスのメンバ変数xを参照しようとしているが、このメソッド内ではすでにxというローカル変数が宣言されておりエラーになる。
このエラーに遭遇した場合、変数名を変更することが必要となる。変数名を、区別できる分かりやすい名前に書き換えることは、ソースを分かりやすくすることにも貢献するので、ぜひ行うべきだろう。
変数を宣言する際に、それが決まった値を持ち、変更されないことを指定する機能がある。1つはconstキーワードを付加する方法であり、もう1つはreadonlyキーワードを付加する方法である。より正確にいえば、constキーワードは変数ではなく定数であることを示すもので、readonlyキーワードは読み取り専用で代入できない変数を示すものである。この2つは同じように見えるかもしれないが、機能は同等ではない。以下はそれを示したサンプル・ソースである。
1: using System; |
これを実行すると以下のようになる。
![]() |
まず7行目では、constを用いて定数を宣言している。8行目では、readonlyを用いて読み出し専用の変数を宣言している。最初に注目していただきたいのは、初期化するタイミングである。constは、宣言の中で値を指定する。readonlyでも同じことはできるが、それだけではなく、11行目のようにコンストラクタの中で値を代入して初期化することもできる。しかし、通常のメソッド内から書き込もうとすると16行目のようにコンパイル・エラーになる。この違いの結果、constは何があっても必ず同じ値を持つのに対して、readonlyは実行時に当てはめる値を決定することが可能になる。
両者の相違は、複数のインスタンスを作成する場合にも出てくる。constは、どのインスタンスから参照しても同じ値になるが、readonlyは必ずしも同じ値になるとは限らない。つまり、readonlyは(staticとして宣言されていないメンバ変数であれば)インスタンスの中にある変数の1つであると見なすことができる。一方、constはインスタンスの一部ではなく、独立した定義と見なすと分かりやすい。実際に、readonlyをstaticにするにはstaticキーワードを付ける必要があるが、constは最初からstaticであるかのように扱うことができる。![]()
『新プログラミング環境 C#がわかる+使える』本記事は、(株)技術評論社が発行する書籍『新プログラミング環境 C#がわかる+使える』から許可を得て一部分を転載したものです。 【本連載と書籍の関係について 】 この書籍は、本フォーラムで連載した「C#入門」を大幅に加筆修正し、発行されたものです。連載時はベータ版のVS.NETをベースとしていましたが、書籍ではVS.NET製品版を使ってプログラムの検証などが実施されています。技術評論社、および著者である川俣晶氏のご好意により、書籍の内容を本フォーラムの連載記事として掲載させていただけることになりました。 →技術評論社の解説ページ ご注文はこちらから |
| INDEX | ||
| 改訂版 C#入門 | ||
| 第9章 ステートメント | ||
| 9-1 ブロック | ||
| 9-4 繰り返し | ||
| 9-6 メソッドからの脱出 | ||
| 9-8 ラベルとジャンプ | ||
| Column - スコープと変数 - | ||
| 「連載:改訂版 C#入門」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -




