基礎・文法 -基礎-

ホームC#プログラミング応用講義 > 基礎

目次

ファイル名

C# において「ファイル」というデータの集合はなんら重要ではありません。ファイルに関しては特に何も考えずにコーディングすることができます。

たとえば、Java においては「クラス名とファイル名の一致」など、ファイルという単位が非常に重要な役割を果たすものもあります。
しかし、C# においてファイル名が具体的に利用されるのはコンパイル作業におけるリンクの際だけです。

>csc naoko.cs jirou.cs kenzou.cs
リンクという作業はファイル同士をつなげる役目ですが、C# コンパイラはファイル名を半角スペースを空けて羅列することでリンカの役割を果たします。

ただし、何でも自分の好きなファイル名を指定していいというわけではありません。慣用的にファイル名はそのファイルに書いてあるクラス名にするのが有名です。
また、1つのファイルに複数のクラスを記述するのではなく、1つのファイルに1つのクラスと いうのが常識です。

このような慣用的な決まりを守ることでよりスマートにプロジェクトを管理できるため、特に他人と共同で作業する場合などはこれに従うべきです。

名前空間

ファイル名の代わりに重要な役割を果たすのが「名前空間」です。これは .NET Framework の API をできるだけ混乱することなく利用できる有効な手段です。
using namespace;
このステートメントが必ずといっていいほど C# ファイルの中にはあります(もちろん namespace には該当する名前空間(System など)が入ります)。これが名前空間の宣言ですが、名前空間は既存の .NET APIを利用するためだけにあるわけではありません。自分で作るプロジェクトにも固有の名前空間を指定するのが一般的です。
namespace TRICK
{
// class...
}
自分で宣言するクラスを含む形で名前空間を指定します。その際には namespace を使って宣言します。ここでは TRICKという名前空間を宣言し、その中にクラスを記述するようになっています。

名前空間を上のように単純に使用するのでは意味がありません。名前空間をネストすることで「名前の衝突」を防ぐのが名前空間の最も有効的な利用方法です。
namespace TRICK
{
namespace Naoko
{
// class...
}
namespace Jirou
{
// class...
}
}
こうすることで、TRICK 名前空間の中に Naoko 名前空間を宣言することで、Jirou 名前空間との名前の衝突を防ぐことができます。
実際このように違う名前空間を同じファイルに記述することはありません。通常は「.(ドット演算子)」を用いて以下のように利用します。
namespace TRICK.Naoko
{
// class..
}
この名前空間を別の名前空間から利用するのは
using TRICK.Naoko
とします。

名前空間は名前の衝突を防ぐために積極的に利用すべきですし、うまく利用することでプロジェクト全体をきれいにまとめることができます。しかし、ばらばらに利用するのは逆効果です。名前空間はクラスをまとめてわかりやすくするものですから、まったく違う働きをクラスを同じ名前空間に指定するのは混乱のもとです。
似た働きをするクラスをまとめると非常に便利です。

たとえば、System.Windows.Forms 名前空間には
Button
TextBox
など、働きはまったく別ですが Windows アプリケーションにおける汎用的なコントロールという点で共通しています。

名前空間は namespace をカタカナにして「ネームスペース」とも言われますが、どちらも同じことです。

変数

ここでは変数といっても、値型参照型について説明します。
int a;
a = 100;
このプログラムではint 型の変数 a に 100 を代入しています。
値型
値型の変数では、100というデータが直接 a に入ります。よって、a にアクセスすると、100が呼び出されることになります。
Console.WriteLine(a);
このプログラムは100を表示します。値型は比較的簡単に理解できます。


TRICK oj;
oj = new TRICK();
このプログラムは TRICK 型の変数 oj に TRICK オブジェクトへの参照を 代入しています。
参照型
参照型の変数は変数の中にオブジェクトが入るのではなく、オブジェクトへの住所が入ります。
using System;

class TRICK
{
public string str;
}

