.NET數(shù)據(jù)類型匯總
.NET數(shù)據(jù)類型之字符串(String)
- 字符串
表示文本,即一系列 Unicode 字符。字符串是 Unicode 字符的有序集合,用于表示文本。 String 對(duì)象是 System.Char 對(duì)象的有序集合,用于表示字符串。 String 對(duì)象的值是該有序集合的內(nèi)容,并且該值是不可變的(即,為只讀)。String 對(duì)象的***大小內(nèi)存中的為 2 GB 或大約 10 億個(gè)字符。
- 關(guān)鍵字
string
- 值范圍
一組字符
- 解析數(shù)值
- int number = Convert .ToInt32(strNumber);
- 格式化
- 保留2位小數(shù)
- bc.FRetailPrice = String.Format("{0:N2}", Convert.ToDecimal(Math.Round(double.Parse(dgvBarcode.Rows[i].Cells["FRetailPrice"].Value.ToString()),2))).ToString();
- 常用方法
- Trim:去除字符串頭尾兩端的指定字符
- Concat:字符串拼接
- 轉(zhuǎn)義字符
- \' 單引號(hào)
- \" 雙引號(hào)
- \\ 反斜杠
- \0 空
- \a 警告
- \b 退格
- \f 換頁(yè)
- \n 換行
- \r 回車
- \t 水平制表符
- \v 垂直制表符
- 逐字字符串
字符串加@前綴
- 比較
- 比較空值
- string.IsNullOrEmpty(str1)
- s == string.Empty
- s.Length == 0
- s == ""
- 比較相等性
- 比較空值
使用==和!=操作符進(jìn)行比較時(shí),引用類型比較的是內(nèi)存中的對(duì)象,但string的相等性操作符被重新定義了,比較的是字符串的值。
- 不可變性
string一旦初始化后不能改變,進(jìn)行修改后得到的是新的string對(duì)象,因此string的濫用是極其的低效。
- StringBuilder
使用StringBuilder對(duì)字符串進(jìn)行修改,修改的是本對(duì)象而非產(chǎn)生新對(duì)象。
#p#
.NET 數(shù)據(jù)類型之類(Class)
- 類
類是 C# 中功能最為強(qiáng)大的數(shù)據(jù)類型。像結(jié)構(gòu)一樣,類也定義了數(shù)據(jù)類型的數(shù)據(jù)和行為。然后,程序員可以創(chuàng)建作為此類的實(shí)例的對(duì)象。與結(jié)構(gòu)不同,類支持繼承,而繼承是面向?qū)ο缶幊痰幕A(chǔ)部分。
- 構(gòu)造函數(shù)
構(gòu)造函數(shù)是在創(chuàng)建給定類型的對(duì)象時(shí)執(zhí)行的類方法,是在運(yùn)行時(shí)調(diào)用的而非編譯時(shí),包括實(shí)例構(gòu)造函數(shù)和靜態(tài)構(gòu)造函數(shù)。構(gòu)造函數(shù)與類名相同,且不能有返回值。
- 構(gòu)造函數(shù)鏈
使用this關(guān)鍵字進(jìn)行串聯(lián)構(gòu)造函數(shù)調(diào)用,可以使用可選參數(shù)替代構(gòu)造函數(shù)鏈,但是可選參數(shù)的語(yǔ)法只能在.NET4環(huán)境下運(yùn)行。
- 靜態(tài)構(gòu)造函數(shù)
-
析構(gòu)函數(shù)(終結(jié)器)
析構(gòu)函數(shù)用于析構(gòu)類的實(shí)例,重新對(duì)象的Finalize()方法。 不能在結(jié)構(gòu)中定義析構(gòu)函數(shù)。 只能對(duì)類使用析構(gòu)函數(shù)。一個(gè)類只能有一個(gè)析構(gòu)函數(shù)。無(wú)法繼承或重載析構(gòu)函數(shù)。無(wú)法調(diào)用析構(gòu)函數(shù)。 它們是被自動(dòng)調(diào)用的。析構(gòu)函數(shù)既沒(méi)有修飾符,也沒(méi)有參數(shù),是隱式保護(hù)的。
- 關(guān)鍵字
- new:創(chuàng)建新對(duì)象
- this:實(shí)例對(duì)象
- base:基類對(duì)象
- static:靜態(tài)
- 默認(rèn)訪問(wèn)修飾符
- 類:隱式內(nèi)部
- 默認(rèn)構(gòu)造函數(shù):隱式私有
- 對(duì)象
類的實(shí)例化,使用new關(guān)鍵字進(jìn)行實(shí)例化
- 對(duì)象初始化器
對(duì)象初始化器只用少量的代碼就可以創(chuàng)建對(duì)象并設(shè)置一些屬性和公共字段,對(duì)象初始化時(shí)使用{},內(nèi)部使用逗號(hào)分隔的指定值的列表,初始化列表中的每個(gè)成員都映射為正在初始化的對(duì)象中的公共字段或公共屬性。
- 代碼示例
- Point p = new Point{X=1,Y=2};
- Object
object 類型在 .NET Framework 中是 Object 的別名。 在 C# 的統(tǒng)一類型系統(tǒng)中,所有類型(預(yù)定義類型、用戶定義類型、引用類型和值類型)都是直接或間接從 Object 繼承的。 可以將任何類型的值賦給 object 類型的變量。
- 裝箱
將值類型的變量轉(zhuǎn)換為對(duì)象的過(guò)程稱為“裝箱”。
- 拆箱
將對(duì)象類型的變量轉(zhuǎn)換為值類型的過(guò)程稱為“拆箱”。
#p#
.NET 數(shù)據(jù)類型之指針類型(type*)
- 指針類型
在不安全的上下文中,類型可以是指針類型以及值類型或引用類型。指針類型不繼承 object,并且指針類型與 object 之間不存在轉(zhuǎn)換。此外,裝箱和取消裝箱不支持指針。但是,允許在不同指針類型之間以及指針類型與整型之間進(jìn)行轉(zhuǎn)換。當(dāng)在同一個(gè)聲明中聲明多個(gè)指針時(shí),* 僅與基礎(chǔ)類型一起使用,而不是作為每個(gè)指針名稱的前綴。 指針不能指向引用或包含引用的結(jié)構(gòu),因?yàn)榧词褂兄羔樦赶驅(qū)ο笠茫搶?duì)象引用也可能會(huì)被執(zhí)行垃圾回收。GC 并不注意是否有任何類型的指針指向?qū)ο蟆?/span>
- 語(yǔ)法
- type* identifier;void* identifier;
- int* p1, p2, p3;
- int number;int* p = &number;
- char* charPointer = stackalloc char[123];for (int i = 65; i < 123; i++){charPointer[i] = (char)i;}
- 指針類型聲明
示例 | 說(shuō)明 |
---|---|
int* p |
p 是指向整數(shù)的指針 |
int** p |
p 是指向整數(shù)的指針的指針 |
int*[] p |
p 是指向整數(shù)的指針的一維數(shù)組 |
char* p |
p 是指向字符的指針 |
void* p |
p 是指向未知類型的指針 |
- 指針相關(guān)的運(yùn)算符和語(yǔ)句
運(yùn)算符/語(yǔ)句 | 用途 |
---|---|
* |
執(zhí)行指針間接尋址。 |
-> |
通過(guò)指針訪問(wèn)結(jié)構(gòu)的成員。 |
[] |
對(duì)指針建立索引。 |
& |
獲取變量的地址。 |
++ 和 -- |
遞增或遞減指針。 |
加、減 |
執(zhí)行指針?biāo)惴ā?/span> |
==、!=、<、>、<= 和 >= |
比較指針。 |
stackalloc |
在堆棧上分配內(nèi)存。 |
fixed 語(yǔ)句 |
臨時(shí)固定變量以便可以找到其地址。 |
- 指針轉(zhuǎn)換
- 隱式指針轉(zhuǎn)換
從 | 到 |
---|---|
任何指針類型 |
void* |
null |
任何指針類型 |
-
- 顯示指針轉(zhuǎn)換
從 | 到 |
---|---|
任何指針類型 |
所有其他指針類型 |
sbyte、byte、short、ushort、int、uint、long 或 ulong |
任何指針類型 |
任何指針類型 |
sbyte、byte、short、ushort、int、uint、long 或 ulong |
- 代碼示例
- 指針訪問(wèn)成員
- truct CoOrds{
- public int x;
- public int y;
- }
- class AccessMembers
- {
- static void Main()
- {
- CoOrds home;
- unsafe
- {
- CoOrds* p = &home;
- p->x = 25;
- p->y = 12;
- System.Console.WriteLine("The coordinates are: x={0}, y={1}", p->x, p->y );
- }
- }
- }
- 指針訪問(wèn)數(shù)組元素
- class Pointers
- {
- unsafe static void Main()
- {
- char* charPointer = stackalloc char[123];
- for (int i = 65; i < 123; i++)
- {
- charPointer[i] = (char)i;
- }
- System.Console.WriteLine("Uppercase letters:");
- for (int i = 65; i < 91; i++)
- {
- System.Console.Write(charPointer[i]);
- }
- System.Console.WriteLine();
- System.Console.WriteLine("Lowercase letters:");
- for (int i = 97; i < 123; i++)
- {
- System.Console.Write(charPointer[i]);
- }
- }
- }
- class TestCopy
- {
- static unsafe void Copy(byte[] src, int srcIndex, byte[] dst, int dstIndex, int count)
- {
- if (src == null || srcIndex < 0 ||
- dst == null || dstIndex < 0 || count < 0)
- {
- throw new System.ArgumentException();
- }
- int srcsrcLen = src.Length;
- int dstdstLen = dst.Length;
- if (srcLen - srcIndex < count || dstLen - dstIndex < count)
- {
- throw new System.ArgumentException();
- }
- fixed (byte* pSrc = src, pDst = dst)
- {
- byte* ps = pSrc;
- byte* pd = pDst;
- for (int i = 0 ; i < count / 4 ; i++)
- {
- *((int*)pd) = *((int*)ps);
- pd += 4;
- ps += 4;
- }
- for (int i = 0; i < count % 4 ; i++)
- {
- *pd = *ps;
- pd++;
- ps++;
- }
- }
- }
- static void Main()
- {
- byte[] a = new byte[100];
- byte[] b = new byte[100];
- for (int i = 0; i < 100; ++i)
- {
- a[i] = (byte)i;
- }
- Copy(a, 0, b, 0, 100);
- System.Console.WriteLine("The first 10 elements are:");
- for (int i = 0; i < 10; ++i)
- {
- System.Console.Write(b[i] + " ");
- }
- System.Console.WriteLine("\n");
- }
- }
#p#
.NET 數(shù)據(jù)類型之動(dòng)態(tài)類型(Dynamic)
- Dynamic
- 代碼示例
-
- 在聲明中,作為屬性、字段、索引器、參數(shù)、返回值或類型約束的類型。 下面的類定義在幾個(gè)不同的聲明中使用 dynamic。
- class ExampleClass
- {
- static dynamic field;
- dynamic prop { get; set; }
- public dynamic exampleMethod(dynamic d)
- {
- dynamic local = "Local variable";
- int two = 2;
- if (d is int)
- {
- return local;
- }
- else
- {
- return two;
- }
- }
- }
在顯式類型轉(zhuǎn)換中,作為轉(zhuǎn)換的目標(biāo)類型。
- static void convertToDynamic()
- {
- dynamic d;
- int i = 20;
- d = (dynamic)i;
- Console.WriteLine(d);
- string s = "Example string.";
- d = (dynamic)s;
- Console.WriteLine(d);
- DateTime dt = DateTime.Today;
- d = (dynamic)dt;
- Console.WriteLine(d);
- }
在以類型充當(dāng)值(如 is 運(yùn)算符或 as 運(yùn)算符右側(cè))或者作為 typeof 的參數(shù)成為構(gòu)造類型的一部分的任何上下文中。 例如,可以在下列表達(dá)式中使用 dynamic。
- int i = 8; dynamic d; d = i as dynamic; Console.WriteLine(typeof(List<dynamic>));
#p#
.NET 數(shù)據(jù)類型之匿名類型(var)
- 匿名類型
匿名類型提供了一種方便的方法,可用來(lái)將一組只讀屬性封裝到單個(gè)對(duì)象中,而無(wú)需首先顯式定義一個(gè)類型。 類型名由編譯器生成,并且不能在源代碼級(jí)使用。 每個(gè)屬性的類型由編譯器推斷。
可通過(guò)使用 new 運(yùn)算符和對(duì)象初始值創(chuàng)建匿名類型。
- 限制條件
- 沒(méi)有控制匿名類型的名字
- 匿名類型繼承自O(shè)bject
- 匿名類型的字段和屬性總是只讀的
- 匿名類型不支持事件、自定義方法、自定義操作符和自定義重寫
- 匿名類型是隱式封閉的
- 匿名類型的實(shí)例創(chuàng)建只使用默認(rèn)構(gòu)造函數(shù)
- 語(yǔ)法
- var v = new { Amount = 108, Message = "Hello" };
- var anonArray = new[] { new { name = "apple", diam = 4 }, new { name = "grape", diam = 1 }};
- var productQuery =
- from prod in products
- select new { prod.Color, prod.Price };
- foreach (var v in productQuery)
- {
- Console.WriteLine("Color={0}, Price={1}", v.Color, v.Price);
- }