.NET數據類型匯總
.NET數據類型之字符串(String)
- 字符串
表示文本,即一系列 Unicode 字符。字符串是 Unicode 字符的有序集合,用于表示文本。 String 對象是 System.Char 對象的有序集合,用于表示字符串。 String 對象的值是該有序集合的內容,并且該值是不可變的(即,為只讀)。String 對象的***大小內存中的為 2 GB 或大約 10 億個字符。
- 關鍵字
string
- 值范圍
一組字符
- 解析數值
- int number = Convert .ToInt32(strNumber);
- 格式化
- 保留2位小數
- bc.FRetailPrice = String.Format("{0:N2}", Convert.ToDecimal(Math.Round(double.Parse(dgvBarcode.Rows[i].Cells["FRetailPrice"].Value.ToString()),2))).ToString();
- 常用方法
- Trim:去除字符串頭尾兩端的指定字符
- Concat:字符串拼接
- 轉義字符
- \' 單引號
- \" 雙引號
- \\ 反斜杠
- \0 空
- \a 警告
- \b 退格
- \f 換頁
- \n 換行
- \r 回車
- \t 水平制表符
- \v 垂直制表符
- 逐字字符串
字符串加@前綴
- 比較
- 比較空值
- string.IsNullOrEmpty(str1)
- s == string.Empty
- s.Length == 0
- s == ""
- 比較相等性
- 比較空值
使用==和!=操作符進行比較時,引用類型比較的是內存中的對象,但string的相等性操作符被重新定義了,比較的是字符串的值。
- 不可變性
string一旦初始化后不能改變,進行修改后得到的是新的string對象,因此string的濫用是極其的低效。
- StringBuilder
使用StringBuilder對字符串進行修改,修改的是本對象而非產生新對象。
#p#
.NET 數據類型之類(Class)
- 類
類是 C# 中功能最為強大的數據類型。像結構一樣,類也定義了數據類型的數據和行為。然后,程序員可以創建作為此類的實例的對象。與結構不同,類支持繼承,而繼承是面向對象編程的基礎部分。
- 構造函數
構造函數是在創建給定類型的對象時執行的類方法,是在運行時調用的而非編譯時,包括實例構造函數和靜態構造函數。構造函數與類名相同,且不能有返回值。
- 構造函數鏈
使用this關鍵字進行串聯構造函數調用,可以使用可選參數替代構造函數鏈,但是可選參數的語法只能在.NET4環境下運行。
- 靜態構造函數
-
析構函數(終結器)
析構函數用于析構類的實例,重新對象的Finalize()方法。 不能在結構中定義析構函數。 只能對類使用析構函數。一個類只能有一個析構函數。無法繼承或重載析構函數。無法調用析構函數。 它們是被自動調用的。析構函數既沒有修飾符,也沒有參數,是隱式保護的。
- 關鍵字
- new:創建新對象
- this:實例對象
- base:基類對象
- static:靜態
- 默認訪問修飾符
- 類:隱式內部
- 默認構造函數:隱式私有
- 對象
類的實例化,使用new關鍵字進行實例化
- 對象初始化器
對象初始化器只用少量的代碼就可以創建對象并設置一些屬性和公共字段,對象初始化時使用{},內部使用逗號分隔的指定值的列表,初始化列表中的每個成員都映射為正在初始化的對象中的公共字段或公共屬性。
- 代碼示例
- Point p = new Point{X=1,Y=2};
- Object
object 類型在 .NET Framework 中是 Object 的別名。 在 C# 的統一類型系統中,所有類型(預定義類型、用戶定義類型、引用類型和值類型)都是直接或間接從 Object 繼承的。 可以將任何類型的值賦給 object 類型的變量。
- 裝箱
將值類型的變量轉換為對象的過程稱為“裝箱”。
- 拆箱
將對象類型的變量轉換為值類型的過程稱為“拆箱”。
#p#
.NET 數據類型之指針類型(type*)
- 指針類型
在不安全的上下文中,類型可以是指針類型以及值類型或引用類型。指針類型不繼承 object,并且指針類型與 object 之間不存在轉換。此外,裝箱和取消裝箱不支持指針。但是,允許在不同指針類型之間以及指針類型與整型之間進行轉換。當在同一個聲明中聲明多個指針時,* 僅與基礎類型一起使用,而不是作為每個指針名稱的前綴。 指針不能指向引用或包含引用的結構,因為即使有指針指向對象引用,該對象引用也可能會被執行垃圾回收。GC 并不注意是否有任何類型的指針指向對象。
- 語法
- 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;}
- 指針類型聲明
示例 | 說明 |
---|---|
int* p |
p 是指向整數的指針 |
int** p |
p 是指向整數的指針的指針 |
int*[] p |
p 是指向整數的指針的一維數組 |
char* p |
p 是指向字符的指針 |
void* p |
p 是指向未知類型的指針 |
- 指針相關的運算符和語句
運算符/語句 | 用途 |
---|---|
* |
執行指針間接尋址。 |
-> |
通過指針訪問結構的成員。 |
[] |
對指針建立索引。 |
& |
獲取變量的地址。 |
++ 和 -- |
遞增或遞減指針。 |
加、減 |
執行指針算法。 |
==、!=、<、>、<= 和 >= |
比較指針。 |
stackalloc |
在堆棧上分配內存。 |
fixed 語句 |
臨時固定變量以便可以找到其地址。 |
- 指針轉換
- 隱式指針轉換
從 | 到 |
---|---|
任何指針類型 |
void* |
null |
任何指針類型 |
-
- 顯示指針轉換
從 | 到 |
---|---|
任何指針類型 |
所有其他指針類型 |
sbyte、byte、short、ushort、int、uint、long 或 ulong |
任何指針類型 |
任何指針類型 |
sbyte、byte、short、ushort、int、uint、long 或 ulong |
- 代碼示例
- 指針訪問成員
- 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 );
- }
- }
- }
- 指針訪問數組元素
- 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 數據類型之動態類型(Dynamic)
- Dynamic
- 代碼示例
-
- 在聲明中,作為屬性、字段、索引器、參數、返回值或類型約束的類型。 下面的類定義在幾個不同的聲明中使用 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;
- }
- }
- }
在顯式類型轉換中,作為轉換的目標類型。
- 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);
- }
在以類型充當值(如 is 運算符或 as 運算符右側)或者作為 typeof 的參數成為構造類型的一部分的任何上下文中。 例如,可以在下列表達式中使用 dynamic。
- int i = 8; dynamic d; d = i as dynamic; Console.WriteLine(typeof(List<dynamic>));
#p#
.NET 數據類型之匿名類型(var)
- 匿名類型
匿名類型提供了一種方便的方法,可用來將一組只讀屬性封裝到單個對象中,而無需首先顯式定義一個類型。 類型名由編譯器生成,并且不能在源代碼級使用。 每個屬性的類型由編譯器推斷。
可通過使用 new 運算符和對象初始值創建匿名類型。
- 限制條件
- 沒有控制匿名類型的名字
- 匿名類型繼承自Object
- 匿名類型的字段和屬性總是只讀的
- 匿名類型不支持事件、自定義方法、自定義操作符和自定義重寫
- 匿名類型是隱式封閉的
- 匿名類型的實例創建只使用默認構造函數
- 語法
- 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);
- }