class Sample
{
public static void Main(string[] args)
{
TRICK oj;
oj = new TRICK();

oj.str = "仲間由紀恵";
Console.WriteLine(oj.str);

TRICK oj2;
oj2 = oj;

Console.WriteLine(oj2.str);

TRICK oj3;
oj3 = new TRICK();

oj3.str = "阿部寛";
Console.WriteLine(oj3.str);
}
}
このプログラムでは3回 WriteLine() があります。それぞれ何が表示されるのか考えてください。

oj には新たに生成された TRICK オブジェクトへの住所が入ります。
しかし、oj2 には oj を使うときに生成したオブジェクトへの住所が入りますから、結果的に oj と同じオブジェクトを参照していることになります。
oj3 には新しくオブジェクトを生成し、その住所を入れていますので oj や oj2 が参照するオブジェクトとは別のオブジェクトを参照しています。

このプログラムにおいては TRICK オブジェクトが2つ生成され、一方のオブジェクトへの住所を入れた変数 oj と oj2 があり、もう一方のオブジェクトへの住所を入れた変数 oj3 が利用されています。

参照型を値型と同じように考えてしまうとさまざまなところでミスが起こります。なぜなら C# で利用されるすべてのオブジェクトは参照型であり、string も参照型であるからです。値型は int や long などのデータを入れるものだけです。よって、このプログラムの中では値型は使われていません。

ちなみにここで言っている「住所」という言葉はわかりやすく捉えた場合の説明用語であり、実際は「参照」という言葉を利用することで説明できます。

わかりやすさ

コーディングという作業において「わかりやすさ」ほど重要なことはありません。わかりやすさを追求し てこれまで言語 は進化してきたともいえます。

その中のわかりやすい項目が「ホワイトスペース」と「コメント」です。ホワイトスペースに関してはネストされている状態を把握することで簡単に記述できま す。上のプログラムでも実際にクラスとメソッドの間で、「クラス > メソッド」という関係が働いているためメソッドの部分はタブがあります。メソッドの内容も同じようにタブがあります。

タブを利用するかスペースを利用するかはプログラマによって違いますが、ほとんどすべての場合でタブが利用されます。(ただし、私のホームページにおいて は、整形済みテキスト内でタブを使用することが推奨されないため、半角スペース4つに置換しています。)

また、中括弧 {  } のつけ方ですが、下の2つはどちらも見たことがあります。
public static void Main(){

}
// --------------------------
public static void Main()
{

}
上のパターンは SDK 利用者に見られる中括弧のつけ方です。下は VisualStudio.NET でのつけ方です。決まってはいませんが、VisualStudio.NET でのコーディングを考えてこの講義では下を利用しています。ただし結局はどちらでもいいので、お好きなほうを使ってください。

さて、コメントに関してですがコメントを省いてしまう傾向が初心者に多く見られます。簡単でコメントをつけるまでもないというのが意見かも しれませんが、 コメントをつけることは単なる目印ではありません。プログラムがどのように進められるか、その順序を確認していくことにもつながります。

たとえば、始まりの中括弧はどのものかわかりやすいのですが、終わりの中括弧は続けて登場することもありません。
            :
:
:
} // (1)
} // (2)
} // (3)
(1) (2) (3) それぞれの中括弧がどの始まりの中括弧になるのか、「:」の部分が長く複雑になればわかりにくくなります。
よって、どの中括弧かを横に // for ... Method などのように少しでも記しておくとどのような関係になっているのかわかります。

また、button1 などのように VisualStudio.NET のデフォルト値をそのまま利用するとただの Click イベントでさえどのボタンのものかわからなくなってしまいます。
// "参照" ボタンクリック
private void button1_Click(object sender, System.EventArgs e)
{
:
このように簡単にメモしておくことでどのボタンのものかわかるようになります。

他人と共同作業する際はファイル名でも述べたような「わかりやすさ」を重視したコーディングを行うことはとても重要になります。

[ ステップアップC# ] [ C#プログラミング応用講義 ]