ソース ファイルの名前付け規則 (C# と Java の比較)
更新 : 2007 年 11 月
C# のクラスを含むファイルの名前付け規則は、Java とわずかに異なります。Java では、すべてのソース ファイルに .java 拡張子が付きます。各ソース ファイルは、トップレベルのパブリック クラス宣言を 1 つ含み、クラス名とファイル名を一致させる必要があります。言い換えると、たとえば、パブリック スコープで宣言された Customer というクラスは、Customer.java という名前のソース ファイルで定義する必要があります。
C# の場合、ソース コードは .cs 拡張子で示されます。Java と違って、ソース ファイルには、トップレベルのパブリック クラス宣言を複数含めることができ、ファイル名とクラス名を一致させる必要がありません。
トップレベルの宣言
Java でも C# でも、ソース コードは、一定の順序で並べられたいくつかのトップレベルの宣言で始まります。Java と C# のプログラムで行われる宣言には、ごくわずかな違いしかありません。
Java でのトップレベルの宣言
Java では、package キーワードを使ってクラスをグループ化できます。パッケージ化されたクラスは、ソース ファイルの最初の実行可能な行で package キーワードを使用する必要があります。この行の後に、他のパッケージのクラスへのアクセスに必要な import ステートメントとクラス宣言が次のように続きます。
package Acme;
import java.io.*;
class Customer
{
...
}
C# でのトップレベルの宣言
C# では、名前空間という概念を使用して、論理的に関連するクラスを namespace キーワードでグループ化します。これらのクラスは、Java のパッケージと同じように機能し、同じ名前のクラスが 2 つの別々の名前空間に表示されることがあります。現在の名前空間の外部の名前空間で定義されたクラスにアクセスするには、using ディレクティブと名前空間の名前を次のように使用します。
using System.IO;
namespace Acme
{
class Customer
{
// ...
}
}
using ディレクティブは、名前空間の宣言の中に配置できますが、その場合、インポートされる名前空間は、それを格納する名前空間の一部になります。
Java では、同じ 1 つのソース ファイルで複数のパッケージを使用できませんが、C# では、次のように 1 つの .cs ファイルで複数の名前空間を使用できます。
namespace AcmeAccounting
{
public class GetDetails
{
// ...
}
}
namespace AcmeFinance
{
public class ShowDetails
{
// ...
}
}
完全修飾名と名前空間のエイリアス
Java の場合と同様に、DataSet や前の例の AcmeAccounting.GetDetails などのクラスの完全修飾名を指定すると、名前空間の using 参照を使わずに .NET Framework 内のクラスにも、ユーザー定義の名前空間のクラスにもアクセスできます。
完全修飾名は非常に長くなることがありますが、そのような場合は、using キーワードを使用して短い名前 (エイリアス) を指定すると、コードを読みやすくできます。
次のコードでは、架空の企業で記述されたコードを参照するエイリアスを作成しています。
using DataTier = Acme.SQLCode.Client;
class OutputSales
{
static void Main()
{
int sales = DataTier.GetSales("January");
System.Console.WriteLine("January's Sales: {0}", sales);
}
}
WriteLine の構文で、書式文字列内の {x} の x は、その位置に挿入される値の、引数リスト内での位置を示します。たとえば、GetSales メソッドが 500 を返したとすると、このアプリケーションの出力は次のようになります。
January's Sales: 500
プリプロセッサ ディレクティブ
C や C++ と同様に C# にも、ソース ファイルの特定部分を条件付きで省略したり、エラー状態や警告状態を通知したり、ソース コードの異なる領域を線引きしたりするプリプロセッサ ディレクティブがあります。C# には、別個のプリプロセス手順が存在しないため、C 言語や C++ 言語に合わせて "プリプロセッサ ディレクティブ" という用語を使用しています。詳細については、「C# プリプロセッサ ディレクティブ」を参照してください。