講座全体の概要
プログラミング基礎講座の第4回です。講座全体の概要は以下の記事ゼロから始めるプログラミング基礎講座 第1回【講座の概要・目的】をご覧ください。
変数とは
前回の講座で、「変数」というものが出てきましたね。変数を理解しなければ、今後、プログラミング学習を進めることができないほど重要なものです。今回はこの変数について理解を深めたいと思います。
では、Visual Studio で新しいプロジェクトを作成しましょう。名前は「BasicCourse4_1」とします。プロジェクトの作成方法がわからない場合は、第2回の記事からご覧ください。
プロジェクトを作成したら、以下の様にコードを変更してください。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
namespace BasicCourse4_1.Pages
{
public class IndexModel : PageModel
{
private readonly ILogger<IndexModel> _logger;
public int 親のパブリック変数;
private int 親のプライベート変数;
//private int 子の変数を受け取る変数 = 子の変数;
public const string COURSE_NAME = "ゼロから始めるプログラミング基礎講座";
public string Title;
public int CourseNumber;
public IndexModel(ILogger<IndexModel> logger)
{
_logger = logger;
}
public void OnGet()
{
int 子の変数;
親のパブリック変数 = 1;
親のプライベート変数 = 1;
子の変数 = 1;
CourseNumber = 4;
Title = COURSE_NAME + " 第" + CourseNumber + "回【変数・定数を理解する】";
//COURSE_NAME = "オブジェクト指向プログラミング講座";
//CourseNumber = "4";
}
}
}
@page
@model IndexModel
@{
ViewData["Title"] = "Home page";
}
<div class="text-center">
<h1>@Model.Title の実行結果</h1>
<p>@Model.親のパブリック変数</p>
@*<p>@Model.親のプライベート変数</p>*@
@*<p>@Model.子の変数</p>*@
</div>
前回までの講座で、変数とはデータの入れ物であるという説明をしました。「Title」と「CourseNumber」という変数は以下の様に作成しています。
public string Title;
public int CourseNumber;
ここまで変数を作成すると言ってきましたが、プログラミングの用語では変数を宣言すると言います。
話がそれますが、プログラミングの専門用語がたくさん出てくると、すぐには覚えられないと思います。それを意識して覚える必要はなく、学習を進める内に自然と覚えていければ大丈夫です。ただ、仕事等で他人とプログラミングの話をする上では、共通の用語を使った方がコミュニケーションをとりやすいので、覚えなくていいということではありません。
私の講座では意識的に、徐々に専門用語を増やして自然と覚えていただけるように考えています。初めて出る専門用語については説明をしてから使うように気を付けていますが、わからない用語が出てきた場合はコメント欄などでお知らせください。
ちなみに、1つ1つの変数などを識別するもの、要するに「名前」のことを「識別子」と言います。これはあまり使われない用語ですが、Visual Studio のエラーメッセージやヘルプ等では使われていますので、識別子がどうとかいうエラーが出た時はこれを思い出して、名前が間違っていたりしないか確認してください。
変数に話を戻します。変数宣言の構文(文法)は以下となります。「 [ ] 」はその部分が省略可能であることを表しています。省略せずに記述すると、宣言と同時に初期値を設定できます。
アクセス修飾子 型 変数名[= 初期値]
上の2つの変数を例にすると、「public」がアクセス修飾子、「string」および「int」が型です。この2つの概念について理解することが今回の目標です。
アクセス修飾子とは
アクセス修飾子の説明をする前にスコープという概念を理解する必要があります。
スコープ(scope)とは日本語に訳すと「範囲」という意味です。プログラミングでは、1つの意味のあるかたまりをスコープと言います。C#においては、「{ }」で囲まれた範囲が1つのスコープです。今回の例のIndex.cshtml.csでは、スコープが4つあります。
namespace BasicCourse4_1.Pages
{
public class IndexModel : PageModel
{
public IndexModel(ILogger<IndexModel> logger)
{
}
public void OnGet()
{
}
}
}
最初に記述されている
namespace BasicCourse4_1.Pages
が1番上のレベルのスコープです。その中にある
public class IndexModel : PageModel
が次のレベルのスコープです。さらにその中にある
public IndexModel(ILogger<IndexModel> logger)
public void OnGet()
の2つが一番下のレベルのスコープです。
この様にスコープは入れ子構造で、上のレベルが親、下のレベルが子となる親子関係となっています。このスコープ間の関係性を決めるものが
アクセス修飾子
です。アクセス修飾子は変数以外でも使いますが、今回は話を簡単にするため、変数に係る以下の部分だけに注目して説明します。
public class IndexModel : PageModel
{
public int 親のパブリック変数;
private int 親のプライベート変数;
//private int 子の変数を受け取る変数 = 子の変数;
public void OnGet()
{
int 子の変数;
親のパブリック変数 = 1;
親のプライベート変数 = 1;
子の変数 = 1;
}
}
親のスコープ内でアクセス修飾子がpublicな変数「親のパブリック変数」と、privateな変数「親のプライベート変数」を宣言しています。
この2つの変数を子のスコープ内で使用する=アクセスする上では何も違いはなく、アクセスできます。
では、逆に子のスコープで宣言した変数は親からアクセスできるでしょうか?
//private int 子の変数を受け取る変数 = 子の変数;
の部分の「//」を削除して、コメントを解除してみてください。「子の変数」というものが存在しないという様なエラーになると思います。
それから、「OnGet()」のスコープ内の
int 子の変数;
にはアクセス修飾子がありませんが、publicやprivateを記述してみてください。
すると、エラーがたくさん表示されてしまうと思います。実は本来、このスコープではアクセス修飾子を指定できないのですが、無理やり指定したことにより、以降のコードをVisual Studioが解析できなくなったためにエラーがたくさん出てしまったのです。このように、大量にエラーが出てしまった場合は、何か文法的に間違っている場合が多いので、「 ; 」を付け忘れている文や、「 ( 」「 ) 」の個数が合わない等の単純な誤りがないか確認しましょう。
実は、「OnGet()」のスコープは、関数というものなのですが、関数の中で宣言できる変数はローカル変数と言って、その関数の中だけで使える変数になります。アクセス修飾子は不要なので、そもそも記述できません。
続いて、親子関係にないスコープから、「親のパブリック変数」と「親のプライベート変数」にアクセスするとどうなるか確認しましょう。先ほどコメントを解除した部分は元に戻してエラーの無い状態にしてください。
<div class="text-center">
<h1>@Model.Title の実行結果</h1>
<p>@Model.親のパブリック変数</p>
@*<p>@Model.親のプライベート変数</p>*@
@*<p>@Model.子の変数</p>*@
</div>
上のコードでは「親のパブリック変数」にアクセスしています。これはエラーにはなっていません。では、その下の2行のコメントを解除してみてください。「@*」「*@」を削除すれば解除できます。ちょっと面倒なので、「編集」メニューの「詳細」の中から「選択範囲のコメントを解除」を選択するか、メニュー下に同様のボタンがありますのでそちらから解除した方が楽です。
解除すると、2行ともエラーとなるはずです。親子関係にない場合は、「public」の指定がある変数にしかアクセスできないことがわかると思います。
では、何でも「public」にしておけば良いと思うかもしれませんが、それはやめましょう。発想としては逆で、基本的には「private」や「ローカル変数」などアクセスできるスコープをできるだけ限定して、どうしても他のスコープからアクセスが必要な時だけ「public」にしましょう。理由を言い出すと長くなるので今回の講座ではやめておきましょう。また、アクセス修飾子は今回の2つ以外にもありますが、当面は必要ありませんので、この2つだけ意識して使っていきましょう。
いかがでしょうか、アクセス修飾子について、なんとなくわかったでしょうか。今はしっかり理解できていなくても大丈夫です。学習を進めるうちに理解を深めていきましょう。
たくさんの新しいことが出てきましたので、頭を整理するためにもここでいったん休憩にしましょう。お疲れ様でした。
この記事へのコメントはありません。