操作符重载
有些操作符能够被重载,而另一些则不能。特别的是,没有一个赋值运算符能够被重载。
能够被重载的单目操作符是:+、-、!、++、--、true、false。
能够被重载的二元运算符是:+、-、*、/、%、&、|、ˆ〈〈、 〉〉、=、!=、<、=。
C#独有的特点
C#最引人入胜的地方是它和Java的不同,而不是相似的地方。
1)动态查阅
C# 4.0新增dynamic关键字,提供动态编程(Dynamic programming),把既有的静态对象标记为动态对象,类似JavaScript, Python或Ruby。
dynamic calc s GetCalculator();
int sum=calc.Add(10, 20);
具名参数与可选参数:
public StreamReader OpenFile(
string path,
int bufferSize=1024)
{
…
}
调用OpenFile时,顺序可以完全颠倒。
OpenFile(bufferSize:4096, path:“foo.txt");
2)中间代码
微软在用户选择何时MSIL应该编译成机器码时留了很大的余地,微软公司很小
心地声称MSIL不是解释性的,而是被编译成了机器码。这种实现方式决定了基于MSIL的程序(指的是用C#、Visual Basic、Managed C++等语言编写的程序)将在性能上超过解释性的Java代码。
3)命名空间中的声明
创建一个程序,也就是在一个命名空间中创建了一个或多个类。同在这个命名空间中(在类的外面)开发者还有可能声明界面、枚举类型和结构体,这就是必须使用using关键字来引用其他命名空间的内容。
4)基本的数据类型
C#拥有比C, C++或者Java更广泛的数据类型,这些类型包括bool, byte、ubyte、short、ushort、int、uint、long、ulong、float、double和decimal。像Java一样,这些类型都有一个固定的大小;像C和C++一样,每个数据类型都有有符号和无符号两种类型。与Java相同的是,一个字符变量包含的是一个16位的Unicode字符。C#新的数据类型是decima数据类型,对于货币数据,它能存放28位十进制数字。
5)两个基本类
一个名叫Object的类是所有其他类的基类,一个名叫String的类也像Object一样是这个语言的一部分。作为语言的一部分存在,意味着编译器有可能使用它:无论何时你在程序中写入一句带引号的字符串,编译器都会创建一个String对象来保存它。
6)参数传递
默认的参数传递方法是对基本数据类型进行值传递。ref关键字可以用来强迫一个变量通过引用传递,使得一个变量可以接受一个返回值。ut关键字也能声明引用传递过程,但与ref不同的是,指明这个参数并不需要初始值。
7)与COM的集成
C#对Windows程序最大的卖点可能就是它与COM的无缝集成,COM就是微软的Win.32组件技术,因此最终有可能在任何.NET语言里编写COM客户和服务器端。C#编写的类可以子类化一个已存在的COM组件,生成的类也能作为一个COM组件使用。例如,JScript语言子类化它从而得到第三个COM组件,这种现象的结果是导致了一个运行环境的产生,在这个环境中的组件是网络服务,可用任何.NET语言子类化。
8)索引下标
一个索引除了不使用属性名来引用类成员而是用一个方括号中的数字来匿名引用(就像用数组下标一样)以外,它和属性是相似的。
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[O]);
9)代理和反馈
一个代理对象包括了访问一个特定对象的特定方法所需的信息,只要把它当成一个聪明的方法指针就行了。代理对象可以被移动到另一个地方,然后通过访问它来对已存在的方法进行类型安全的调用。