源文件约定(C# 与 Java)
更新:2007 年 11 月
包含 C# 类的文件的命名约定与 Java 文件的命名约定有所不同。在 Java 中,所有源文件的扩展名均为 .java。每个源文件均包含一个顶级公共类声明,并且该类的名称必须与文件名匹配。换句话说,使用公共范围声明的类 Customer 必须在名为 Customer.java 的源文件中定义。
C# 源代码用 .cs 扩展名表示。与 Java 不同,C# 源文件可以包含多个顶级公共类声明,并且文件名不必与任何类名称匹配。
顶级声明
在 Java 和 C# 中,源代码的开头为几个按一定顺序排列的顶级声明。Java 和 C# 程序中的声明仅有少许不同。
Java 中的顶级声明
在 Java 中,可以使用 package 关键字将类组合在一起。组合后的打包类必须在源文件第一行可执行代码中使用 package 关键字。如下所示,之后是访问其他包中的类所需的任何导入语句,然后是类声明:
package Acme;
import java.io.*;
class Customer
{
...
}
C# 中的顶级声明
C# 使用命名空间的概念,通过 namespace 关键字将相关类按逻辑方式组合在一起。这些组合类的作用与 Java 包的作用相似,并且同一个类可以出现在两个不同的命名空间内。若要访问在当前命名空间之外的某个命名空间中定义的类,请使用 using 指令,并在该指令后面加上命名空间名称,如下所示:
using System.IO;
namespace Acme
{
class Customer
{
// ...
}
}
注意,可以在命名空间声明内放入 using 指令,在这种情况下,这些导入的命名空间将成为包含命名空间的一部分。
Java 不允许在同一个源文件中出现多个包。而 C# 允许在一个 .cs 文件中出现多个命名空间,如下所示:
namespace AcmeAccounting
{
public class GetDetails
{
// ...
}
}
namespace AcmeFinance
{
public class ShowDetails
{
// ...
}
}
完全限定名称和命名空间别名
与 Java 一样,不对命名空间使用 using 引用仍可以访问 .NET Framework 命名空间或用户定义的命名空间中的类,方法是提供类的完全限定名称,例如,上例中的 DataSet 或 AcmeAccounting.GetDetails。
但完全限定名称可能因名称太长而难以处理,在这种情况下,可以使用 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# 预处理器指令。