C#学习笔记(C#与C++的差异)001
由于本人有很好的C++基礎,所以想從C++直接轉到C#.<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
?
1.?????? 布爾值:在C++中,bool類型實質上是一個整數。在C#中,不存在bool類型與其他類型之間的相互轉換。
bool 關鍵字是System.Boolean的別名.它用于聲明變量來存儲布爾值true和false.
可將布爾值賦給bool變量.也可以將計算為bool類型的表達式賦給bool變量.
在C++中,bool類型的值可轉換為int類型的值;也就是說,false等效于零值,而true等效于非零值.在C#中,不存在bool類型與其它類型之間的相互轉換.例如,下列if語句在C#中是非法的,而在C++中則是合法的:
int x = 123;
if (x) // 在C# 是錯誤的
{ printf("The value of x is nonzero."); }
若要測試int類型的變量,必須將該變量與一個值(比如零)進行顯式比較,如下所示:
int x = 123;
if (x != 0) // 在C# 中容許
{ printf(“The value of x is nonzero.”); }
2.?????? long類型:long類型在C#中為64位,而在C++中為32位。
long關鍵字表示一種整形,該類型根據下表顯示的大小和范圍存儲值。
long取值范圍-9223372036854775808到9223372036854775807,在long類型中使用后綴L:
long long2 = <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />4294967296L;
當使用后綴L時,將根據整數的大小確定它的類型為long還是ulong。
3.?????? switch語句:與C++中的switch語句不同,C#不支持從一個case標簽貫穿到另一個case標簽。
switch語句是一個控制語句,它通過將控制傳遞給其體內的一個case語句來處理多個選擇和枚舉。
空case標簽可以從一個case標簽貫穿到另一個:
using System;
class SwitchTest
{
??????? static void Main()
??????? {
?????????????? int n = 2;
?????????????? switch(n)
?????????????? {
????????????????????? case 1:
????????????????????? case 2:
????????????????????? case 3:
???????????????????????????? Console.WriteLine(“It`s 1, 2, or 3.”);
???????????????????????????? break;
?????????????? default:
????????????????????? Console.WriteLine(“Not sure what it is.”);
????????????????????? break;
?????????????? }
??????? }
}
OUT: It`s 1, 2, or 3.
4.?????? 委托:C#中的委托大致類似于C++中的函數指針,是類型安全可靠的.
委托類型聲明的格式如下:
public delegate void TestDelegate(string message);
delegate關鍵用于聲明一個引用類型,該引用類型可用于封裝命名方法或匿名方法.委托類似于C++中的函數指針;但是,委托是類型安全和可靠的.
5.?????? extern關鍵字:在C++中,extern用于導入類型。在C#中,extern用于為使用同一程序集的不同版本創建別名。
extern修飾符用于聲明在外部實現的方法。extern修飾符的覺用法是在使用Interop服務調入非托管代碼DllImport屬性一起使用;在這種情況下,該方法還必須聲明為static,如下面的所示:
[DllImport(“avifil32.dll”)]
private static extern void AVIFileInit();
將abstract和extern修飾符一起使用來修改同一成員是錯誤的。使用extern修飾符意味著方法在C#代碼的外部實現,而使用abstract外包符意思著在類在未提供方法實現。
6.?????? static關鍵字:在C++中,static既可用于聲明類級實體,也可用于聲明特定于某模塊的類型。在C#中,static僅用于聲明類級實體。
使用static修飾符聲明屬于類型本身而不是屬于特定對象的靜態成員。static修飾符可用于類、字段、方法屬性、運算符、事件和構造函數,但不能用于索引器、析構函數或類以外的類型。
備注:
l????????? 常數或者類型聲明隱式地靜態成員。
l????????? 不能通過實例引用靜態成員。然而,可以通過類型名稱引用它。
l????????? 盡管類的實例包含該類所有實例字段的單獨副本,但每個靜態字段只有一個副本。
l????????? 不可以使用this來引用靜態方法或屬性訪問器。
l????????? 如果對類應用static關鍵字,則該類的所有成員都必須是靜態的。
l????????? 類(包括靜態類)可以有靜態構造函數。在程序開始和實例化類之間的某個時刻調用靜態構造函數。
7.?????? C#中的Main方法和C++中的main函數的聲明方式不同。在C#中,它是大寫的,并且始終是static的。此外,在C#中,對處理命令行參數的支持要可靠得多。
Main方法是程序的入口點,您將在那里創建對象和調用其他方法。一個C#程序中只能有一個入口點。
class TestClass
{
??? static void Main(string[] args)
??? {
??????? // Display the number of command line arguments:
??????? System.Console.WriteLine(args.Length);
??? }
}
概述:
l????????? Main方法是程序的入口點,程序控制在該方法中開始和結束。
l????????? 該方法在類或結構的內部聲明。它必須為靜態方法,而不應該為公共方法。
l????????? 它可以具有void或int返回類型。
l????????? 聲明Main方法時既可以使用參數,也可以不使用參數。
l????????? 參數可以作為從零開始索引的命令行參數來讀取。
l????????? 與C和C++不同,程序的名稱不會被當作第一個命令參數。
8.?????? 在C#中,只有在unsafe模式下才允許使用指針。
unsafe關鍵字表示不安全上下文,該上下文是任何涉及指針的操作所必需的。
可以在類型或成員的聲明中使用unsafe修飾符。因此,類型或成員的整個正文范圍均被視為不安全上下文。若要編譯不安全代碼,必須指定/unsafe編譯器選項。無法通過公共語言運行庫驗證不安全代碼。
9.?????? foreach關鍵字使您可以循環訪問數組和集合。
foreach語句為數組或對象集合中的每個元素重復一個嵌入語句級。foreach語句用于循環訪問集合以獲取所需信息,但不應用于更改集合內容以避免產生不可預知的副作用。
備注:
嵌入語句為數組或集合中的每個元素繼續執行。當為集合中的所有元素完成有迭代后,控制傳遞給foreach塊之后的下一個語句。
在此示例中,使用foreach顯示整數數組的內容。
// cs_foreach.cs
class ForEachTest
{
??????? static void Main(string[] args)
??????? {
?????????????? int[] fibarray = new int[] {0, 1, 2, 3, 5, 6, 18};
?????????????? foreach(int i in fibarray)
?????????????? {
????????????????????? System.Console.WriteLine(i);
?????? ????????????? }
?????? }
}
?????? 輸出
0 1 2 3 5 6 18
10.??? 方法隱藏:C++通過繼承支持方法的隱式“隱藏”。在C#中,必須使用new修飾符來顯式隱藏繼承的成員。
在C#中,new關鍵字可用作運算符、修飾符或約束。
l????????? new運算符:用于創建對象和調用構造函數。
new運算符還用于調用值類型的默認構造函數。
不能重載new運算符。如果new運算符分配內在失敗,將引發異常OutOfMemoryException。
l????????? new修飾符:用于向基類成員隱藏繼承成員。
在用作修飾符時,new關鍵字可以顯式隱藏從基類繼承的成員。隱藏繼承的成員意味著該成員的派生版本將替換基類版本。在不使用new修飾符的情況下隱藏成員是允許的,但會生成警告。使用new顯式隱藏成員會取消此警告,并記錄代之派生版本這一事實。
若要隱藏繼承的成員,請使用相同名稱在派生類中聲明該成員,并使用new修飾符該成員。例如:
public class BaseC
{
??????? public int x;
??????? public void invoke(){}
}
public class DerivedC : BaseC
{
??????? new public void Invoke(){}
}
在此示例中,DerivedC.Invoke隱藏了BaseC.Invoke。字段x不受影響,因為它沒有被類似的名稱的字段隱藏。
通過繼承隱藏名稱采用下列形式之一:
1.?????? 引入類或結構中的常數、指定、屬性或類型隱藏具有相同名稱的所有基類成員。
2.?????? 引入類或結構中的索引器將隱藏具有相同名稱的所有基類索引器。
3.?????? 引入類或結構的方法隱藏基類中具有相同名稱的屬性、字段和類型。同時也隱藏具有相同簽名的所有基類方法。
對同一成員同時使用new和override是錯誤的,因為這兩個修飾符在含義上相互排斥。使用new會用同樣的名稱創建一個新成員并使原始成員變為隱藏的,而override則擴展繼承成員的實現。
l????????? new約束:用于在泛型聲明中約束可能用作類型參數的參數的類型。
new結束指定泛型類聲明中的任何類型參數都必須有公共的無參數構造函數。當泛型創建類型的新實例時,將此約束應用于類型參數,如下面的示例所示:
class ItemFactory<T> where T: new()
{
public T GetNewItem()
{
return new T();
}
}
當與其他約束一起使用時,new()約束必須最后指定:
using System;
public class ItemFactory<T>
where T: IComparable, new()
{}
轉載于:https://www.cnblogs.com/flying_bat/archive/2007/05/27/761696.html
總結
以上是生活随笔為你收集整理的C#学习笔记(C#与C++的差异)001的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JRuby大捷:ThoughtWorks
- 下一篇: .net Remoting(1)基本内容