📄 c#.txt
字号:
C#的特点2007-04-08 18:07微软c#语言定义主要是从C和C++继承而来的,而且语言中的许多元素也反映了这一点.C#在设计者从C++继承的可选选项方面比Java要广泛一些(比如说structs),它还增加了自己新的特点(比方说源代码版本定义).但它还太不成熟,不可能挤垮Java.C#还需要进化成一种开发者能够接受和采用的语言.而微软当前为它的这种新语言大造声势也是值得注意的.目前大家的反应是:"这是对Java的反击."
C#更象Java一些,虽然微软在这个问题上保持沉默.这也是意料中的事情,我觉得,因为Java近来很成功而使用Java的公司都报告说它们在生产效率上比C++获得了提高.
Java所带来的巨大影响和大家对它的广泛接受已经由工作于这种语言和平台之上的程序员数量明显的说明了(估计世界范围内共有两百五十万程序员使用Java).由这种语言写成的应用程序的数量是令人惊讶的并已经渗透了每一个级别的计算,包括无线计算和移动电话(比如日本发明的Java电话).C#能够在用户领域获得这样的礼遇吗?我们必须等待并观望,就象已经由SSI公司的CEO和主席Kalpathi S. Suresh指出来的那样,"我发现所有这些都是渐进的.如果C#不存在,我们总能回到Java或C和C++.这些都不完全是新技术;它们在更大的意义上来说只是大公司制造的市场噱头.我们必须给他们时间安顿下来看看这些是不是真的对IT工业有什么影响."
C#从Java继承而来的特点
类:在C#中类的申明与Java很相似.这是合理的因为经验告诉我们Java模型工作得很好.Java的关键字import已经被替换成using,它起到了同样的作用.一个类开始执行的起点是静态方法Main().下面的Hello World程序展示了基本的形式:
using System;
class Hello {
static void Main() {
Console.WriteLine("Hello, world");
}
}
在这个例子中,System这个名字指向一个包括了基本C#实用类集合的命名空间(namespace).这个命名空间包括了Console类,它在这个例子中被用来输出一个字符串.类可以是抽象的和不可继承的:一个被申明成abstract的类不能被实例化;它只能被用做一个基类.C#关键字lock就象Java关键字final,它申明一个类不是抽象的,但是它也不能被用做另一个类的基类.界面:就象在Java中一样,一个界面是一组方法集合的抽象定义.当一个类或结构体实现一个界面的时候,它必须实现这个界面中定义的所有方法.一个单一的类可以实现几个界面.也许以后会出现一些微妙的差别,但是这个特点看起来与Java相比没有变化.布尔运算:条件表达式的结果是布尔数据类型,布尔数据类型是这种语言中独立的一种数据类型.从布尔类型到其他类型没有直接的转换过程.布尔常量true和false是C#中的关键字.错误处理:如Java中那样,通过抛出和捕捉异常对象来管理错误处理过程.内存管理:由底层.NET框架进行自动内存垃圾回收.
C#从C和C++继承的特点
编译:程序直接编译成标准的二进制可执行形式.如果前面的Hello World程序被保存成一个文本文件并被命名为Hello.cs,它将被编译成命名Hello.exe的可执行程序.
结构体:一个C#的结构体与C++的结构体是相似的,因为它能够包含数据申明和方法.但是,不象C++,C#结构体与类是不同的而且不支持继承.但是,与Java相同的是,一个结构体可以实现界面.
预编译:C#中存在预编译指令支持条件编译,警告,错误报告和编译行控制.可用的预编译指令有:
#define
#undef
#if
#elif
#else
#endif
#warning
#error
#line []
没有了#include 伪指令.你无法再用#define 语句对符号赋值,所以就不存在源代码替换的概念--这些符号只能用在#if和#elif伪指令里.在#line伪指令里的数字(和可选的名字)能够修改行号还有#warning和#error输出结果的文件名.
操作符重载:一些操作符能够被重载,而另一些则不能.特别的是,没有一个赋值运算符能够被重载.能够被被重载的单目操作符是:
+ - ! ~ ++ -- true false
能够被重载的二元运算符是:
+ - * / % & | ^ << >> == != > < >= <=
C#独有的特点
C#最引人入胜的地方是它和Java的不同,而不是相似的地方.这一节(和这个系列第二部分的大部分地方)讲述了C#实现的和Java不同的地方或者Java根本没有的特点.
中间代码:微软在用户选择何时MSIL应该编译成机器码的时候是留了很大的余地.微软公司很小心的声称MSIL不是解释性的,而是被编译成了机器码.它也明白许多--如果不是大多数的话--程序员认为Java程序要不可避免的比C编写的任何东西都要慢.而这种实现方式决定了基于MSIL的程序(指的是用C#,Visual Basic,"Managed C++"--C++的一个符合CLS的版本--等语言编写的程序)将在性能上超过"解释性的"Java代码.当然,这一点还需要得到事实证明,因为C#和其他生成MSIL的编译器还没有发布.但是Java JIT编译器的普遍存在使得Java和C#在性能上相对相同.象"C#是编译语言而Java是解释性的,"之类的声明只是商业技巧.Java的中间代码和MSIL都是中间的汇编形式的语言,它们在运行时或其它的时候被编译成机器代码.
命名空间中的申明:当你创建一个程序的时候,你在一个命名空间里创建了一个或多个类.同在这个命名空间里(在类的外面)你还有可能声明界面,枚举类型和结构体.必须使用using关键字来引用其他命名空间的内容.
基本的数据类型:C#拥有比C,C++或者Java更广泛的数据类型.这些类型是bool, byte, ubyte, short, ushort, int, uint, long, ulong, float, double,和decimal.象Java一样,所有这些类型都有一个固定的大小.又象C和C++一样,每个数据类型都有有符号和无符号两种类型.与Java相同的是,一个字符变量包含的是一个16位的Unicode字符.C#新的数据类型是decimal数据类型,对于货币数据,它能存放28位10进制数字.
两个基本类:一个名叫object的类是所有其他类的基类.而一个名叫string的类也象object一样是这个语言的一部分.作为语言的一部分存在意味着编译器有可能使用它--无论何时你在程序中写入一句带引号的字符串,编译器会创建一个string对象来保存它.
参数传递:方法可以被声明接受可变数目的参数.缺省的参数传递方法是对基本数据类型进行值传递.ref关键字可以用来强迫一个变量通过引用传递,这使得一个变量可以接受一个返回值.out关键字也能声明引用传递过程,与ref不同的地方是,它指明这个参数并不需要初始值.
与COM的集成:C#对Windows程序最大的卖点可能就是它与COM的无缝集成了,COM就是微软的Win32组件技术.实际上,最终有可能在任何.NET语言里编写COM客户和服务器端.C#编写的类可以子类化一个以存在的COM组件;生成的类也能被作为一个COM组件使用,然后又能使用,比方说,JScript语言子类化它从而得到第三个COM组件.这种现象的结果是导致了一个运行环境的产生,在这个环境里的组件是网络服务,可用用任何.NET语言子类化.
索引下标:一个索引与属性除了不使用属性名来引用类成员而是用一个方括号中的数字来匿名引用(就象用数组下标一样)以外是相似的.
public class ListBox: Control {
private string[] items;
public string this[int index] {
get {
return items[index];
}
set {
items[index] = value;
Repaint();
}
}
}
可以用一个循环器来匿名引用字符串内部数组成员,就象下面这样:
ListBox listBox = ...;
listBox[0] = "hello";
Console.WriteLine(listBox[0]);
代理和反馈:一个代理对象包括了访问一个特定对象的特定方法所需的信息.只要把它当成一个聪明的方法指针就行了.代理对象可以被移动到另一个地方,然后可以通过访问它来对已存在的方法进行类型安全的调用.一个反馈方法是代理的特例.event关键字用在将在事件发生的时候被当成代理调用的方法声明中.
结论
C#和C++之间的相似之处对任何已经对C和C++进行了培训投资的公司来说是很大的好处.熟悉C++的程序员将很容易的学会C#.而且,花了时间学习Java的Windows程序员(通常以Visual J++的形式出现)将比C++程序员更快的学会C#.在编程界的普遍认为是"如果你学会了Java,而且懂得C++,那么你已经懂得了C#的90%."
我希望本文给了你C#与Java和C++之间的联系的大概印象.总的说来,我相信C#提供了更大的程序表现力而且比Java更适合编写性能关键的程序,而同时拥有Java的优美和简洁,这都使得它比C++更诱人.
C#和Java的对比
作者:
2001-09-18 16:31:05
被过滤广告
自从互联网出现以来,Java就成了许多开发者的首选.而许多C++开发者在较短的时间内转移到了Java开发者的队伍中来. Java成功的开发和实现了许多高质量的多线程动画, 游戏, 以及分布的应用程序. 更重要的是,Java 语言是完全平台无关的.
被称作Apllets(小应用程序)的Java程序在被下载到本地以前必须首先通过安全认证,这样就避免了任何病毒钻入用户的计算机的企图. 许多新的改进,诸如旋摆软件包(swing package), Java2D API, 连网软件包(java .net)在最初的Java开发包发布以后被加进了这种语言里. 从Sun公司发布Java以来,它的许多竞争对手开发了这种热门语言的替代品,一些公司甚至在两年以前就开始了.
现在一家无需更多介绍的公司--微软已经发布了一种新的叫做微软.NET的技术. .NET家族的一种主要的语言是C#或者说C-sharp. 这种语言是从Java/C++继承而来的. 从我的对C#的六个月的技术上的经验来说,我觉得C#或多或少与Java是相似的.但是C++的许多功能,比方说操作符重载(它在Java中已经被移去了)还存在于C#中.
Java程序能够在安装了Java虚拟机或者JVM的任何平台上运行.但是.NET程序的平台要求安装了通用语言运行库或者称做CLR. 它是所有.NET语言运行所需的运行库.所以一种.NET语言能够调用另一种.NET语言写成的模块和函数. 更进一步的说,如果你学习了种像C#之类的语言,那么你就很容易学习另一种.NET语言因为所有的.NET语言遵循微软所谓的.NET Framework(架构). 这种架构包括了编写和安装健壮的.NET应用程序所必需的类库.使用.NET你可以通过ASP.NET进行服务器端的编程,这点非常像JAVA中的servlets.
就象Java中的Applets, C#引入了WinForms 和WebForms的概念.使用WinForms你可以设计基于Windows的应用程序而使用WebForms你能够开发Web应用程序. 这点可以要么通过C#编程或者是使用Visual Studio.NET这样的开发环境工具来实现. 它包含了Visual C#,使用Visual C#你可以非常容易的编写C#应用程序.
在我们使用Visual C++编程的时候,WinForms几乎就是win32程序.用C++来开发这些程序是可能的.但是VC++给我们提供向导来简化我们的开发过程.现在Visual C#也在做同样的工作.因此如果你已经是一个VC++的程序员了,那么你最好试一试VC#.
Java程序和C#程序的比较
我们应该比较一下用Java写成的程序和C#的有什么不同. 我们将讨论两个程序间主要的不同点.
Hello Java 程序
class Hello { // 类声明
public static void main(String args[]) { // main 方法,入口点
System.out.println("Hello Java"); // 向控制台输出Hello Java
}
}
Hello C# 程序
using System; // 调用System命名空间
class Hello { // 类声明
public static void Main () { // main 方法, 入口点
console.writeLine("Hello C#"); // 向控制台输出 Hello C#
}
}
在Java中, lang软件包是自动引入的.在简单的程序里没有必要引入这个包.但是在C#中,我们不得不在所有的程序里调用System命名空间. 请记住控制台是System命名空间下的一个类. 试着运行一下上面的程序并查看它们的输出结果.
Main方法
Java:你有可能编写一个没有main方法的Java程序,只要这个类是用来作为父类.但是只有类中包含有正确的Main方法的时候程序才能运行.
C#:没有正确的Main方法就不可能编译C#源程序.如果main方法缺失了,那么编译器就会显示一个错误消息:程序'filename.exe'没有定义入口点.
继承
Java 和C#都不支持多重继承而且都提供接口的概念作为多重继承的替代品.但是C#在接口中包括了更高级的内容.请在本文末找出题为新增加的特点的内容.
操作符和控制流语句
Java中出现的所有诸如算术,逻辑,自增和自减等操作符都可以在C#中找到. 而Java中的像if, else, if-else, for, do-while, while等控制流语句C#统统支持. 但是C# 增加了C++中流行的goto语句.
异常处理
在C#中你可以重用try, catch, finally, throws 语句处理运行时错误(通常也叫做异常).C# 中的异常处理过程除了一些小的不同以外几乎与Java完全相同. C#中System.Exception命名空间是所有异常类的基类.
多线程
C#中多线程的应用比起Java来要容易得多.我们可以使用Monitor 和 Mutex类同步线程.
新增特点
索引,属性和代理是C#中的新概念.索引几乎与Java中的向量相同. 对其新特点的完全的讨论已经超出了我们的范围.但是我将尽量在这个网站的其它地方解释它们. C#引入了Java所没有的操作符重载的概念.但是Java和C#都支持方法重载.
让我们回到对接口的讨论,我们能够验证包括在接口中的方法是否是使用is 和 as 操作符实现的.当我们实现接口的时候能避免命名冲突.你甚至可以将两个接口结合到一个中来,并在类中实现这个复合的接口,如下面的代码所示:
using System;
public interface First {
void A();
void B();
}
public interface Second {
void C();
}
public interface Combined: First, Second { }
class Combineimple: Combined {
// 这里是程序代码
// main方法
} }
而且C#在显示编译错误的时候还显示它们的错误代码.你可以搜索与SDK有关的在线文档寻找和这个错误代码有关的内容并找出这个错误发生的原因的细节
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -