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#關鍵字sealed就象Java關鍵字final,它申明一個類不是抽象的,但是它也不能被用做另一個類的基類.接口:就象在Java中一樣,一個接口是一組方法集合的抽象定義.當一個類或結構體實現一個接口的時候,它必須實現這個接口中定義的所有方法.一個單一的類可以實現幾個接口.也許以後會出現一些微妙的差別,但是這個特點看起來與Java相比沒有變化.布爾運算:條件表達式的結果是布爾數據類型,布爾數據類型是這種語言中獨立的一種數據類型.從布爾類型到其他類型沒有直接的轉換過程.布爾常量true和false是C#中的關鍵字.錯誤處理:如Java中那樣,通過拋出和捕捉異常對象來管理錯誤處理過程.內存管理:由底層.NET框架進行自動內存垃圾回收.
C#從C和C++繼承的特點
編譯
程序直接編譯成標準的二進制可執行形式.但C#的源程序並不是被編譯成二進制可執行形式,而是一中中間語言,類似於JAVA字節碼。如果前面的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關鍵字用在將在事件發生的時候被當成代理調用的方法聲明.
(摘自百度百科)