首先来看一下.NET Framework的组成,如下图所示:
包括了3个方面的内容,
1. CLR(Common Language Runtime,公共语言运行库)。负责在运行时管理软件的执行。包括内存的管理,代码安全验证,代码执行,垃圾收集(GC)等内容,相当于Java中的JVM的角色。
2. 编程工具,包括了代码的开发,调试,编译等工作。包括Visual Studio开发环境,编译器,调试器等
3. BCL(Base Class Library,基类库),这个是.NET Framework使用的一个统一的大类库,和Java的类库的概念相似。
.NET语言的编译器接到源代码文件后,首先生成名字为"程序集(assembly)"的输出文件。它可以是可执行文件或者DLL。程序集中的代码并不是本机代码(这一点和Java源代码编译成.class文件比较像),而是一种成为CIL(Common Intermediate Language,公共中间语言)的中间语言。在运行的时候JIT编译器(Just-in-Time)会负责将CIL的一部分编译成本机代码,然后CLR就可以在运行时对它进行管理了。
直接在VS2008里创建一个C#工程,叫MyFirstCSharpProject。VS会自动的创建一个Program.cs,并已经写入了很多代码,包括一个Main()方法。
namespace MyFirstCSharpProject
{
class Program
{
static void Main( string [] args)
{
Console.WriteLine( " hello world from C# " );
}
}
}
首先,C#使用的是命名空间(namespace)的概念来防止命名冲突和对类进行归类,而Java用的是包(package)。另外,导入类的时候C#和Java分别用的是"using"和"import"关键字。
其次,是命名规约,C#对于类名和成员名都推荐使用Pascal大小写,本地变量推荐的是Camel大小写,而Java推荐的都是Camel大小写。
3. 类型声明
C#的类型声明不需要Java那么严格的条件,比如一个文件只能声明一个类(内部类除外),文件名要和类名相同等等,C#的类名和文件名不需要有什么联系,另外同一个文件中可以放入多个类的声明。
在可以声明的类型上,Java只有类(Class),接口(Interface),枚举(Enum)。而C#在Java的基础上还可以声明结构(Struct),委托(Delegate)类型。
4. 预定义类型
(1) 简单类型
与Java不同,C#的简单类型更多,一般都有无符号和有符号两种版本,包括sbyte、byte、short、ushort、int、uint、long、ulong、float、double、bool、char、decimal,一共13种。而Java都只是提供了有符号的版本。
(2) string和object
C#的string和Java的String类似,都用于存储一个字符串。而object和Java的Object一样,是所有类的基类。不过C#有一点与Java不同,前面提到的简单类型也是object的子类,而Java的简单类型则不是,甚至都不是类,他们的包装类(如Integer,Long等)才是Object的子类。
5. 变量声明
变量声明上C#和Java相差无几,除了C#中的"var"关键字。这是一种语法上的速记,并不是像JavaScript上的"var"关键字,C#还是一种强类型的语言的。
var aDate = new DateTime();
1. 类的访问修饰符--C#中没有包的概念,只有namespace和程序集。限定符是跟程序集相关的(也有道理--java相当于限定到了文件夹级别,有点细了,一个程序集的程序都是自己开发的,没必要过多限制,而出了程序集之外,就看你要给人家开放什么接口了)
在C#中,类的访问修饰符有internal和public两种,这里首先要说一下程序集的概念才能继续对访问修饰符的解释。
就我的理解,.NET中程序集的概念类似于Java中的jar包,也是有特定功能程序的集合,不过通常是以扩展名为dll的格式。与jar包相同,我们写的程序中也可以引用微软的或者第三方的程序集来扩展程序的功能。
好了,言归正传,回到类的访问修饰符上。internal代表类只能在程序集内部被其他类访问,这个也是类的默认访问级别。而public代表类可以被其他任意的类访问。
从这里,可以看出C#和Java的一些不同,C#用程序集来作为internal和public的分界线,而Java则用的包(package)
3. 本地常量
C#中,有一个const关键字,放在类型名的前面,比如:const int i = 10; 和Java的final变量有些相似
4 参数
引用参数,在方法的参数前加上"ref"关键字那么这个参数就变成引用参数了。
使用引用参数后,不会在栈中为形参分配内存了,而是让形参和实参引用相同的内存位置。
class Program
{
static void TestMethod(ref int variable)
{
variable += 5;
}
static void Main(string[] args)
{
int i = 0;
TestMethod(ref i);
Console.WriteLine(i);
}
}
(2) 输出参数
在方法的参数前加上"out"关键字就能使这个参数变成输出参数。
输出参数的作用和oracle的PL/SQL存储过程中的out参数的作用比较相似。顾名思义,是用作输出的参数,可以扩展返回值的个数。
namespace ConsoleApplication
{
class TestClass
{
public int Property = 0;
}
class Program
{
static void TestMethod(out int out1, out TestClass out2)
{
out1 = 5;
out2 = new TestClass();
out2.Property = 10;
}
static void Main(string[] args)
{
int i;
TestClass c;
TestMethod(out i, out c);
Console.WriteLine(i + ", " +c.Property);
}
}
}