一、C#中的變量和常量
C#中用於定義常量的方式有兩種一個使用const關鍵字,一個是用readonly關鍵字。使用const定義的常量叫靜態常量(compile-time constant),用readonly定義的常量叫動態常量(runtime constant)。常量定義 public const float PI=3.14159f; 常量PI對於所有的類對象而言都是一致的,要訪問該字段可以直接用格式:類.PI進行取值,不需要實例化,類似於一個類的靜態字段。而動態常量的定義為 public readonly float NUM,變量NUM可以看做一個動態的常量,可以在類的定義字段賦值或者在類的構造函數函數中賦值。比如可以定義:public readonly float NUM = 20.2F。
來看下面的例子
class Program { static void Main(string[] args) { float pi = Constant.PI; //通過類型取值,和靜態變量類似,但是常量是readonly的,不能賦值 float r = 10.2f; float D = 2 * pi * r; Console.WriteLine(D); Constant constant = new Constant(); Console.WriteLine( constant.NUM); //通過實例取值,NUM在構造函數中定義的 Console.WriteLine(constant.NUM1); //通過實例取值,NUM1是在字段的定義的 Console.Read(); } } class Constant { public const float PI = 3.1415926F; public readonly int NUM1 = 10; public readonly int NUM; public Constant() { NUM = 12; } }
二、c#變量數據類型
變量的數據類型包括預定義的數據類型和自定義的數據類型,自定義的數據類型包括數組、枚舉、結構和類,而預定義的數據類型如下表所示:
| 類型 |
描述 |
范圍/精度 |
例子 |
||
| object |
所有其它類型的最根本的基礎類型 |
object o = null; |
|||
| string |
字符串類型,一個字符串是一個Unicode字符序列 |
string s= "Hello"; |
|||
| sbyte |
8-bit 有符號整數類型 |
–128...127 |
sbyte val = 12; |
||
| short |
16-bit有符號整數類型 |
–32,768...32,767 |
short val = 12; |
||
| int |
32-bit有符號整數類型 |
–2,147,483,648...2,147,483,647 |
int val = 12; |
||
| long |
64-bit有符號整數類型 |
–9,223,372,036,854,775,808 ...9,223,372,036,854,775,807 |
long val1 = 12; long val2 = 34L; |
||
| byte |
8-bit無符號整數類型 |
0...255 |
byte val1 = 12; byte val2 = 34U; |
||
| ushort |
16-bit無符號整數類型 |
0...65,535 |
ushort val1 = 12; ushort val2 = 34U; |
||
| uint |
32-bit無符號整數類型 |
0...4,294,967,295 |
uint val1 = 12; uint val2 = 34U; |
||
| ulong |
64-bit無符號整數類型 |
0...18,446,744,073,709,551,615 |
ulong val1 = 12; ulong val2 = 34U; ulong val3 = 56L; ulong val4 = 78UL; |
||
| float |
單精度浮點數類型 |
1.5 × 10−45 至 3.4 × 1038,7 位精度 |
float val = 1.23F; |
||
| double |
雙精度浮點數類型 |
5.0 × 10−324 至 1.7 × 10308,15 位精度 |
double val1 = 1.23; double val2 = 4.56D; |
||
| bool |
布爾類型類型; 一個布爾類型數據不是真就是假 |
true,false |
bool val1 = true; bool val2 = false; |
||
| char |
字符類型; 一個字符數據是一個Unicode字符 |
char val = 'h'; |
|||
| decimal |
精確十進制類型,有28個有效位 |
1.0 × 10−28 至 7.9 × 1028,28 位精度 |
decimal val = 1.23M; |
||
下面程序對數據類型的長度作一個小測試,a,b為整形,c為長整形,d為字符型,e為byte,f為整形。獲取整數a 在堆棧中的地址 p =&a,同樣可以獲取b,c ,d,e,f的地址&b,&c,&d,&e,&f。
class Program { unsafe static void Main(string[] args) { int a = 100; int b = 100; long c = 1200; char d = 'b'; byte e = 10; int f = 20; int* p = &a; //獲取整數a的地址 Console.WriteLine((int)&a); Console.WriteLine((int)&b); Console.WriteLine((int)&c); Console.WriteLine((int)&d); Console.WriteLine((int)&e); Console.WriteLine((int)&f); //獲取a地址之下一個地址的值(32位),也即是b的地址 Console.WriteLine(*(p - 1)); //獲取c的地址,因為c是long類型所以需p-3 Console.WriteLine(*(p - 3)); //獲取d的地址,'b'的ASCII碼是98 Console.WriteLine(*(p - 4)); Console.WriteLine(sizeof(sbyte)); Console.WriteLine(sizeof(long)); Console.ReadKey(); } }
數據a,b,c,d,e,f分別壓入棧中,從圖中可以看出他們在內存中的地址,用&a-&b就可算出b的數據長度。c為long占8個字節,其高位的4字節地址中的數據為0,其低位4字節地址中的數為1200,d雖然只占用2個字節,但在類存分配中已4字節為最小單元的情況下(對32位版本而言)還是分配了4個字節,同理內存為e分配了4個字節,實際上它只用了1個字節。


下面,我重點介紹一下其中的幾種預定義的數據類型:
float數據類型
float類型數據的位構成:
| 1bit(符號位) |
8bits(指數位) |
23bits(尾數位) |
Float表示一個有32位的浮點數,其中第一位為符號位,后面8位為冪指數,再其后23位為尾數部分。冪指數的范圍為(2-127-2128),表示的數據范圍為-3.40E+38 ~ +3.40E+38。而尾數為223=8388608,意味着最多可以有七位的有效位,所以表示float的精度為7位。
可以根據系統自動獲取數據范圍
float f = float.maxvalue;
float f = float.minvalue;
double類型
double數據類型的位構成:
| 1bit(符號位) |
11bits(指數位) |
52bits(尾數位) |
Double表示一個64位的雙精度數,其中第一位為符號位,后面11位為指數為,再其后為52位尾數部分。指數的范圍為(2-1023-21024),表示的數據范圍為-1.79E+308 ~ +1.79E+308,尾數為252 = 4503599627370496,意味着最多可以有十六位的有效位,所以表示double的精度為16位。
所以說浮點數的精度由尾數的位數決定,而范圍由指數的位數決定。
Bool result = Float.IsNaN(0/0f) ;
判斷result的結果是否為一個數字 NaN ( not a number)
Bool result = Float.IsInfinity(10.2f/0f); //判斷是否為無窮大
Bool result = Float.IsNegativeInfinity(-20.0f/0); //判斷是否為負無窮大
Bool result = Float.IsPositiveInfinity(20.0f/0); //判斷是否為正無窮大
Int數據類型
Int 賦值
long l = 200;
int i = l; //直接賦值,系統排出錯誤,因為l的取值范圍要大於i的取值范圍,所以需要顯示的類型轉換
int I = (int)l;
short s= 200;
int I = s; //直接賦值不會出錯,系統可以將short類型的s轉化為l,
因此將一個取值范圍大的數據類型轉化為一個取值范圍較小的數據類型需要顯式地轉化,相反講一個范圍較小的數據類型轉化為一個取值范圍較大的數據系統可以隱式的進行轉化。
獲取Int數據類型的最大最小值
Int.maxvalue;
Int.minvalue;
Int.parse(“200”)數據轉換,將字符串參數轉化為整數,但是此種方式不是一種安全的數據轉化方式。
如:int.parse(“12x”),系統肯定出錯,因為不能成功將字符串"12x"轉化為一個整數,在系統運行的時候一定會拋出Exception;但是Int還提供一種安全的轉化方式,可以使用Int.tryparse(“sf”,out i)判斷轉化是否成功,如"sf"不能轉化為一個整數,對於不成功的情況我們可以作出相應的處理。
來看下面的例子:
class Program { static void Main(string[] args) { int result; Console.WriteLine("請輸入整數"); string inStr = Console.ReadLine(); if (int.TryParse(inStr, out result)) Console.WriteLine("輸入的是整數:{0}", result); else MessageBox.Show("輸入的不是整數!","出錯"); Console.Read(); } }
可以用checked進行溢出校驗,也可用unchecked不進行溢出校驗,默認情況是不進行校驗。
Checked可以用checked函數和checked語句
class Program { static void Main(string[] args) { Console.WriteLine("請輸入第一個整數"); int n1 = int.Parse(Console.ReadLine()); Console.WriteLine("請輸入第二個整數"); int n2 = int.Parse(Console.ReadLine()); int mut = multiply(n1,n2); Console.Read(); } static int multiply(int x,int y) { int p=0; try { //此處也可用 p = checked(x*y); checked { p = (x * y); } Console.Write(p); } catch (Exception ex) { Console.WriteLine(ex.Message); } return p; } }
Decimal數據類型
Decimal的運算精度很高,可提供如下的算數運算方法:
相加運算 Decimal.Add(decimal d1,decimal d2);
相減運算 Decimal.Subtract(decimal d1,decimal d2);
相乘運算 Decimal.Multiply(decimal d1,decimal d2);
相除運算 Decimal.Divide(decimal d1,decimal d2);
余數運算 Decimal.Remainder(decimal d1,decimal d2)
舍入運算 Decimal.Round(decimal d);
取整運算 Decimal.Truncate(decimal d);
可提供如下的比較運算
Decimal.compare(decimal d1,decimal d2);
Decimal.equals(decimal d1,decimal d2);
Decimal.referenceEquals(decimal d1,decimal d2);
可提供如下的類型轉化運算
轉化為16位整數 Decimal.toInt16;
轉化為32位整數 Decimal.toInt32;
轉化為64位整數 Decimal.toInt64;
如果decimal數據類型所提供的方法不夠還可以使用自定義的擴展方法,如下例子所示為decimal數據類型擴展一個Power方法(求數據的次方運算):
static class DecExt { public static decimal Power(this decimal baseNum, int p) { decimal result = 1.0M; for (int i = 0; i < p; i++) { result *= baseNum; } return result; } }
class Program
{ static void Main(string[] args) { decimal base1 = 12.2M; decimal x = base1.Power(2); // 對base1的2次方運算 Console.WriteLine(x); Console.Read(); }
}
Char字符類型
Char的常用的靜態方法,用來判斷某位的字符類型
String pattern = “123abcde”;
Char.IsLetter(pattern,2);
Char.IsNumber(pattern,2);
Char.IsLower(pattern,3);
Char.IsUpper(pattern,3);
Char.IsPunctuation(pattern,3);
Char.IsLetterOrDigit(pattern,3);
(下一節介紹string數據類型)
