//=====================================================================
//TITLE:
// C++ VS C#(4):枚舉,結構體
//AUTHOR:
// norains
//DATE:
// Tuesday 7-December-2010
//Environment:
// Visual Studio 2010
// Visual Studio 2005
//=====================================================================
1. 枚舉
無論是C++還是C#都采用enum來聲明一個枚舉類型,比如:view plaincopy to clipboardprint?
enum Format
{
RGB888,
RGB565,
};
enum Format
{
RGB888,
RGB565,
};
但在使用上,卻大相徑庭。對於C++來說,可以直接使用定義的類型,而C#則必須增加一個.標示,如:view plaincopy to clipboardprint?
//C++
Format format = RGB888;
//C#
Format format = Format.RGB888;
//C++
Format format = RGB888;
//C#
Format format = Format.RGB888;
這樣看來,C#似乎繁瑣一點,還要相應的類型定義;但這樣卻帶來另外一個好處,就是同一命名空間裡面的不同的enum類型可以有相同的數值,如:view plaincopy to clipboardprint?
enum Format
{
RGB888,
RGB565,
};
enum Format2
{
RGB888,
RGB565,
}
enum Format
{
RGB888,
RGB565,
};
enum Format2
{
RGB888,
RGB565,
}
這段代碼在C#中能夠順利編譯,在C++中會提示如下錯誤:error C2365: RGB888 : redefinition; previous definition was enumerator};
C++中的enum本質只是一組數值的集合,名稱也僅僅是數值的標識,但對於C#而言,卻又向前跨進了一步,enum還可以獲得相應的名稱字符串,如:view plaincopy to clipboardprint?
string strFormat = Format.RGB888.ToString();
string strFormat = Format.RGB888.ToString();
不僅可以使用成員函數,還可以使用全局的Convert函數,如:view plaincopy to clipboardprint?
string strFormat = Convert.ToString(Format.RGB888);
string strFormat = Convert.ToString(Format.RGB888);
更為有意思的是,除了數值類型,string也能轉換為enum類型,如:view plaincopy to clipboardprint?
Format format = (Format)Enum.Parse(typeof(Format), "RGB888");
Format format = (Format)Enum.Parse(typeof(Format), "RGB888");
不過需要注意,這裡的字符串也是大小寫敏感,如果該轉換的字符串不在enum類型的名稱之列,則會出錯。
2. 結構體
在C++中,類和結構體是一致的,唯一的區別在於,類默認的訪問域是private,而類是public。但對於C#來說,結構體的成員默認訪問域為private,如果要指定public,則必須每個成員變量都指定,如:view plaincopy to clipboardprint?
struct Size
{
public int x;
public int y;
};
struct Size
{
public int x;
public int y;
};
可能熟悉C++的朋友會覺得這樣寫有點麻煩,C#裡面能不能也像C++這樣:view plaincopy to clipboardprint?
struct Size
{
public:
int x;
int y;
};
struct Size
{
public:
int x;
int y;
};
但很可惜,這種寫法是在C#中是不成立的。簡單點來記憶,C#關於結構體的語法,都可以完整移植到C++中,反之則不成立。
本文來自CSDN博客,轉載請標明出處:aspx">http://blog.csdn.net/norains/archive/2010/12/10/6067276.aspx