關(guān)于C#的測(cè)試斷言詳解
委托:http://www.cnblogs.com/liuhaorain/p/3911845.html
sbyte(8位)
sbyte表示一種整數(shù)類(lèi)型系吭,可以表示大小和存儲(chǔ)范圍夺溢。
從sbyte轉(zhuǎn)換為short昭抒,int呼奢,long墓贿,double祥款,float较锡,decimal都是隱式轉(zhuǎn)換完残。
不能將一個(gè)存儲(chǔ)大小更大的非文本數(shù)字類(lèi)型轉(zhuǎn)換給sbyte伏钠。
前綴0x或者0X表示十六進(jìn)制文本, 0b或者0B表示二進(jìn)制文本谨设,十進(jìn)制沒(méi)有前綴.
decimal類(lèi)型用來(lái)表示高精度的浮點(diǎn)數(shù), 可用1M來(lái)表示熟掂。
varible.GetType() ,typeof(varible)
int n =9;
n.GetType() 等價(jià)于 typeof(n) , 獲取n的數(shù)類(lèi)型
ReferenceEquals() 比較兩個(gè)數(shù)值型的值
using System;
public class Example
{
public static void Main()
{
int n1 = 12;
int n2 = 82;
long n3 = 12;
Console.WriteLine("n1 and n2 are the same type: {0}",
Object.ReferenceEquals(n1.GetType(), n2.GetType()));
Console.WriteLine("n1 and n3 are the same type: {0}",
Object.ReferenceEquals(n1.GetType(), n3.GetType()));
}
}
// The example displays the following output:
// n1 and n2 are the same type: True
// n1 and n3 are the same type: False
值類(lèi)型和 引用類(lèi)型
值類(lèi)型: 值類(lèi)型的變量中存儲(chǔ)的實(shí)際數(shù)據(jù)扎拣,賦值時(shí)是編譯器把數(shù)據(jù)復(fù)制一份赴肚,然后賦給另一個(gè)變量
引用類(lèi)型:引用類(lèi)型變量中存儲(chǔ)的是指向?qū)嶋H數(shù)據(jù)的引用(真是數(shù)據(jù)的內(nèi)存地址),在賦值操作時(shí),和值類(lèi)型一樣,也要進(jìn)行復(fù)制的操作捧挺,不過(guò)它復(fù)制的不是實(shí)際數(shù)據(jù)堰怨,而是引用(真實(shí)數(shù)據(jù)的內(nèi)存地址),所以引用類(lèi)型在賦值操作時(shí)姨拥,賦值給另一個(gè)變量的是內(nèi)存地址,這樣兩個(gè)變量中保存的是同一引用亮瓷,它們的指向完全一樣琴锭。
例子2:
class MyClass
{
public int val;
}
struct MyStruct
{ public int val; }
class Program
{
static void Main(string[] args)
{
MyClass objectA=new MyClass();
MyClass objectB=objectA; //引用變量的賦值 賦值操作完成后晰甚,兩個(gè)變量都指向同一內(nèi)存地址
objectA.val=10; //給objectA.val賦值=10 由于objectB和objectA指向同一內(nèi)存地址,所以ojbectB.val的值也為10
objectB.val=20; //給objectB.val賦值=20 由于objectB和objectA指向同一內(nèi)存地址决帖,所以objectA.val的值也為20
MyStruct structA=new MyStruct();
MyStruct structB=structA; //結(jié)構(gòu)是值類(lèi)型 賦值操作完成后厕九,兩個(gè)結(jié)構(gòu)中的結(jié)構(gòu)信息一致。注意是“結(jié)構(gòu)中的信息”一致地回。
structA.val=30;
structB.val=40;
Console.WriteLine(objectA.val); //輸出結(jié)果是20
Console.WriteLine(objectB.val); //輸出結(jié)果是20
Console.WriteLine(structA.val); //輸出結(jié)果是30
Console.WriteLine(structB.val); //輸出結(jié)果是40
Console.ReadLine();
}
}
總結(jié):
- 值類(lèi)型的變量賦值扁远,只是數(shù)據(jù)之間的復(fù)制
- 引用類(lèi)型賦值操作,復(fù)制的引用刻像,即內(nèi)存地址畅买,引用類(lèi)型賦值后 ,二者指向同一個(gè)內(nèi)存地址细睡。如果改變其中一個(gè)引用類(lèi)型變量的值谷羞,另一個(gè)也會(huì)跟著變。
*另一種不同于上面的引用類(lèi)型,String, 它的特點(diǎn)就是在賦值的時(shí)候或者字符串相加操作時(shí)溜徙,它會(huì)在內(nèi)存中開(kāi)辟一個(gè)新的內(nèi)存空間來(lái)存儲(chǔ)操作后的字符串. *
using System;
class Test
{
public static void Main()
{
string s1 = "hello";
string s2 = s1;
Console.WriteLine(s1);
Console.WriteLine(s2);
s1 = "world";
Console.WriteLine(s1);
Console.WriteLine(s2);
}
}
/*
hello
hello
world
hello
*/
解釋:
(1) s1 = "hello", 執(zhí)行的是在堆中創(chuàng)建了一個(gè)String類(lèi)型的對(duì)象湃缎,然后將這個(gè)對(duì)象的地址賦值給s1.
(2) s2 = s1, 執(zhí)行的是將"hello"對(duì)象的地址賦值給s2,此時(shí)s2和s1是指向的同一個(gè)地址;
(3) s1 = "world". 這里編譯器將會(huì)在內(nèi)存中重新創(chuàng)建一個(gè)String類(lèi)型的對(duì)象蠢壹,然后將其地址賦值給s1嗓违,此時(shí)s1將指向新的地址,不再和s2指向相同的地址图贸。所以這里給s1賦值實(shí)際上并不會(huì)改變"Hello"這個(gè)對(duì)象蹂季,也就是不會(huì)改變s2所指向的地址的內(nèi)容,它改變s1指向的地址(重新分配一個(gè)新的地址)求妹,而不是它原來(lái)指向的對(duì)象的內(nèi)容乏盐。
強(qiáng)制類(lèi)型轉(zhuǎn)換
隱式類(lèi)型轉(zhuǎn)換: int (32位,4個(gè)字節(jié)(byte)) 轉(zhuǎn)換到-------> long (64位)制恍,float(4byte父能,32位),double(64)净神,decimal(128何吝,有效位數(shù)很大,但是表示的范圍比f(wàn)loat和double都小) 鹃唯。
a. 顯式類(lèi)型轉(zhuǎn)換:(int)variable.
- 從long到int的轉(zhuǎn)換爱榕,必須顯式,否則會(huì)產(chǎn)生編譯錯(cuò)誤坡慌。
- 該方式對(duì)于float的轉(zhuǎn)換黔酥,會(huì)失去精度。
- 可以用于object ---> int, 前提是:object的值要被賦予int類(lèi)型的值跪者,否則會(huì)產(chǎn)生編譯錯(cuò)誤棵帽。
注意: 不能用于char 類(lèi)型到int類(lèi)型的轉(zhuǎn)換,轉(zhuǎn)后的值會(huì)變成ASCII代碼渣玲,而不是你想要
b. int.Parse(string 類(lèi)型的變量)
表示把內(nèi)容是數(shù)字的字符串轉(zhuǎn)化為int
該方法只能處理字符串內(nèi)容逗概,而且字符串的內(nèi)容只能在int類(lèi)型可表示的范圍之內(nèi)。
- 如果字符串的內(nèi)容為null時(shí)忘衍,則拋出ArgumentNullException異常逾苫。
- 如果字符串的內(nèi)容不是數(shù)字,則拋出FormatException異常枚钓。
- 如果字符串內(nèi)容所表示的數(shù)字超出int類(lèi)型可表示的范圍铅搓,則拋出overflowException異常。
c. int.TryParse( string s, out int result)
該方式也是將數(shù)字內(nèi)容的字符串轉(zhuǎn)化為int類(lèi)型秘噪,但是比int.Parse更優(yōu)越狸吞,它不會(huì)拋出異常勉耀。如果轉(zhuǎn)換成功指煎,則返回true,轉(zhuǎn)換失敗返回false便斥。很明顯至壤,最后一個(gè)值作為輸出值,如果轉(zhuǎn)換失敗枢纠,輸出值為0像街;如果轉(zhuǎn)換成功,則輸出相應(yīng)的值晋渺。
注意: 不能用于char 類(lèi)型到int類(lèi)型的轉(zhuǎn)換镰绎,轉(zhuǎn)后的值會(huì)變成ASCII代碼,而不是你想要的木西。
匿名類(lèi)型
定義匿名類(lèi)型
定義一個(gè)匿名類(lèi)型時(shí)畴栖,需要用到 var 關(guān)鍵字和對(duì)象初始化語(yǔ)法。
var : 編譯器會(huì)在編譯時(shí)自動(dòng)生成新類(lèi)定義(我們無(wú)法在C#代碼中看到類(lèi)的名稱(chēng))八千。
初始化:它將告訴編譯器為新創(chuàng)建的類(lèi)型創(chuàng)建私有的后臺(tái)字段和(只讀的)屬性吗讶。
var annonymousTypeInstance = new
{
FirstName = "Bill",
LastName = "Gates"
};
annonymousTypeInstance;.FirstName ; // "Bill";
annonymousTypeInstance.LastName ; // "Gates";
匿名類(lèi)型本身有許多限制:
- 你并沒(méi)有控制匿名類(lèi)型的名稱(chēng)
- 匿名類(lèi)型繼承System.Object
- 匿名類(lèi)型的字段和屬性總是只讀的
- 匿名類(lèi)型不支持事件,自定義方法恋捆,自定義操作符和自定義重寫(xiě)
- 匿名類(lèi)型是隱式封閉的(implicit sealed)
- 匿名類(lèi)型的實(shí)體創(chuàng)建只使用默認(rèn)構(gòu)造函數(shù)
如果照皆,我們需要快速定義一個(gè)實(shí)體的形狀,而不需要定義其功能時(shí)沸停,可以使用匿名類(lèi)型膜毁。
as
用作類(lèi)型轉(zhuǎn)換,轉(zhuǎn)換不成功時(shí),返回null瘟滨。
AppendLine()
每次在新的一行添加目標(biāo)內(nèi)容葬凳,并在末尾加上\r\n
反射 ,及其類(lèi)Type
DateTime
它是的定義struct類(lèi)型室奏,所以它是值類(lèi)型火焰。
ValueType值類(lèi)型
所有的值類(lèi)型都是繼承至System.ValueType
internal
修飾符,限定的是只是在同一程序集中可訪問(wèn)胧沫。
修飾符 Nullable
C#中不允許把null賦值給一個(gè)值類(lèi)型的數(shù)據(jù)昌简,但是利用Nullable修飾符可可以申明一個(gè)可空值類(lèi)型,可空值類(lèi)型和普通值類(lèi)型是一樣的绒怨,區(qū)別就是可以將一個(gè)null賦值給它纯赎。
Nullable<int> nullableInt = null;
int? nullableInt = null;//int 后面加?表示可空值類(lèi)型南蹂, 是一種特殊的值類(lèi)型犬金,它的值可以為空。
//用于給變量賦初值的時(shí)候六剥,給變量(int類(lèi)型)賦值為null晚顷,而不是0.
int ?? ://用于判斷并賦值,先判斷當(dāng)前變量是不是null疗疟,如果是就可以賦新值该默,否則跳過(guò)
可空類(lèi)型Nullable有兩個(gè)只讀屬性:
- HasValue , 屬于bool類(lèi)型策彤,只要變量包含非空值栓袖,它的值就是true。
- Value , 如果HasValue為true,則說(shuō)明Value包含有意義的值店诗,那么該變量訪問(wèn)Value屬性時(shí)裹刮,就會(huì)返回變量的值;如果HasValue為false庞瘸, 則訪問(wèn)Value屬性將引發(fā)
InvaildOperationException
捧弃。
yield return
一般情況下,yeild return 會(huì)出現(xiàn)在循環(huán)遍歷中恕洲,不適用yeild return時(shí)塔橡,代碼的執(zhí)行過(guò)程是 ,將結(jié)果集全部加載到內(nèi)存中再遍歷霜第。
使用yeild return葛家,代碼的執(zhí)行過(guò)程是,每調(diào)用一個(gè)yelid return 所在的循環(huán)時(shí)泌类,yelid return 就返回一個(gè)值回來(lái)癞谒,是“按需供給“底燎。
yeild return 能保證每次循環(huán)遍歷的時(shí)候都從前一次停止的地方開(kāi)始,因?yàn)榫幾g器會(huì)生成一個(gè)狀態(tài)機(jī)來(lái)保證迭代器的狀態(tài)弹砚。
一個(gè)循環(huán)遍歷中可以有多個(gè) yelid return 双仍,來(lái)一次性返回多個(gè)值。
一旦執(zhí)行 yelid break桌吃, 后面的代碼將不會(huì)再執(zhí)行朱沃。
SortedSet<T> 是一個(gè)排序的無(wú)重復(fù)數(shù)據(jù)的集合。
GetEnumerator()
獲取枚舉數(shù)茅诱。
枚舉數(shù)定位在集合中第一個(gè)元素前逗物,在此位置上,Current屬于未定義瑟俭,故在讀取current之前翎卓,必須調(diào)用MoveNext() 將枚舉數(shù)向前定位到集合的第一個(gè)元素,即MoveNext()
將Current設(shè)置為下一個(gè)元素摆寄。
如果MoveNext(0越過(guò)集合的末尾失暴,則枚舉數(shù)將被定位到該集合中最后一個(gè)元素的后面,則MoveNext()將返回false微饥。
int[] MyArray = { 10, 11, 12, 13 }; //創(chuàng)建數(shù)組
IEnumerator ie = MyArray.GetEnumerator(); //獲取枚舉數(shù)
while (ie.MoveNext()) //移到下一項(xiàng)
Console.WriteLine((int)ie.Current); //獲取當(dāng)前項(xiàng)并輸入
枚舉數(shù)的初始位置是-1,所以要想獲取第一個(gè)元素就必須執(zhí)行MoveNext()方法.
上面的代碼就是調(diào)用枚舉數(shù)的Current和MoveNext成員函數(shù)手工地遍歷數(shù)組中的元素.
using語(yǔ)句
定義一個(gè)范圍逗扒,在范圍結(jié)束時(shí)處理對(duì)象。
使用場(chǎng)景畜号,在某個(gè)代碼段中使用了類(lèi)的實(shí)例缴阎,這個(gè)代碼段結(jié)束時(shí)自動(dòng)執(zhí)行這個(gè)類(lèi)實(shí)例的Dispose方法。
using (Class1 cls1 = new Class1(), cls2 = new Class1())
{
// the code using cls1, cls2
} // call the Dispose on cls1 and cls2
ReferenceEquals()
比較兩個(gè)對(duì)象的引用是否相等简软,即是指向統(tǒng)一內(nèi)存地址。
OrderBy()
實(shí)現(xiàn)List 升序降序述暂。
var sequence = new[] {4, 2, 1, 3, 5};
List<Student> items = sequence.OrderBy(u => u.Name).ToList();//order by name asc
List<Student> items = sequence.OrderByDescending(u => u.Name).ToList();//order by name desc
Any()
判斷序列中的任何元素是否都滿(mǎn)足條件痹升,返回bool 值。
var sequence = new[] { 1, 2, 3, 4, 5 };
bool sequenceNotEmpty = sequence.Any();
//true, 判斷集合是否為空
//從Any和Count的差別說(shuō)起.Any() 使用IEnumerator.GetEnumerator() 和 MoveNext() 來(lái)判斷是否集合為空畦韭,而Count()則是返回整個(gè)集合的元素個(gè)數(shù)
bool modThreeNotEmpty = sequence.Any(item => item % 3 == 0);
//true, 是否有一個(gè)一個(gè)元素滿(mǎn)足此條件
Where()
按條件篩選序列中的元素疼蛾,返回滿(mǎn)足條件的元素。
string[] sequence =
{
"a", "quick", "brown", "fox", "jumps", "over", "a", "lazy", "dog"
};
IEnumerable<string> filteredResult = sequence.Where(item => item.Length == 5);
//子句用在查詢(xún)表達(dá)式中艺配,用于指定將在查詢(xún)表達(dá)式中返回?cái)?shù)據(jù)源中的哪些元素 ,用作篩選
C#中過(guò)濾使用 Where() 擴(kuò)展
int[] data = { 46, 74, 20, 37, 98, 93, 98, 48, 33, 15 };
int[] result = data.Where(n => n % 3 == 0).ToArray();
注意:Where() 的結(jié)果即不是數(shù)組也不是 List察郁,需要通過(guò) ToArray() 生成數(shù)組,或者通過(guò) ToList() 生成列表转唉。Linq 要在 ToArray() 或者 ToList() 或者其它某些操作的時(shí)候才會(huì)真正遍歷皮钠,依次執(zhí)行 Where() 參數(shù)提供的那個(gè)篩選函數(shù)。
Select()
var sequence = new[]
{
new Name("Edogawa", "Conan"),
new Name("Ogiso", "Setsuna"),
new Name("Kirigaya", "Katsuto")
};
IEnumerable<string> projection = sequence.Select(item => item.ToString());
// {"Edogawa Conan", "Ogiso Setsuna", "Kirigaya Katsuto" };
Take()
取前n個(gè)數(shù)赠法。
var sequence = new[] {1, 2, 3, 4, 5};
IEnumerable<int> filteredElements = sequence.Take(3);// C#IList取前N行使用Take()方法
// {1, 2, 3};
Skip()
跳過(guò)前n個(gè)數(shù)
var sequence = new[] {1, 2, 3, 4, 5};
IEnumerable<int> filteredElements = sequence.Skip(3);
// { 4, 5};
first()
滿(mǎn)足條件的第一個(gè)數(shù)麦轰。
var sequence = new[] { 1, 2, 3, 4, 5 };
int firstElement = sequence.First(); //1
int firstEvenNumber = sequence.First(item => item % 2 ==0); // 2
Last()
滿(mǎn)足條件的最后一個(gè)數(shù)。
var sequence = new[] { 1, 2, 3, 4, 5 };
int lastElement = sequence.Last(); //5
int lastEvenNumber = sequence.Last(item => item % 2 == 0); //4
ElementAt()
第n個(gè)下標(biāo)處的元素。
var sequence = new[] { 1, 2, 3, 4, 5 };
int thirdElement = sequence.ElementAt(2); //3
Count()
int totalNumber = sequence.Count(); // 5, Count 方法如果不帶參數(shù)款侵,則和 Count 屬性一樣末荐,和length一樣
int numberOfEvenNumbers = sequence.Count(item => item % 2 == 0);//2, 查詢(xún)?yōu)榕紨?shù)的個(gè)數(shù)
Min() 求序列的最大值, Max() 求序列的最小值
All()
是否序列中的所有元素都滿(mǎn)足條件新锈,返回bool值甲脏。
var sequence = new[] { 2, 4, 6, 8, 10 };
bool allEvenNumbers = sequence.All(item => item % 2 == 0); //true
contains() , Concat()
A.contains("b") : A中是否包含某元素b
A.Concat(B) : A和B拼接在一起
Union()求并集妹笆, Intersect()求交集, Except()求差集
A.Union(B): 求A和B的并集剃幌,并去掉重復(fù)元素。
其他類(lèi)似