C#與C++的區別


C# 學習參考鏈接:https://www.runoob.com/csharp/csharp-tutorial.html

------------------C#數據類型------------------

一.值類型:bool,int double....
二.引用類型(Reference types):
1)對象類型(object):可以轉換成任意值類型,當一個值類型轉換為對象類型時,則被稱為 裝箱;另一方面,當一個對象類型轉換為值類型時,則被稱為 拆箱。
object obj;
obj = 100; // 這是裝箱

2).動態類型(Dynamic types):可以存儲任何類型的值在動態數據類型變量中。這些變量的類型檢查是在運行時發生的。
dynamic <variable_name> = value;
dynamic d = 20;

三.字符串(String types)類型:
允許您給變量分配任何字符串值。字符串(String)類型是 System.String 類的別名。它是從對象(Object)類型派生的。字符串(String)類型的值可以通過兩種形式進行分配:引號和 @引號。
String str = "runoob.com";
string str = @"C:\Windows"; 等價於 string str = "C:\\Windows"; @將所有轉義字符當作普通字符對待
字符串中可以任意換行,換行符及縮進空格都計算在字符串長度之內
string str = @"<script type=""text/javascript"">
<!--
-->
</script>";

四.指針類型(Pointer types)
C# 中的指針與 C 或 C++ 中的指針有相同的功能。
char* cptr;
int* iptr;


五.用戶自定義類型
class、interface(接口) 或 delegate

 

------------------C#類型轉換------------------

顯式類型轉換 - 顯式類型轉換,即強制類型轉換。顯式轉換需要強制轉換運算符,而且強制轉換會造成數據丟失
double d = 5673.74;
int i;

// 強制轉換 double 為 int
i = (int)d;

隱式類型轉換 - 這些轉換是 C# 默認的以安全方式進行的轉換, 不會導致數據丟失
如果可能的話
ToBoolean,ToByte,ToChar,ToDateTime,ToDouble,ToInt32,ToString......(類似QT)
int i = 0;
string stri = Convert.ToString(i);


------------------C#變量與C++差不多------------------
接受來自用戶的值(控制台)
int num;
num = Convert.ToInt32(Console.ReadLine());
Console.ReadLine() //只接受字符串格式的數據。




------------------C#常量C++差不多------------------
不同之處:
is 判斷對象是否為某一類型。
If( Ford is Car) // 檢查 Ford 是否是 Car 類的一個對象。
as 強制轉換,即使轉換失敗也不會拋出異常。
Object obj = new StringReader("Hello");
StringReader r = obj as StringReader;


------------------C#運算符,判斷,循環與C++差不多------------------
循環不同之處:

C++循環

std::vector<int> vv ;
vv.push_back(2);
vv.push_back(2);

for(auto a : vv)
{
var++;
...
}
int a[] = {3,3,3};
for each (auto var in vv)
{
var++;
...
}

C#循環
string[] s = new string[] { "a,b,c,d,e,f,g" };
foreach (string item in s)
{
Console.WriteLine(item);
}

當然普通for循環大家都一樣

 

------------------C#封裝(類) 和 C++差不多------------------
C# 支持的訪問修飾符如下所示:
public:所有對象都可以訪問;
private:對象本身在對象內部可以訪問;
protected:只有該類對象及其子類對象可以訪問;
internal:同一個程序集的對象可以訪問;
protected internal:訪問限於當前程序集或派生自包含類的類型。
如果沒有指定訪問修飾符,則使用類成員的默認訪問修飾符,即為 private。//和C++一樣
(注意:在同一命名空間)

不同之處:
C#不能
private:
int a;
int b;
只能
private int a;
private int b;


------------------C#方法------------------
貌似只有成員函數,即只能在類里面定義方法
C# 是一種純面向對象的語言,它要求任何方法必須在類的范圍內,因此它沒有全局函數和全局變量的概念,技術上也無法做到。
您可以通過把方法聲明成靜態的來使一個方法與特定的類而不是類的實例關聯,但是調用的時候您同樣需要給出類的名字,就像Console.WriteLine()方法一樣。
例如:
public class Test
{
public static void OutputInfo()
{
Console.WriteLine("Hello from the Test class");
}
end of the class
}
這樣,您就可以使用Test.OutputInfo()在另一個命名空間的類里面調用OutputInfo()方法了。 //類似C++的作用域::

參數傳遞:
1)值參數:當形參的值發生改變時,不會影響實參的值,和C++一樣
2)引用參數(ref):當形參的值發生改變時,同時也改變實參的值。
class CTest
{
public void swap(ref int x, ref int y)
{
...
}

static void Main(string[] args)
{
CTest test = new CTest();
int a = 100;
int b = 200;
test.swap(ref a,ref b);
}
}


3)輸出參數(out):這種方式可以返回多個值。
return 語句可用於只從函數中返回一個值。但是,可以使用 輸出參數 來從函數中返回兩個值。輸出參數會把方法輸出的數據賦給自己,其他方面與引用參數相似。

class CTest
{
public void getvalue(out int x, out int y)
{
int temp = 5;
x = temp;
y = temp + 1;
}

static void Main(string[] args)
{
CTest test = new CTest();
int a,b;
test.getvalue(out a, out b);
}
}

ref和out的區別:
ref有進有出,out只出不進
ref前變量必須初始化,out則可以不初始化
ref用於改變變量,out用於獲取變量
相同之處都是傳地址


