連載:放課後VB教室第2回 文字列型の変数とチーズ大福羽山 博2008/07/11 |
Page1
Page2
|
私立関崇高校の大福研究会というナゾのサークルに所属する「サブロー」とクラスメイトの「ラスクちゃん」は、ひょんなことからVisual Basic(VB)のプログラミングを教えてもらうことになった。先生はサブローの先輩で、大学の先生でもある「ネスト先生」。前回は値型の変数と参照型の変数の違いを知った。さてさて今回は……。
プロローグ 〜 啓昭大学オープン・キャンパス
ネスト先生の研究室ってどこなんだろ。大学のキャンパスって広くて迷っちゃうね。でも、オープン・キャンパスでいろんな屋台があるのってヘンだよね。大学祭と間違ってるんじゃない? あ、たこ焼き屋さん! サブロー、たこ焼き買うて。
って、どうしてそこだけ大阪弁なんだよ。ネスト先生の大学だから何もかもちょっとズレてるんだよ。えーと、たこ焼き1つくださいな。
はいはい、たこ焼きね。でも、今日のおすすめは、高円(たかまど)のチーズ大福。ブルーベリーも入ってるよ。冷凍してあるから、自然解凍してから食べよう。
うわっ、ネスト先生! なんで、先生が屋台でたこ焼き屋さんやってるんですか? しかも、チーズ大福売ってるって……。
この大学の名物だよ。大学祭のときは学生が屋台を出すけど、オープン・キャンパスのときは、屋台は先生が全部やってるんだ。しかも、何の店かは入ってみてのお楽しみ。それはそうと、そろそろ休憩時間だから一緒に研究室に行こう。Visual Basicの謎解きの続きだったね。
あたし、この大学気に入ったかも! チーズ大福ちょっと硬いけど。
あ、ラスクちゃん、歩きながらもう食べてる! だから、解凍しなくちゃ。いい感じでとけてくると、モチモチしておいしいんだよ。チーズの風味もいいし。……はい、ここがボクの研究室。じゃあ、始めよう。
文字列型の変数は値が変更できない?
こないだは値型と参照型の話をしたよね。覚えてるかな。例えば、文字列型の変数は参照型だから、
|
と宣言すると、Messageは「放課後VB教室」という文字列を参照する変数になるってことだったよね。図で表せばこんな感じ。
図1 String型の変数は文字列を参照する |
はいっ! もちろん。サブローがいっぱいボケてくれたおかげで、あたしにもよく分かりました。変数の中にデータが入っているんじゃなくて、変数の中にはデータがどこにあるかという情報が入ってるってイメージですよね。
……ボケって、あれはワザとなのっ。ネスト先生とラスクちゃんの期待に応えただけだよ。ホントはちゃーんと分かってたんだから。
はいはい。じゃあ、今日はその続きを話そう。文字列型の変数は参照型なんだけど、動きだけを見ると値型のように見えることがあるんだ。まあ、いわばこのチーズ大福のようなもんだ。和風でありながら洋菓子のような風味と味わい。なのに、モチモチとした和菓子の食感……。
あのー、それはあんまり関係ないような気が……。でも、なんだか訳の分からない話ですね。いったいどういうことですか。
そうだね、順を追って説明しよう。文字列型、つまりStringクラスのヘルプを見てごらん。ちょっと気になることが書いてあるね。ほら、文字列をString型の変数に代入すると、その文字列は変更できなくなります、とか何とか……。
ホントだ。内容が変更できないとずいぶんと不便じゃないですか? でも、
|
みたいなコードは書けそうな気がするんですけど。
ラスクちゃんはいいところに気が付くね。確かにそのコードは書ける。で、文字列の内容も変更されたように見える。そうだ、このコードのイメージを図にしてみよう。サブローくん、やってみてくれるかな。
お安いご用です。Messageに代入するんだから、こんな感じですか?
図2 String型の変数に文字列を代入する(間違ったイメージ) |
ははは。また、サブローくんは期待に応えてくれたようだね。残念ながら、これは間違いだ。ヘルプに、文字列は変更できなくなるって書いてあるだろ。これじゃあ、文字列を変更してるじゃないか。
ええーっ。じゃあどうすればいいんですか。変更できないのに代入はできるって……もう、何がなんだか! 頭がチーズ大福ですよ。
何を訳の分からないこといってるんだよ。ほら、ヘルプの続きを読んでごらん。何らかの方法で文字列を変更すると、新しい文字列を作成し、変更前の文字列を破棄するって書いてあるよね。この書き方はあいまいだけど、文字列そのものを変えるのではなく、新しい文字列を作って、その参照を代入するってことになるわけだ。図で表すとこういう感じになるかな。
図3 String型の変数に文字列を代入する |
なるほど! 内容を変更してるわけじゃないけど、新しく作り直しているから、内容が変更されたように見えるんだ。面白い!
ということは、「&」演算子を使って連結した文字列を代入するときも同じですね。
|
なら、「放課後VB教室」に「へようこそ」が直接連結されるんじゃなくて、「放課後VB教室」と「へようこそ」が連結された文字列が新しく作られて、Messageにその参照が代入されるってことだ。
そう、そのとおり。2人ともちゃんと理解できたね。じゃあ、次の2つのコードの動きはどうなるかな? 同じ変数名や同じ文字列だと飽きるから、別のにしようか。どういう違いがあるだろう?
|
|
えーと、は参照を代入するわけだからYourNameの指し示すものとMyNameの指し示すものが同じになって、こんなイメージ。
図4 文字列の参照を代入する |
でも、は、同じ文字列だけど別々に代入してるから、いちいち新しい文字列を作っているみたい。こうかな? なんだか、無駄な感じがするけど……。
図5 同じ内容の文字列を個別に宣言する(間違ったイメージ) |
そう、残念ながら、図5は間違ってる。でも、ラスクちゃんは素直でいいね。図を描きながら違和感を覚えるというのも、なかなかカンがいい!
な、なんでボクのときはコテンパンで、ラスクのときはそうなんですかー。ボクだって、ボクだって……頑張ってるのに。
まあまあ、気にしない気にしない。実は、どちらのコードでも最初の図4のようになる。内部に文字列のテーブルが作られていて、同じ文字列を別々に代入したときには、新しい文字列をそれぞれ作るのではなくて、テーブルを探して、すでにある文字列の参照を返すようになってる。だから、どちらも同じ文字列を指すようになるわけ。あ、テーブルというのは一覧表のようなものだね。
へぇー、うまくできてるんだ。あ、でも、最初の「値型のようにも見える」って話とはどう関係するんですか。
あ、いままでの話とは関係ない。
へっ?
へっ? じゃないよ、そこは「なんやそれー」とツッコむところね。いや、ちょっとは関係あるというか、ここまではまあ伏線だね。値型っぽく見える話はこれから。サブローくんは、ちゃんとツッコミも勉強しておくように。
INDEX | ||
放課後VB教室 | ||
第2回 文字列型の変数とチーズ大福 | ||
1.文字列型の変数は値が変更できない? | ||
2.StringクラスとStringBuilderクラスの違い | ||
「放課後VB教室」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|
- - PR -