1.C#言語の特徴

この記事では、当社の新人エンジニア研修の参考にC#を解説します。

第1章となる今回はC#言語を初めて学ぶ皆さんが知っておきたいことをまとめました。

C#言語の特徴(この新人エンジニア研修でC#を選択している理由とも言えます)は、以下の4点です。

WindowsやLinux、macOSなど、.NETランタイム(.NET Runtime)を利用することで幅広く実行可能。自宅学習やマルチプラットフォームに対応できる。

現在主流のプログラミングパラダイムであるオブジェクト指向型言語の基本を学ぶことができる。

デスクトップアプリケーション、ゲーム(Unity)、ウェブアプリケーション(ASP.NET)、クラウドとの連携など、幅広い分野で活用されている。

多くの言語(C/C++/Javaなど)と類似点が多いため、次に他の言語を学ぶ際に容易に習得できる。

多くの高級言語の祖であり、汎用プログラミング言語として名高いC言語を学習しても、上記すべてのメリットを同時には得られません。C言語はマルチプラットフォームに対応はしていませんし、ハードウェアよりの緻密で細かい処理は得意ですが、大規模なアプリの開発には向いていないからです。また、AI分野で注目度が高いPython、国内発祥のRuby、Apple製品で人気が高まっているSwiftなどの言語も魅力的ではありますが、③の部分(多様なタイプのアプリ開発やWindowsアプリなどでの優位性)を考えれば、C#の有用性は大変高いと言えるでしょう。

当社の新人エンジニア研修で最も多いのはJavaを使った講習ですが、今後C#をプログラミング言語として使うことも多くなるのでは、と考えています。

この研修では、まずプログラムの基本知識である変数、演算子、メソッドについて学びます。次にオブジェクトとは何か?その概要を学習します。その上で、更に深いプログラミングの構文やオブジェクト指向の考え方について学んでいきます。

調べてみましょう

④他の言語との関係について概略は以下のとおりです。将来使うかもしれない言語について更に詳しく調べてみましょう。


1. C#とC言語との関係

関係

  • 歴史的背景: C言語は1970年代に開発された歴史のある言語です。C#はC言語の構文や記法から多くの影響を受けており、制御構造(if文、for文、while文など)のベースが似ています。
  • 言語タイプ: C言語が手続き型言語であるのに対し、C#はオブジェクト指向型の言語です。

習得の容易さ

  • C#の基本的な文法や概念を理解していれば、C言語の文法自体は比較的容易に理解できます。
  • C言語は手続き型言語であり、メモリ管理を直接行う部分があるため、C#のようなガベージコレクションに慣れていると戸惑うかもしれませんが、基本的なプログラミング概念は共通しています。
  • C#ではメモリのことをあまり意識しなくてもいいですが、メモリに興味をもってC言語を学ぶと、よりシステムレベルの知識が深まります。

分野

  • C言語: システムプログラミング、組み込みシステム、低レベルのハードウェア制御、OS開発など、メモリを直接操作する分野で存在感があります。

2. C#とC++との関係

関係

  • 歴史的背景: C#はC++やJavaから強く影響を受けており、C++の複雑さを改善する目的で設計された面があります。
  • 言語タイプ: C#とC++はどちらもオブジェクト指向型です。プログラミングの概念(OOP:Object-Oriented Programming)も共通しています。

習得の容易さ

  • C#の基本的な文法や概念を理解していれば、C++の文法も比較的容易に理解できます。
  • OOPの概念(クラス、オブジェクト、継承、ポリモーフィズムなど)は両言語で共通しているため、C#のOOPの知識はC++の学習に役立ちます。

分野

  • C++: ゲーム開発、高性能システム、デバイスドライバ、組み込みシステムなど。ネイティブコードの高速性が求められる領域で活躍しています。

3. C#とJavaとの関係

関係

  • 歴史的背景: C#はMicrosoftによって開発され、Javaの影響を非常に強く受けています。
  • 言語タイプ: C#とJavaはどちらもオブジェクト指向型です。プログラミングの概念(OOP)も共通しています。
  • 構文: C#の構文はJavaとよく似ており、多くの文法要素がほぼ同じ書き方で使えます。C#が生まれた当初は、「Microsoftが作ったJavaのコピー」だとも言われていましたが、近年のアップデートで独自の構文を生み出し、はっきりJavaとは別の言語だとも言える進化を遂げています。

習得の容易さ

  • Javaの知識があれば、C#の基本的な文法や構造をすぐに理解できます。
  • 両言語は.NETランタイム(C#)とJava仮想マシン(JVM)のように、似たコンセプトのバイトコード実行環境を持っています。

分野

  • C#: Windowsアプリケーション、ゲーム開発(Unity)、ウェブアプリケーション(ASP.NET)、エンタープライズソフトウェアなど、広範囲に活用されています。

4. C#とPythonとの関係

関係

  • 構文とスタイル: Pythonの構文はC#と異なりますが、基本的なプログラミング概念(変数、関数、ループ、条件分岐など)は共通しています。
  • オブジェクト指向: Pythonもオブジェクト指向プログラミングをサポートしており、C#のOOP知識が活かせます。

習得の容易さ

  • C#で学んだ基本的なプログラミング概念やアルゴリズムの知識は、Pythonにも直接適用できます。
  • PythonはC#より文法が簡潔で、初心者でも習得しやすいです。先にC#をしっかり学んでおけば、Pythonも比較的スムーズに習得できるでしょう。

分野

  • Python: データサイエンス、AI・機械学習、自動化スクリプト、科学計算などで利用されることが多いです。

2.C#の開発ツール、Visual Studio

C#でプログラムを開発するツールは、MicrosoftのVisual Studioが一般的です。ここまでに紹介した他の言語では、様々なエディタやツールが会社や経緯によって採用されるのですが、ことC#やVBなど、Microsoftが開発した言語には、Visual Studioを用いるのが定番です。この講義は、Visual Studioの無償版である、Visual Studio Community 2022(C# バージョン10.0)が皆さんのPCにインストール済みであることを前提に進めることにいたします。

まずは、学習用のソリューションを作成しましょう

ソリューションは、ある一つの目的を持って作られたいくつかのアプリケーションの集合と考えてくだされば良いと思います。例えば、商社向けのソリューションには、在庫管理、顧客管理や、給与計算その他諸々のアプリケーションが含まれる、というようなイメージです。各アプリケーションは、ソリューションの中に別々のプロジェクトとして格納されます。つまり、一つのソリューションは複数のプロジェクト(=アプリケーション)が集まって構成されるわけですね。C#の学習を行う第一歩として、Visual Studioに新しいソリューションを作りましょう。

最初に、アプリケーションを入れるフォルダを作成します。Cドライブの直下に、workspaceというフォルダを作っておいてください。準備が出来たら、Visual Studioを起動しましょう。最初の画面は以下のようになります。

新人エンジニア

上図の、「新しいプロジェクトの作成」をクリックします。すると、次のような画面になります。

新人エンジニア

ここでは、図の①「コンソールアプリ」をクリックしてください。コンソールアプリとは、プログラムが出力する文字を、コマンドプロンプトのような真っ黒な画面に表示するだけの単純なアプリケーションで、C#の基礎を学ぶのに適しています。図の②「次へ」ボタンを押します。

新人エンジニア

①プロジェクト名はsampleとして、②場所を先ほど作ったworkspaceに指定しましょう。ソリューション名は自動でプロジェクト名と同じになります。一つだけプロジェクトを持ったソリューションを作るやり方です。準備が出来たら③の「次へ」ボタンを押しましょう。

新人エンジニア

最後の画面は何も変更せずに、「作成」ボタンを押しましょう。すると、次のような画面になります。

新人エンジニア

Visual Studioは非常に多機能なので、一度に使い方を覚えることはありません。まずは基本的な部分から覚えましょう。

①このソリューションに含まれるプロジェクトと、それに属する部品などが表示されます。

②ここでファイルを編集します。Program.csは、Visual Studioが自動生成したC#のプログラムファイルです。

③エラーメッセージや実行時のログなどが表示されます。

④ここは、Visual Studioの動作モードを切り替えます。Debugは、開発中にバグを見つけやすくするためのモードです。

⑤デバッグモードでプログラムを実行するボタンです。

⑥デバッグ無しでプログラムを実行するボタンです。

3.C#プログラムの実行

では早速このプロジェクトを実行してみましょう。⑤のボタンを押してみてください。こんな画面になりますね。

新人エンジニア

出力にデバッグというタブができて、なにやらたくさんのレポートが表示されています。コマンドプロンプトには、最初にHello World!という文章が、その後に実行時のレポートがありますね。

実行されたのが、Program.csというファイルに書かれたコードであることがわかると思います。.csは、C#のコードが書かれたファイルであることを示す拡張子です。Program.csには、コンソールにHello World!と表示する処理が書いてあったわけです。

では、同じように⑥のボタンを押してみて、⑤のボタンの時とどう違うか見比べてみてください。違いがわかったら発表してみましょう。このように、Visual Studioでは開発はデバッグモードで行い、お客様に出荷するときにはReleaseモードでコンパイルしたアプリケーションを提出する、というやり方をします。

それではここで、C#でプログラムコードが実行されるまでの過程を少し詳しく解説しましょう。以下のような2つのステップを経ます。

  1. プログラムコードがコンパイルされて、中間言語(IL: Intermediate Language)コードが生成される。
  2. CLR(Common Language Runtime C#では.NETランタイム)によってILコードが実行される。

これが例えばC言語の場合ですと、

  1. プログラムコードがアーキテクチャ(OS等)に応じた形でコンパイルされてマシン語が作られる。
  2. マシン語が実行される。

という流れになっています。

つまり、下図のようにCLRが各種OSとの仲立ちをしてくれるため、C#プログラマーはアーキテクチャを意識せずにコードを記述しやすくなっているのです。

新人エンジニア
CLR(Common Language Runtime)がOSの違いを吸収する

新人エンジニアが最初に知っておきたいCLRの知識

CLRがOSの違いを吸収してくれます。

C#は、

“Write once, run anywhere”
「一度コードを書けば、どこでも実行できる」
(.NETやMonoなどのクロスプラットフォーム対応によって)
という優れた特徴を有していると言えます。(※実際には対応環境を揃える必要があるので、完全に意識不要とはいきませんが、、、)

では、Program.csのWorldの部分をご自分の名前に書き換えて、再度実行してみてください。名前は半角英字のローマ字で書きましょう。

// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, ここを自分の名前に変える!");

コマンドプロンプトにご自分の名前が表示されましたか?何故名前を半角英字のローマ字にしたかというと、皆さんにプログラミングにおける半角文字と全角文字の扱いの違いに注目して頂きたかったからです。キーボードから入力できる文字には全角文字と半角文字があります。数値や英字・記号を入力する際には全角文字が入らないように気をつけてください。というのも、大抵のプログラミング言語は、半角文字でしかコードを書けません。特に全角の見えない文字(全角のスペースなど)は、予期しないエラーを引き起こす筆頭の原因になります。全角の英数字や記号が入らないように日本語入力システム(IME)の設定を変えることもできます。IMEによって設定方法が異なるので、興味があれば調べてみてください。
では、もう一度プログラムが実行される過程を振り返ってみましょう。

  1. プログラムコードがコンパイルされてILコードが作られる
  2. ILコードがCLRによってメモリにロードされ、実行される
  3. 実行結果が表示される

①のところでは拡張子.csというファイルを作成し、コードを記述します。②では、Windowsの場合.exeファイルが生成され、それを実行することになります。

※なお、Program.csというソースファイルと、sample.exe、sample.dllというファイルがソリューションのどこかに作られています。どこに作られたか、講師の指示の下で探してみてください。

ここで大事なのは、このProgram.cs(ソースファイル)自体が直接「動作」しているわけではない、ということです。現在のノイマン型コンピュータでは、ソースコードをコンパイルした結果(ILコードやマシン語)がメモリにコピー(ロード)されて、はじめて動作が可能になります。この点は後で重要になってきますので、しっかり覚えておきましょう。

Program.csというソースファイルがVisual Studioによって自動的に.dllや.exeという実行可能なファイルにコンパイルされた後、それがメモリに読み込まれて実行されている、という流れです。

C#のソースファイルを手動でコンパイルすることもできますが、実際の開発ではVisual Studioなどの統合開発環境(IDE)が自動でコンパイルを行ってくれます。ショートカットキーひとつでコンパイルと実行を同時にしてくれるので便利です。
(「compile」は「一気に翻訳する」という意味です。それとは別に「interpret」「1文ずつ通訳する」方式のスクリプト言語もあります。気になる方は調べてみましょう。)

ここまでに出てきた用語をまとめます。

覚える必要はないですが、下図で概要を理解してください。

新人エンジニア
C# の開発環境

まず、みなさんがソースコードを入力するのがIDEです。IDEは.NET SDKを利用しています。.NET SDKの中にはC#コンパイラ(Roslynなど)や実行環境(.NET Runtime)などが含まれます。

これからIDEを使って開発をしていると、これら“縁の下の力持ち”の存在を忘れがちですが、時々思い出すようにしましょう。ここでは、さらに詳しくC#言語のプログラムコードを見ていきます。

4.C#プログラムの構成

先ほどのProgram.csをもう一度見てみましょう、こう表示されていると思います。

// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, あなたの名前");

//は、コメントと言って、実行されない注釈などを書くための書き方です。なので、実行部分は一行だけの簡単なコードになっていますが、実はこれ、省略形なんです。ちゃんと書くと、以下のようになります。

namespace sample;

using System;

public class Program
{
    public static void Main(string[] args)
    {
        Console.WriteLine("Hello, あなたの名前");
    }
}

Program.csを上記コードで置き換えて、もう一度実行ボタンを押してみてください。同じ結果が得られると思います。

1行目の

namespace sample;

は、このProgramというクラスは、sampleという場所にありますよ、という宣言です。この場所のことを名前空間と言います。

2行目の

using System;

は、C#の標準ライブラリ(便利なデータや処理の集合体)であるSystem名前空間にあるクラスを使いますよ、という宣言です。

続いて、

public class Program
{
    Console.WriteLine("Hello, あなたの名前");
}

この部分でProgramという名前のクラスを定義して、実行時の処理も記述しています。Console.WriteLine()は、さきほどのSystemという場所にあるConsoleというクラスが持っているWriteLineという処理を呼び出すコードです(詳細は後述)。

それではオブジェクト指向プログラミングの導入として、クラスがどういうものなのか、まずは概要を把握しましょう。

5.クラスとオブジェクト

クラスは、オブジェクト指向型プログラミングにしか出てこない用語で、C言語等の手続き型言語には無い概念です。(厳密にはC言語にもクラスの原型となるような構造体や共用体というものは存在します)。オブジェクト指向型言語のC#を学ぶ上で、クラスとオブジェクトの概念と動作の仕組みの理解はとても重要です。

まずは大前提として、アプリが動作するためには、データと処理という2つの要素が必要だということを踏まえましょう。例えばECサイトのアプリが動作するためには、商品の情報(商品名、特徴、価格などのデータ)や会員情報(氏名、住所、TEL等のデータ)と、ある商品をカートに入れる、カートにある商品の決済をする、などの処理が必要になる、ということです。

ソースファイルに書かれたコードがコンパイルされて実行可能な形になり、それがメモリに読み込まれて実際の動作を行う、という点では、手続き型言語であるCもオブジェクト指向型言語のC#も変わりません。では何が違うのでしょうか。メモリの使い方が違うのです。下図をご覧ください。

新人エンジニア新人エンジニア

左側がC言語、右側がC#のメモリの状態を表しています。Cの方は、データの領域と処理(プログラム)の領域が完全に分かれており、それぞれが使うメモリの量も一定です。プログラムが都度データ領域に必要な情報を取りに行き、処理後にデータを更新しながら処理を進めていくという方式です。Cではデータを記述するファイルと、処理を記述するファイルは、基本的に分ける習慣があります。動作するものはここ、情報はこっち、というように完全に分けることで、各ファイルの記述を単純化し、少しでも読みやすくしているのですね。この方式は、シンプルで高速、使用メモリ量の把握も容易なのが特長です。

それに対し、C#では会員の情報と会員向けの処理が一つの風船に入っていますね。この風船がオブジェクトのモデルです。ロールプレイングゲームのように、アプリ全体の処理をいくつかに分けて役割分担し、その役を演じるのに必要なデータと処理を合体させて一つの物(オブジェクト)に持たせる、というのがオブジェクト指向型言語の大きな特徴です。会員のオブジェクトは、会員向けの処理とそれに必要なデータ、両方を自分の中に持っているわけです。

そして、このオブジェクトを必要に応じてメモリ上に複数構築し、不要になった物から捨てていく、という仕組みを言語自体が持っています。例えば会員が10人、商品が100個あれば、メモリ上に最大110個のオブジェクトが同時に存在する可能性があるのです。なので、C#ではアプリを動作させるのに必要なメモリの量は、ある程度の予測は可能なものの、具体的には動作させてみないとわかりません。何人が動作させるのか、どう動作させるのか、といった不確定要素によって、メモリの使用量が全く変わってくるからです。

このオブジェクトを生成する設計図となるのが、クラスです。C#は、クラスのソースファイルに書かれた記述に忠実に、メモリ上にオブジェクトを生成します。オブジェクト指向型言語には、データと処理を一体化してアプリの部品構成をわかりやすくし、且つ各部品の独立性を保ち、大規模で複雑なアプリケーションを設計、開発、保守しやすくする、という特長が有ります。

つまり、オブジェクト指向とは、アプリケーションを「クラス」の集合体とみなしましょう、という考え方のことなのです。

CとC#の違い、クラスとオブジェクトの概要は把握できたでしょうか。今はあまり難しく考えずに「C#の方が役割分担を決めやすそうだな」とか、「Cの方がシンプルだな」とか、そういう印象を持って頂ければ、と思います。

クラスとその使い方には重要な学ぶべきことがまだまだありますが、それは今後の講義でおいおい触れていきましょう。今はオブジェクト指向言語の仕組みと、クラスとオブジェクトの概要をしっかり把握できれば十分です。

6.本記事の方針

クラスには、自分たちで作るもののほか、.NET標準ライブラリとして、Microsoftやコミュニティがあらかじめ作ってくれているものがあります。また、サードパーティーのライブラリや自社で開発したライブラリなど、世の中には膨大なクラスが存在します。

プログラムでやりたいことがある場合、まず「既存のクラスやライブラリを活用できないか」を考えてください。なぜなら、自作クラスにはバグが入り込む可能性があるからです。多くの人が利用している実績あるクラスのほうが信頼度が高いケースも多いのです。

※なんでも自作にこだわることを「車輪の再発明」と言って戒めることがあります。

ここで、本記事の方針を説明します。

この記事では、

  1. 当社が受講者に課す最終課題をやり抜く上で必要となるクラスを中心に紹介します。
  2. プログラミング言語は国際語であるという点を踏まえて英語の意味から解説します。

ただし、C#のすべてを網羅しているわけではありませんのでご了承ください。

7.クラスのメンバ(フィールドとメソッド)

※以下は少し高度な論点です。詳しくはこの連載全体を通じてお伝えしますが、ここでも簡単に触れておきます。

すべてのソースコードはクラスに属する必要があります。クラスの識別のためにはクラス名が必要で、クラス名は自由につけられますが、慣習として先頭を大文字にします(PascalCase)。例:Example01

下図のとおり、クラスは主としてフィールド(field)とメソッド(method)を持つことができます。

新人エンジニア
フィールドとメソッドをあわせてメンバという
  1. フィールド: 「場」を表し、データやオブジェクトの置き場所のこと。
  2. メソッド: 「方法」を表し、処理や操作のこと。

たとえば、新入社員オブジェクトであれば誰でも「プログラミング経験年数」や「所有パソコン」といったフィールドを持ち、また「挨拶をする」「プログラムを書く」などのメソッドを持っていると考えられます。

C#のメソッドの基本書式は以下の通りです。

[修飾子] 戻り値の型 メソッド名(引数1の型 引数1, 引数2の型 引数2, …)
{
// メソッドの処理
}


{}ブロックの中に命令文を書きます。{}の対応漏れは初学者に多いミスです。気をつけましょう。

Main()メソッドは、C#で特別な意味を持つメソッドです。CLRがプログラム実行時に最初に探す「エントリーポイント」(開始位置)となります。必ずどこかのクラスに1つはMainメソッドが必要です。

Main(string[] args)という形で引数を持ちます。ここでargs仮引数です。実際の引数はコマンドラインから渡せますが、ほとんど使わない場合でもこの形が基本です。

public static void Main(string[] args)
{
    ...
}

  1. publicstaticvoidは修飾子や戻り値の型にあたります。
  2. publicはアクセス修飾子(公開範囲)で、外部からでも呼び出せることを示します。
  3. staticはインスタンスを生成しなくても呼び出せるメソッドであることを示します(静的メソッド)。
  4. voidは戻り値がないことを意味します。

Console.WriteLine(...)のようなメソッド呼び出しには、オブジェクト指向のエッセンスが詰まっています。私たちはメソッド名と引数リスト、そして戻り値の型さえ知っていれば、そのメソッドを呼び出せるのです。中身の仕組みを知らなくても利用できる、この抽象化(ブラックボックス化)こそがオブジェクト指向の特徴です。

8.エラーを恐れない

では、少し実験してみましょう。以下のコードを実行するとどうなるでしょうか?

public class Example02
{
    public static void Main(string[] args)
    {
        Main(new string[] { "Hello" });
    }
}

メインメソッドの中で自分自身のメインメソッドを呼び出しています。これを再帰処理といいます。呼ばれたメインメソッドの中でもさらに同じメインメソッドを呼び出すので、無限に呼び出しが続きます。今回は終了条件を設けていないため、結果的にエラーを起こして終了します。

実行すると以下のようなエラーが発生するでしょう。

Unhandled exception. System.StackOverflowException: Exception of type 'System.StackOverflowException' was thrown.
at Example02.Main(String[] args)
...


StackOverflowException ですね。メソッドの呼び出し履歴を保持するスタック領域があふれた(オーバーフロー)ということです。

しかし、PC本体が物理的に壊れるわけではありません。C#のプログラムが原因でパソコン自体が故障することは基本的にありません。安心してどんどんエラーを出してください。

エラーはできるだけ早く起こるほうがいいと思いませんか? 後になって深刻化するより、早期に異常を検知してくれるほうが被害が少なくて済みます。C#は早め早めにエラーを通知してくれる設計になっています。エラーは大歓迎すべき存在とも言えます。

9.プログラムはメモリ上にロードされて実行される

先ほどのスタックオーバーフローの例で分かってほしいのは、メソッドはメモリのスタック領域に呼び出し順に積み上げられるということです。

Main → Main → Main → Main → …(無限に呼び出し)

のようにスタックが埋まってしまい、あふれてエラーになります。

新人エンジニア
メモリのスタック領域のイメージ

繰り返しになりますが、ソースコードそのものが動いているのではありません。
ソースコードをコンパイルして得られた実行コードがメモリにロードされ、CPUによって実行されています。

  1. publicはアクセス修飾子。
  2. staticは静的メソッドの意味。
  3. voidは戻り値がないという意味。

CPUとメモリの関係

プログラミングにおいて、CPU(中央処理装置)とメモリ(主記憶装置)はそれぞれ異なる役割を果たします。簡単に言えば、CPUはプログラムの実行や計算を担当し、メモリはプログラムやデータの格納場所です。

CPUはコンピュータの「脳」とも言われる部分です。プログラムの実行や計算を担当します。CPUは命令を解釈し、データを処理し、必要な演算を実行します。プログラムが実行される際に、CPUはプログラムの命令をメモリから読み込み、実行します。CPUは高速な演算処理能力を持ち、プログラムの実行速度に影響を与えます。

一方、メモリはデータの一時的な格納場所です。プログラムやその実行中のデータがメモリに格納され、CPUが必要なデータを効率的にアクセスできるようにします。メモリは読み書きが高速であり、CPUがデータを必要とする際に迅速に提供します。CPUはメモリからデータを読み込んで処理を行います。メモリには十分な容量と高速なアクセス速度が求められます。

10.システムに必要なIPO

新人エンジニア
システムのIPO

「システム」とは仕組みのことです。システムには必ず、InputProcessOutput という流れ(IPO)が存在します。

人間も1つのシステムと見れば、目や耳などで入力し(Input)、脳で思考・判断し(Process)、口や手足でアウトプット(Output)していますよね。C#プログラムも同じです。システムをさらに分割するとサブシステムになり、さらに小さく分解するとメソッド単位になります。

中学校時代に学んだ文字式、たとえば

y = 2x + 1

のように、xの値が変わればyの値も変わる。これが「引数」と「戻り値」に相当すると考えるとイメージしやすいでしょう。

11.コメントの入れ方

コメントは「人間に向けたメッセージ」です。他人、そして将来の自分に向けてのメモとして非常に重要です。

/**
 * 画面表示
 * 作成者 yamazaki
 * 作成日 20XX/11/09
 */
public class Example03
{
    public static void Main(string[] args)
    {
        // Hello Worldと画面に表示する
        Console.WriteLine("Hello World");
    }
}

C#のコメントには主に2つの方法があります。

  1. /**/ で囲んで複数行をコメントにする。
  2. // を先頭につけて、その行をコメントにする。

さらに、///で始まるコメントはXMLドキュメントコメントという形式になり、ツールを使って自動的にドキュメントを生成できます。

public class Example04
{
    public static void Main(string[] args)
    {
        Console.WriteLine("Hello World");
        // Console.WriteLine("Goodbye World");
    }
}

上記のようにコメントアウトすると、その部分は実行されなくなります。IDEにはコメント用のショートカットがあるので活用しましょう。

なお、納品するプログラムにはコメントアウトしたコードを残さないようにするのが一般的です。本書では冗長を避けるためコメントは最小限にしていますが、ソースコード学習用に重要箇所へコメントを入れるのは大いにおすすめです。

12.エラーへの対処

コンパイルするときにエラーが表示されることがあります。

たとえば、文末のセミコロン;を忘れると

Example04.cs(4,40): error CS1002: ; が必要です

のようなエラーが表示されます。(実際のメッセージはIDEやコンパイラのバージョンによります)

このエラーメッセージをよく読まない人がいますが、エラーメッセージには非常に重要な情報が含まれています。

  • Example04.cs(4,40) … Example04.csの4行目・列40付近に問題があることを示す。

エラーが出たらまずはメッセージをじっくり読み、それでも原因が分からなければ検索してみましょう。

C#のエラーには主に以下の3種類があります。

  1. 文法エラー (Syntax error) … コンパイル時に発見される
  2. 実行時エラー (Runtime error) … コンパイルは通るが、実行中にエラーが発生してプログラムが異常終了する
  3. 論理エラー (Logic error) … 実行はできるが、結果が意図と違う

当社の新人エンジニア研修ではIDEを使用するため、1の文法エラーはIDE上で即座に指摘してくれます。ただし、全角スペースなどメッセージが分かりづらいエラーもあるので注意しましょう。
2の実行時エラーは「例外処理」で対応します。
3の論理エラーは「テスト」や「デバッガ」で原因を追及します。

タイミングを見計らってデバッガの使い方も講師から説明があります。

13.標準出力

「Hello World」の文字列が表示された画面を「コンソール」といいます。C#の開発環境(IDE)には「Outputウィンドウ」「Debugコンソール」などの名称で用意されていることもありますが、いずれも「標準出力」と呼ばれるしくみを利用しています。

  • 標準出力 … プログラムが標準的に利用する出力先。コンソールやIDEの出力ウィンドウなど。

C#で標準出力に出力したあと改行するには、

Console.WriteLine(出力内容);

と書きます。

改行を入れずに出力したい場合は、

Console.Write(出力内容);

です。

実行結果を目で確認できると、バグの修正(デバッグ)や動作確認がしやすくなります。目に見えない内部処理だけだと原因追及が難しいためです。

標準出力以外にも、ウェブページ(ASP.NETなど)に表示したりファイル出力したりする方法もあります。研修後半で扱う予定ですのでお楽しみに。


以上、C#の最初の一歩となる説明でした。

  1. 大文字と小文字は区別される
  2. {}は必ず1対1で対応させる
  3. { }で囲まれた範囲を「ブロック」と呼ぶ

といった基本ルールを守ることが重要です。また、コードの可読性を上げるため、インデント(字下げ)を適切に行いましょう。IDEのフォーマット機能を活用するのもおすすめです。

新入社員の方が呼び方に迷いそうな各種記号や、注意点などを章末にまとめていますので参考にしてください。

今後もオブジェクト指向の概念やクラス設計、デバッグやテストなど、さらに深い内容を研修で扱っていきます。C#をじっくり習得していきましょう。

<まとめ:隣の人に正しく説明できたらチェックを付けましょう>

□.NETのランタイムによって、C#は「一度(プログラムを)書けば、どこでも実行できる」という特徴を持つ

□オブジェクト指向とは、プログラムを現実のモノのようにデータと処理を一つに整理したものであり、クラスを組み合わせることでメンテナンスしやすいプログラムを作ることができる

□クラスはメンバを持つことができ、メンバにはフィールドとメソッドがある

□プログラムはメモリ上にロードされて実行される

□システムにはIPOが必要である

□エラーメッセージをよく読む、メッセージをまるごとGoogle検索する

以上、今回は「C#の特徴」について見てきました。後々にならないと意味の分からないところも多いと思います。研修をある程度進めてから改めて読むと良いと思います。

参考までにC#でよく使われる記号とその読み方および意味をまとめた表を掲載します。

記号読み方意味・用途
.ドットメンバーアクセス演算子(クラスやオブジェクトのプロパティやメソッドにアクセス)
;セミコロン文の終わりを示す
,カンマ引数や変数の区切り
:コロン継承やインターフェースの実装で使用
::ダブルコロンエイリアス指定(global::System など)
()かっこ、丸かっこメソッドの引数、キャスト、優先順位の指定
{}中かっこ、波かっこブロック(クラス、メソッド、if文などの範囲)
[]角かっこ配列、インデクサ、属性の指定
+プラス加算、文字列連結、インクリメント(++
-マイナス減算、デクリメント(--)、符号反転
*アスタリスク乗算、ポインタ型(unsafeコンテキスト)
/スラッシュ除算、コメントの開始(//, /* */
%パーセント剰余(あまり)演算子
=イコール代入演算子
==イコールイコール等価比較演算子
!=ノットイコール等しくないかの比較演算子
>大なり大なり比較演算子
<小なり小なり比較演算子
>=大なりイコール以上の比較演算子
<=小なりイコール以下の比較演算子
&&アンドアンド論理積(AND)
``
!ノット否定(NOT)演算子
&アンドビットAND、参照渡し(ref, out)でも使用
``パイプ
^キャレットビットXOR(排他的論理和)
~チルダビット反転
=>ラムダラムダ式
??ヌル合体演算子左がnullなら右を返す
?.null条件演算子nullでない場合のみメンバーアクセス
$ドル記号文字列補間(例: $"Hello {name}"
@アットマーク識別子のエスケープ、逐語的文字列
#シャーププリプロセッサディレクティブ(#define, #ifなど)

次回は、「2章. 変数でデータを再利用できるようになる」を学びます。

最後までお読みいただきありがとうございます。