大まかに言うと、C、C++、C#といった言語を見比べると、次のような特徴が見えてきます。
- Cプログラムは関数とデータ型の集合体である
- C++プログラムは関数とクラスの集合体である
- 一方C#プログラムの本質は、型宣言の集まりだという点です
C#の実行ファイル(EXE)またはダイナミックリンクライブラリ(DLL)のソースコードは、1つ以上の型宣言で構成されています。
DLLにはMainというプログラム入口が存在しません。対して実行ファイル(EXE)のコードには最低1つクラスを定義し、その中にMainという名前のメソッド(プログラムの起点)を記述する必要があります。
大規模なソフトウェアのソースコードには何千もの型(クラスなど)が含まれることがあります。大きなプロジェクトは複数のエンジニアが分担して開発するため、同名の型が衝突するのは避けにくいです。この名前衝突を回避する仕組みが、先ほど紹介した「名前空間」になります。
名前空間(namespace)は関連する複数の型宣言をグループ分けし、一まとまりの型に共通の名称を割り当てるための機構です。プログラム自体が関連する型宣言の集合なので、開発者は基本的に独自の名前空間を作成し、すべての型をその内部に定義します。
簡単に説明すると、名前空間とは複数のクラスにグループ名を付ける仕組みのこと。他の箇所からこれらのクラスを参照する際には、このグループ名を先頭に付記する必要があります。
クラスに同じ姓名の生徒が二人いる状況を想像してみてください。先生やクラスメイトは名前だけで区別できないため、「AグループのTOM」「BグループのTOM」のようにグループ名を付けて識別します。このA・Bというグループ標記が名前空間に相当します。
下記コードは3つの型宣言を含むプログラム例で、すべての型がMyProgramという名前空間内に定義されています。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HelloDemo // 名前空間を宣言
{
class A // 型A(クラス)を宣言
{
void Fun1() //メソッド
{
// 処理ロジック
}
}
class B // 型B(クラス)を宣言
{
void Fun1() //メソッド
{
// 処理ロジック
}
}
class C // 型C(クラス)を宣言
{
static void Main(string[] args) //Main プログラム入口
{
double pi = 3.14;
string webSite = "foxdevelop.com";
Console.WriteLine($"The Pi is {pi} and the website is {webSite}.");
}
}
}
Code language: PHP (php)
名前空間については後の講義で詳しく解説します。
型はテンプレートである
C#プログラムの本質が型宣言の集まりである以上、C#を習得する核心は「型の作成・利用方法」を学ぶことになります。まず理解しなければならないのは、
型(Type)とは何か
型はデータ構造を作成するための雛形と捉えられます。型そのものは実体のデータ構造ではなく、この雛形から生成したオブジェクトが持つ特徴を定義するものです。
型は単なる「設計図」なので自身でメモリを消費しません。インスタンス化したタイミングで初めてメモリが割り当てられ、データが保存されます。
型は実体オブジェクトを作成するための設計図にあたります。家の設計図から複数の家を建てられるように、1つの型から複数の実体を作成可能です。
1つの型は以下3要素から定義されます。
- 名称
- メンバーデータを格納する構造
- 振る舞いと制約
C#においてすべてが型であり、標準組み込み型も例外ではありません。
代表的な組み込み型としてshortとintが挙げられます。
その構造は次の通りです。
| short型 | int型 |
|---|---|
| 名称:short | 名称:int |
| 構造:2バイトを占有 | 構造:4バイトを占有 |
| 振る舞い:16ビット整数 | 振る舞い:32ビット整数 |
- 名称:型を識別する名前(
int、string、自作クラス名など) - 格納構造:消費するメモリサイズ・フィールドレイアウトを定義(例:
shortは固定で2バイト) - 振る舞い制約:対応する演算、値域、標準メソッドを規定(例:
intは四則演算に対応、値域は-2^31 ~ 2^31-1)
インスタンス化(Instantiate)
型の雛形にnewキーワードを用い、実際に利用可能なデータオブジェクトを生成する処理
オブジェクト(object) = インスタンス(instance)
先ほどのint・shortを例に、これらの型からインスタンスを作成できます。下記サンプルのpi、age、numsはそれぞれdouble、int、shortの型から生成されたインスタンスです。
namespace HelloDemo
{
class Program
{
static void Main(string[] args)
{
double pi = 3.14;
int age = 12;
short nums = 23;
}
}
}Code language: JavaScript (javascript)
C#のプログラム内に存在するすべての変数・データは、例外なく何らかの型のインスタンスです。型を持たないデータは存在しません。
上記のサンプルコードを参照してください
サンプル内のclass Cはプログラム入口クラスで、実行ファイルの条件を満たしています。
MyProgram名前空間配下に定義された自作型である- 内部に戻り値なしの静的
Mainメソッドを持ち、アプリ起動の起点となる
C#にはclass以外の型も存在する
C#で宣言可能な全ての型:クラス(class)、構造体(struct)、インターフェース(interface)、列挙型(enum)、デリゲート(delegate)、レコード(record)
BCL(Base Class Library):.NET標準組み込みクラスライブラリ。int、short、string、List<T>といったシステム定義型が用意されており、開発者は直接インスタンス化して使用できます。
型宣言