------------------C#可空類型(?與??的使用)------------------
int? i = 3; 等價於 Nullable<int> i = new Nullable<int>(3);
int i; //默認值是0,與C++不同,C++中如果是定義的全局變量或者靜態變量,未初始化的話就是0.如果是局部變量,那就是以前殘留在堆棧里的隨機值。
int? i; //默認值是null

double? num1 = null;
double num2 = num1 ?? 5.34 //num1如果為空則返回5.34


------------------C#數組(Array)與C++有所不同------------------
C#中 int arr[10] 是錯誤的聲明
應該用 double[] balance = new double[10]; //定義時必須指定數組大小
int [] marks = new int[] { 99, 98, 92, 97, 95}; //初始化

C++則是 int* p = new int[10]

Array類是 C# 中所有數組的基類,它是在 System 命名空間中定義。
Array 類提供了各種用於數組的屬性和方法
Array 類的常用屬性
Length 獲取一個 32 位整數,該值表示所有維度的數組中的元素總數。
Array.FunctionName(Array Object...)


------------------C#字符串(String)------------------
字符數組來表示字符串,更常見的是更常見的做法是使用 string 關鍵字來聲明一個字符串變量,string是System.String的別名

String 類的屬性
Chars 在當前 String 對象中獲取 Char 對象的指定位置。
Length 在當前的 String 對象中獲取字符數。

String 類的方法
System.String.FunctionName(...)


------------------C# 中的結構與傳統的 C 或 C++ 中的結構不同------------------
C#
struct Books
{
int i;
double b;
}book; //是錯誤的聲明

struct Books
{
int i;
double b;
};
Books book; //正確

C#的結構體與C++不同之處還有:C#結構體不支持繼承,不能聲明默認的構造函數,不能有protect關鍵字


------------------C#枚舉與C++差不多------------------
C#類的默認訪問標識符是 internal,成員的默認訪問標識符是 private。
internal(內部):同一個程序集的對象可以訪問;//被編譯到同一個dll或exe中的程序就是處於同一個程序集中

------------------C#static------------------
C# 類的靜態成員變量:與C++一樣,所有類的對象共享,不屬於該類的任何一個對象,只屬於該類
C# 類的靜態成員函數:與C++一樣,不屬於該類的任何一個對象,所有類的對象共享,只屬於該類。且只能訪問靜態變量,靜態函數在對象被創建之前就已經存在,如果想調用非靜態成員函數,必須先實例化對象,再用對象去調用

 

------------------C#類------------------
與C++差不多,但是不支持多重繼承


------------------C#多態性------------------
靜態多態性:與C++一樣,支持函數重載,運算符重載
動態多態性:動態多態性是通過 抽象類 和 虛方法 實現的
1.C# 允許您使用關鍵字 abstract 創建抽象類,用於提供接口的部分類的實現。當一個派生類繼承自該抽象類時,實現即完成
通過在類定義前面放置關鍵字 sealed,可以將類聲明為密封類。當一個類被聲明為 sealed 時,它不能被繼承。抽象類不能被聲明為 sealed。
2.與C++一樣,當有一個定義在類中的函數需要在繼承類中實現時,可以使用虛方法。虛方法是使用關鍵字 virtual 聲明的。虛方法可以在不同的繼承類中有不同的實現。

------------------C#接口(interface)------------------
定義接口:
interface IMyInterface
{
//接口成員
void MethodToImplement();
...
}

實現接口:
class Ctest : IMyInterface
{
static void Main()
{
Ctest test = new Ctest();
test.MethodToImplement();
}

public void MethodToImplement()
{
....
}
}

繼承接口:
interface ImyIf : IMyInterface
{
void fun();
}
接口注意的幾點:
接口方法不能用public abstract等修飾。接口內不能有字段變量,構造函數。
接口內可以定義屬性(有get和set的方法)。如string color { get ; set ; }這種。
實現接口時,必須和接口的格式一致。
必須實現接口的所有方法。

------------------C#命名空間和C++差不多------------------


------------------C#預處理器指令------------------
與C++不同的是,它不是來定義一個宏,即#define PI 3.14 是錯誤的,#define PI是可以的,並且C#中,#define必須要在第一行
C#預處理器指令常用的是條件編譯
#define PI
#if(PI)
...
#else
...
#endif


------------------C#異常處理------------------
try
{
// 引起異常的語句
}
catch( ExceptionName e1 )
{
// 錯誤處理代碼
}
catch( ExceptionName e2 )
{
// 錯誤處理代碼
}
catch( ExceptionName eN )
{
// 錯誤處理代碼
}
finally
{
// 不管有沒有異常都要執行的語句
}
可以列出多個 catch 語句捕獲不同類型的異常,以防 try 塊在不同的情況下生成多個異常。
C# 中的異常類主要是直接或間接地派生於 System.Exception 類

 

*****************************************************************項目代碼中遇到不懂的*****************************************************************
IntPtr 可以用來表示指針或句柄、它是一個平台特定類型,這是一個結構體,如定義一個句柄 IntPtr hwnd;
三、用在什么地方
(1)C#調用WIN32 API時
(2)C#調用C/C++寫的DLL時(其實和1相同,只是這個一般是我們在和他人合作開發時經常用到)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM