連載:放課後VB教室

第2回 文字列型の変数とチーズ大福

羽山 博
2008/07/11
Page1 Page2

 私立関崇高校の大福研究会というナゾのサークルに所属する「サブロー」とクラスメイトの「ラスクちゃん」は、ひょんなことからVisual Basic(VB)のプログラミングを教えてもらうことになった。先生はサブローの先輩で、大学の先生でもある「ネスト先生」。前回は値型の変数と参照型の変数の違いを知った。さてさて今回は……。

登場人物紹介はこちら

プロローグ 〜 啓昭大学オープン・キャンパス

ネスト先生の研究室ってどこなんだろ。大学のキャンパスって広くて迷っちゃうね。でも、オープン・キャンパスでいろんな屋台があるのってヘンだよね。大学祭と間違ってるんじゃない? あ、たこ焼き屋さん! サブロー、たこ焼き買うて。

って、どうしてそこだけ大阪弁なんだよ。ネスト先生の大学だから何もかもちょっとズレてるんだよ。えーと、たこ焼き1つくださいな。

はいはい、たこ焼きね。でも、今日のおすすめは、高円(たかまど)のチーズ大福。ブルーベリーも入ってるよ。冷凍してあるから、自然解凍してから食べよう。

うわっ、ネスト先生! なんで、先生が屋台でたこ焼き屋さんやってるんですか? しかも、チーズ大福売ってるって……。

この大学の名物だよ。大学祭のときは学生が屋台を出すけど、オープン・キャンパスのときは、屋台は先生が全部やってるんだ。しかも、何の店かは入ってみてのお楽しみ。それはそうと、そろそろ休憩時間だから一緒に研究室に行こう。Visual Basicの謎解きの続きだったね。

あたし、この大学気に入ったかも! チーズ大福ちょっと硬いけど。

あ、ラスクちゃん、歩きながらもう食べてる! だから、解凍しなくちゃ。いい感じでとけてくると、モチモチしておいしいんだよ。チーズの風味もいいし。……はい、ここがボクの研究室。じゃあ、始めよう。

文字列型の変数は値が変更できない?

こないだは値型と参照型の話をしたよね。覚えてるかな。例えば、文字列型の変数は参照型だから、


Dim Message As String = "放課後VB教室"

と宣言すると、Messageは「放課後VB教室」という文字列を参照する変数になるってことだったよね。図で表せばこんな感じ。


図1 String型の変数は文字列を参照する

はいっ! もちろん。サブローがいっぱいボケてくれたおかげで、あたしにもよく分かりました。変数の中にデータが入っているんじゃなくて、変数の中にはデータがどこにあるかという情報が入ってるってイメージですよね。

……ボケって、あれはワザとなのっ。ネスト先生とラスクちゃんの期待に応えただけだよ。ホントはちゃーんと分かってたんだから。

はいはい。じゃあ、今日はその続きを話そう。文字列型の変数は参照型なんだけど、動きだけを見ると値型のように見えることがあるんだ。まあ、いわばこのチーズ大福のようなもんだ。和風でありながら洋菓子のような風味と味わい。なのに、モチモチとした和菓子の食感……。

あのー、それはあんまり関係ないような気が……。でも、なんだか訳の分からない話ですね。いったいどういうことですか。

そうだね、順を追って説明しよう。文字列型、つまりStringクラスのヘルプを見てごらん。ちょっと気になることが書いてあるね。ほら、文字列をString型の変数に代入すると、その文字列は変更できなくなります、とか何とか……。

ホントだ。内容が変更できないとずいぶんと不便じゃないですか? でも、


Dim Message As String = "放課後VB教室"
Message = "放課後VBパラダイス"

みたいなコードは書けそうな気がするんですけど。

ラスクちゃんはいいところに気が付くね。確かにそのコードは書ける。で、文字列の内容も変更されたように見える。そうだ、このコードのイメージを図にしてみよう。サブローくん、やってみてくれるかな。

お安いご用です。Messageに代入するんだから、こんな感じですか?


図2 String型の変数に文字列を代入する(間違ったイメージ)

ははは。また、サブローくんは期待に応えてくれたようだね。残念ながら、これは間違いだ。ヘルプに、文字列は変更できなくなるって書いてあるだろ。これじゃあ、文字列を変更してるじゃないか。

ええーっ。じゃあどうすればいいんですか。変更できないのに代入はできるって……もう、何がなんだか! 頭がチーズ大福ですよ。

何を訳の分からないこといってるんだよ。ほら、ヘルプの続きを読んでごらん。何らかの方法で文字列を変更すると、新しい文字列を作成し、変更前の文字列を破棄するって書いてあるよね。この書き方はあいまいだけど、文字列そのものを変えるのではなく、新しい文字列を作って、その参照を代入するってことになるわけだ。図で表すとこういう感じになるかな。


図3 String型の変数に文字列を代入する

なるほど! 内容を変更してるわけじゃないけど、新しく作り直しているから、内容が変更されたように見えるんだ。面白い!

ということは、「&」演算子を使って連結した文字列を代入するときも同じですね。


Dim Message As String = "放課後VB教室"
Message = Message & "へようこそ"

なら、「放課後VB教室」に「へようこそ」が直接連結されるんじゃなくて、「放課後VB教室」と「へようこそ」が連結された文字列が新しく作られて、Messageにその参照が代入されるってことだ。

そう、そのとおり。2人ともちゃんと理解できたね。じゃあ、次の2つのコードの動きはどうなるかな? 同じ変数名や同じ文字列だと飽きるから、別のにしようか。どういう違いがあるだろう?


Dim MyName As String = "ラスク"
Dim YourName As String
YourName = MyName



Dim MyName As String = "ラスク"
Dim YourName As String = "ラスク"

えーと、は参照を代入するわけだからYourNameの指し示すものとMyNameの指し示すものが同じになって、こんなイメージ。


図4 文字列の参照を代入する

でも、は、同じ文字列だけど別々に代入してるから、いちいち新しい文字列を作っているみたい。こうかな? なんだか、無駄な感じがするけど……。


図5 同じ内容の文字列を個別に宣言する(間違ったイメージ)

そう、残念ながら、図5は間違ってる。でも、ラスクちゃんは素直でいいね。図を描きながら違和感を覚えるというのも、なかなかカンがいい!

な、なんでボクのときはコテンパンで、ラスクのときはそうなんですかー。ボクだって、ボクだって……頑張ってるのに。

まあまあ、気にしない気にしない。実は、どちらのコードでも最初の図4のようになる。内部に文字列のテーブルが作られていて、同じ文字列を別々に代入したときには、新しい文字列をそれぞれ作るのではなくて、テーブルを探して、すでにある文字列の参照を返すようになってる。だから、どちらも同じ文字列を指すようになるわけ。あ、テーブルというのは一覧表のようなものだね。

へぇー、うまくできてるんだ。あ、でも、最初の「値型のようにも見える」って話とはどう関係するんですか。

あ、いままでの話とは関係ない。

へっ?

へっ? じゃないよ、そこは「なんやそれー」とツッコむところね。いや、ちょっとは関係あるというか、ここまではまあ伏線だね。値型っぽく見える話はこれから。サブローくんは、ちゃんとツッコミも勉強しておくように。

 

 INDEX
  放課後VB教室
  第2回 文字列型の変数とチーズ大福
  1.文字列型の変数は値が変更できない?
    2.StringクラスとStringBuilderクラスの違い
 
インデックス・ページヘ  「放課後VB教室」


Insider.NET フォーラム 新着記事
  • 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH