C#學習基礎------數據類型
C#的數據類型分為兩大類:值類型和引用類型.
一,值類型
值類型又分為以下三大類:簡單類型(Simple types)和結構類型(Struct types)和枚舉類型(Enumeration types)
1.簡單類型也稱為純量類型,是直接由一系列遠素構成的數據類型.從計計算機的表示角度來看這些簡單類型可以分為整數類型,布爾類型,字符類型,和實數類型.
1.1整數類型的變量的值為整數,共有以下九种:
數據類型 特征 取值大小
sbyte 有符號8位整數 -128到127
byte 無符號8位整數 0到255
short 有符號16位整數 -32768到32767
ushort 無符號16位整數 0到65535
int 有符號32位整數 -2147483648到2147483647
uint 無符號32位整數 0到4294967295
long 有符號64位整數 -9223372036854775808到9223372036854775807
ulong 無符號64位整數 0到18446744073709551615
位數是按2的指數冪來定議的,如sbyte占一個字節即2的8次方.
1.2布爾類型
即真和假,分別用true和false來表示.C#中不像其它語言可以轉換成真假,這里是不合法的.
1.3實數類型
實數類型分為單精度(float)和雙精度(double)和十進制類型(decimal)三种類型.
單精度表示的大小為1.5*10的負45次方到3.4*10的38次方,精度為7位數
雙精度表示的大小為5.0*10的負324次方到1.7*10的308次方,精度為15到16位.
十進制類型是一种高精度的128位數據類型,表的的大小為1.0*10的負28次方到7.9*10的28次方的28至29位有效數字.定議的時候要用m下標以表明它是一個十進制類型.如:
decimal d_value=1.0m;如果沒有m會當是雙精度處理.
1.4字符類型
采用的是unicode字符集一個unicode的標準長度為16位.
以下以些轉議字符
"' 單引號
"" 雙引號
"" 反斜槓
"O 空字符
"a 感嘆號(Alert)
"b 退格
"f 換頁
"n 新行
"r 回車
"t 水平tab
"v 垂直tab
2.結構類型
把一個單一實體的類型就叫做結構類型,每一個變量稱為結構的成員.結構類型的變量采用struct來進行聲明.如下面我們定議的通訊錄記錄結構
struct PhoneBook
{
public string name;
public string phone;
public string address;
}
PhoneBook p1;
ph.name="athrun"; 對成員的訪員
下面是把一個結構類型作為另一個結構類型的成員類型.如下:
struct PhoneBook
{
public string name;
public string phone;
public uint age;
public struct address
{
public string city;
public string street;
public uint no;
}
}
通訊錄這個結構中又包括了"地址"這個結構,結構"地址"類型包括城市,街道,門牌號碼三個成員.
3.枚舉類型
枚舉(enum)實際上是為一組在邏輯上密不可分的整數值提供便於記憶的符號,比如我們聲明一個代表星期的枚舉類型的變量;
enum WeekDay
{
Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday
};
WeekDay day;
為枚舉類型的元素所給的值類型限於long,int,short,byte等整數類型.
二,引用類型
"引用"這個詞在這里的含議是,該類型的變量不直接存儲所包含的值,而是指向它所要存儲的值.也就是說,引用類型存儲實際數據的引用值的地址,引用類型有四种:
類,代表,數組,接口.
1,類是一种包含數據成員,函數成員和嵌套類型的數據結構.類的數據成員有常量,域和事件.函數成員包括方法,屬性,索引指示器,運算符,構造函數和析構函數.類和結構同樣都包含了自己的成員,但它們之間最主要的區別在於:類是引用類型,而結構是值類型.
類支持繼承機制,通過繼承,子類可以擴展父類的數據成員和函數方法,進而達到代碼重用和設計重用的目的.下面是一個類:
class PhoneBook
{
private string _name;
private string _phone;
private struct _address
{
public string city;
public string street;
public uint no;
}
public string Phone
{
get {return _phone;}
set {_phone=value;}
}
public PhoneBook(string n)
{
name=n;
}
public Edit(){;}
}
上面這個類中包括有數據成員有域name,phone,address屬性Phone;類的函數成員有構造函數PhoneBook(string n),方法Edit.
2.代表(delegate).它實際上相當於c#中的函數指針原型.與指針不同的是,代表在c#是類型安全的.在聲明代表時,只需要指定代表指向的原型的類型,它不能有返回值,也不能帶有輸出類型的參數.
using System;
delegate int MyDelegate(); //聲明一個代表
public class MyClass
{
public int InstanceMethod()
{
Console.WriteLine("Call the instance method");
return 0;
}
static public int StaticMethod()
{
Console.WriteLine("Call the static method");
return 0;
}
}
public class Test
{
static public void Main()
{
MyClass p=new MyClass();
//將代表指向非靜態的方法InstanceMethod
MyDelegate d=new MyDelegate(p.InstanceMethod);
//調用非靜態方法
d();
//將代表指向靜態的方法StaticMethod
d=new MyDelegate(MyClass.StaticMethod);
//調用靜態方法
d();
}
}
程序的輸出結果是:
call the instance method
call the static method
3.數組
數組是一組類型相同的有序數據.
class Test
{
static void Main()
{
string [] a1; //一維string數組
string [,] a2; //二維
string [,,] a3; //三維
string [][] j2; //可變數組(數組)
string [][][][] j3; //多維可變數組
}
}
三,裝箱(boxing)和拆箱(unboxing)
裝箱和拆箱機制使得在c#類型系統中,任何值類型,引用類型和object(對像)類型之間進行轉換,我們稱這种轉為綁定連接.簡單的說,有了裝箱和拆箱後,對任何類型的值來說最終我們都可以看作是object類型.
1,裝箱轉換是將一個值類型隱式地轉換成一個object類型,或者把這個值類型轉換成一個被該值類型應用的接口類型(interface-type).把一個值類型的值裝箱,也就是創建一個object實例並將這個值復制給這個object.
我們也可以用顯式的方法來進行裝箱操作:
Int i=10;
Object obj=object(i);
我們看一下下面的程序
Using system;
Class test
{
Public static void Main()
{
Int i=10;
Object obj=I; //進行裝箱操作,對像類型
If (obj is int)
{
Console.Write(“The value of I is boxing!”);
}
I=20; //改變i的值
Console.WriteLine(“int :i={0}”,i);
Console.WriteLine(“object: obj={0}”,obj);
}
}
輸出結果為:
The value of I is boxing!
Int :i=20;
Object obj=10;
這說明了被裝箱的類型的值是作為一個拷貝賦給對像的.
2,拆箱轉換,和裝箱轉換正好相反,拆箱轉換是指將一個對像類型顯式地轉換成一個值類型,或是將一個接口類型顯式地轉換成一個執行該接口的值類型.
拆箱的過程分為兩步:首先,檢查這個對像實例,看它是否為給定的值類型的裝箱值.然後,把這個實例的值拷貝給值類型的變量.
下面是一個對像拆箱的過程:
int i=10;
Object obj=I;
int j=(int)obj;
這個過程用圖來表示如下:
可以看出拆箱剛好是裝箱過程的逆過程.必須注意,裝箱轉換和拆箱轉換必須是類型兼容
申明
非源创博文中的内容均收集自网上,若有侵权之处,请及时联络,我会在第一时间内删除.再次说声抱歉!!!
博文欢迎转载,但请给出原文连接。