定義類的修飾符:
關於類的修飾符需要注意的是:
public class MyClass : MyBase {} // MyBase is a internal class
,不過internal可以繼承自public類public class MyClass : MyBase, IMyInterface {}
定義接口的修飾符:
需要注意的是:
當類沒有繼承對象時,默認繼承System.Object,那麼就有必要看看該類中到底有什麼。
使用GetType的一個示例:
if (myObj.GetType() == typeof(MyComplexClass))
{
// myObj is an instance of the class MyComplexClass
}
修飾關鍵字:
只針對成員變量的修飾符:
只針對成員函數的修飾符:
private int myInt;
public int MyIntProp
{
get
{
return myInt;
}
set
{
if (value >= 0 && value <= 10)
myInt = value;
else
throw(...);
}
}
很容易想到的實現方式如下:
public class MyBaseClass
{
public void DoSomething()
{ // base implementation
}
}
public class MyDerivedClass : MyBaseClass
{
public void DoSomething()
{ // Derived class implementation, hides base implementation
}
}
但是上面的代碼在編譯的過程中會出現警告,說MyDerivedClass中的DoSomething函數隱藏了基類中的DoSomething函數,請使用new關鍵字,即public new void DoSomething() {}
。
可以使用現有的System.Collections.ArrayList實現。這裡要講的是自己定義Collections。可以采用如下的方式來實現,如:
public class Animals : CollectionBase
{
// Add功能
public void Add(Animal newAnimal)
{
List.Add(newAnimal);
}
// Remove功能
public void Remove(Animal oldAnimal)
{
List.Remove(oldAnimal);
}
// 實現MyAnimal[0]的訪問方式
public Animal this[int animalIndex]
{
get
{
return (Animal)List[animalIndex];
}
set
{
List[animalIndex] = value;
}
}
public Animals()
{
}
}
重載操作符的成員函數是公有靜態的。需要注意的是在進行變量轉換的成員函數的定義過程中,有兩個額外的關鍵字explicit和implicit。
// 二元操作符+
public class Class1
{
public int val;
// 二元操作符
public static Class1 operator +(Class1 op1, Class1 op2)
{
Class1 returnVal = new Class1();
returnVal.val = op1.val + op2.val;
return returnVal;
}
// 一元操作符,-
public static Class1 operator -(Class1 op1)
{
Class1 returnVal = new Class1();
returnVal.val = -op1.val;
return returnVal;
}
}
is操作符:檢測一個未知的變量能夠轉化成為已知的類型的變量。如果可以則返回true,否則返回false。但是它並不能判斷兩個類型是否相同。
它的語法結構為:<operand> is <type>
該表達式的可能的結果如下:
<operand>
也是那個類型,或是那個類的子類,或是可以轉換成那個類型時,返回的結果為trueas操作符,將變量轉換成特殊的引用類型。<operand> as <type>
。
適用於以下環境,
如果不能夠轉換,則返回的結果為null。
BaseClass obj1 = new BaseClass();
DerivedClass obj2 = obj1 as DerivedClass; // return null 不會拋出異常,如果使用 ... = (DerivedClass)obj1; 則會拋出異常
// 如果以下面的方式進行轉換則是可以的
DerivedClass derivedClass = new DerivedClass();
BaseClass baseClass = derivedClass;
DerivedClass newDerivedClass = baseClass as DerivedClass; // not null
直接采用System.Object對象內的MemberwiseClone()當遇到類含有引用變量的時候,就不能夠實現深層的拷貝,如:
public class Content
{
public int Val;
}
public class Cloner
{
public Content MyContent = new Content();
public Cloner(int newVal)
{
MyContent.Val = newVal;
}
public object GetCopy()
{
return MemberwiseClone();
}
}
// 具體調用
Cloner mySource = new Cloner(5);
Cloner myTarget = (Cloner)mySource.GetCopy();
mySource.MyContent.Val = 2; // 這將導致myTarget.MyTarget.Val也相應的改變成了2
要實現深度的拷貝,可以實現ICloneable接口。
public class Cloner : ICloneable
{
public Content MyContent = new Content();
public Cloner(int newVal)
{
MyContent.Val = newVal;
}
public object Clone()
{
Cloner clonedCloner = new Cloner(MyContent.Val);
return clonedCloner;
// 或是
// Cloner clonedCloner = new Cloner();
// clonedCloner.MyContent = MyContent.Clone();
// return clonedCloner;
}
}
自定義的過程中,只要繼承Expection
類並進行實現即可。如:
public class AgeBelowZeroException : Exception
{
public AgeBelowZeroException() :
base("The age must >= 0")
{
}
}
浮點分為兩類:單精度型和雙精度型,
其類型說明符為float 單精度說明符,double 雙精度說明符。在Turbo C中單精度型占4個字節(32位)內存空間,其數值范圍為3.4E-38~3.4E+38,只能提供七位有效數字。雙精度型占8 個字節(64位)內存空間,其數值范圍為1.7E-308~1.7E+308,可提供16位有效數字。
實型變量說明的格式和書寫規則與整型相同。
例如: float x,y; (x,y為單精度實型量)
double a,b,c; (a,b,c為雙精度實型量)
實型常數不分單、雙精度,都按雙精度double型處理。
有些不同,但是要使懂得VC++的人學C#就很好上手了。他包含了vc++的一些語法風格,有新增加了新的內容。擴展了開發平台,兼容很多語言在裡面。
C#(讀做 "C sharp",中文譯音“夏普”)是微軟公司發布的一種面向對象的、運行於.NET Framework之上的高級程序設計語言,並定於在微軟職業開發者論壇(PDC)上登台亮相.C#是微軟公司研究員Anders Hejlsberg的最新成果.C#看起來與Java有著驚人的相似;它包括了諸如單一繼承,界面,與Java幾乎同樣的語法,和編譯成中間代碼再運行的過程.但是C#與Java有著明顯的不同,它借鑒了Delphi的一個特點,與COM(組件對象模型)是直接集成的,而且它是微軟公司.NET windows網絡框架的主角.
在本文中,我將考察創建一種新計算機語言的一般動機,並將特別指明是什麼原因導致了C#的出現.然後我將介紹C#和它與Java,c,c++的相似之處.其次我將討論一些存在於Java和C#之間的高層次的,和基礎的差別.我將以衡量在用多種語言開發大型應用程序的時候所需的知識(或者對這種知識的缺乏程度)來結束本文,而這正是.NET和C#的一個主要戰略.目前,C#和.NET還只能以C#語言規則,以及Windows 2000的一個"d預覽版本",還有MSDN上迅速增多的文檔集子的形式獲得(還沒有最終定型).
微軟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, worl......余下全文>>