C#是一種強(qiáng)類型的語言。這意味著我們必須聲明一個變量類型,該變量指示將要存儲的值的類型,例如整數(shù),浮點(diǎn)數(shù),十進(jìn)制,文本等。
以下聲明和初始化了不同數(shù)據(jù)類型的變量。
string stringVar = "Hello World!!"; int intVar = 100; float floatVar = 10.2f; char charVar = 'A'; bool boolVar = true;
C#主要將數(shù)據(jù)類型分為兩種:值類型和引用類型。值類型包括簡單類型(例如int,float,bool和char),枚舉類型,結(jié)構(gòu)類型和Nullable值類型。引用類型包括類類型,接口類型,委托類型和數(shù)組類型。在下一章中將詳細(xì)了解值類型和引用類型。
C#包括一些預(yù)定義的值類型和引用類型。下表列出了預(yù)定義的數(shù)據(jù)類型:
類型 | 描述 | 范圍 | 后綴 |
---|---|---|---|
byte | 8 位無符號整數(shù)類型 | 0 到 255 | |
sbyte | 8 位有符號整數(shù)類型 | -128 到 127 | |
short | 16 位有符號整數(shù)類型 | -32,768 到 32,767 | |
ushort | 16 位無符號整數(shù)類型 | 0 到 65,535 | |
int | 32 位有符號整數(shù)類型 | -2,147,483,648 到 2,147,483,647 | |
uint | 32 位無符號整數(shù)類型 | 0 到 4,294,967,295 | u |
long | 64 位有符號整數(shù)類型 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | l |
ulong | 64 位無符號整數(shù)類型 | 0 到 18,446,744,073,709,551,615 | ul |
float | 32 位單精度浮點(diǎn)型 | -3.402823e38 到 3.402823e38 | f |
double | 64 位雙精度浮點(diǎn)型 | -1.79769313486232e308 to 1.79769313486232e308 | d |
decimal | 128 位精確的十進(jìn)制值,28-29 有效位數(shù) | (+ 或-)1.0 x 10e-28 到 7.9 x 10e28 | m |
char | 16 位 Unicode 字符 | 任何有效的字符,例如 a,*, \x0058 (hex), or\u0058 (Unicode) | |
bool | 8 位邏輯 true/false 值 | True 或 False | |
object | 所有類型的基類 | ||
string | Unicode字符序列 | ||
DateTime | 表示日期和時間 | 0:00:00am 1/1/01 到 11:59:59pm 12/31/9999 |
如上表所示,每種數(shù)據(jù)類型(字符串和對象除外)都包含值范圍。如果該值超出數(shù)據(jù)類型的允許范圍,則編譯器將給出錯誤。例如,int數(shù)據(jù)類型的范圍是-2,147,483,648到2,147,483,647。因此,如果分配的值不在此范圍內(nèi),則編譯器將給出錯誤。
示例:編譯時錯誤
// 編譯時錯誤:無法將類型'long'隱式轉(zhuǎn)換為'int'。 int i = 21474836470;
無符號整數(shù),long,float,double和decimal類型的值必須分別以u,l,f,d和m為后綴。
uint ui = 100u; float fl = 10.2f; long l = 45755452222222l; ulong ul = 45755452222222ul; double d = 11452222.555d; decimal mon = 1000.15m;
預(yù)定義的數(shù)據(jù)類型為其.NET類型(CLR類)名稱的別名。下表列出了預(yù)定義數(shù)據(jù)類型的別名和相關(guān)的.NET類名稱。
別名 | .NET類型 | 類型 |
---|---|---|
byte | System.Byte | struct |
sbyte | System.SByte | struct |
int | System.Int32 | struct |
uint | System.UInt32 | struct |
short | System.Int16 | struct |
ushort | System.UInt16 | struct |
long | System.Int64 | struct |
ulong | System.UInt64 | struct |
float | System.Single | struct |
double | System.Double | struct |
char | System.Char | struct |
bool | System.Boolean | struct |
object | System.Object | Class |
string | System.String | Class |
decimal | System.Decimal | struct |
DateTime | System.DateTime | struct |
這意味著無論您定義的是int還是Int32,變量都相同。
int i = 345; Int32 i = 345;// 同上
某些數(shù)據(jù)類型的值會在C#中自動轉(zhuǎn)換為不同的數(shù)據(jù)類型。這稱為隱式轉(zhuǎn)換。
int i = 345; float f = i; Console.WriteLine(f); //輸出:345
在上面的實(shí)例中,整型變量 i 的值被賦給float類型 f 的變量,因?yàn)檫@個轉(zhuǎn)換操作是在C#中預(yù)定義的。
以下是隱式數(shù)據(jù)類型轉(zhuǎn)換表。
隱式轉(zhuǎn)換 | 至 |
---|---|
sbyte | short, int, long, float, double, decimal |
byte | short, ushort, int, uint, long, ulong, float, double, decimal |
short | int, long, float, double, or decimal |
ushort | int, uint, long, ulong, float, double, or decimal |
int | long, float, double, or decimal. |
uint | long, ulong, float, double, or decimal |
long | float, double, or decimal |
ulong | float, double, or decimal |
char | ushort, int, uint, long, ulong, float, double, or decimal |
float | Double |
從int、uint、long或ulong轉(zhuǎn)換為float以及從long或ulong轉(zhuǎn)換為double可能會導(dǎo)致精度損失。沒有數(shù)據(jù)類型隱式轉(zhuǎn)換為char類型。
但是,并非所有數(shù)據(jù)類型都隱式轉(zhuǎn)換為其他數(shù)據(jù)類型。例如,int類型不能隱式轉(zhuǎn)換為uint。必須明確指定它,如下所示。
public static void Main() { int i = 100; uint u = (uint) i; Console.Write(i); }
在上面的示例中,整數(shù)i通過在括號(uint)中指定uint顯式地轉(zhuǎn)換為uint。這將把整數(shù)轉(zhuǎn)換成uint。