运算符/类型转换
運算符
三元運算符
if...else的簡化形式,首先判斷一個條件,如果為真,返回第一個值.為假返回后一個值
int a = 3; bool result = a > 10 ? true : false;//a>10?如果大于返回true否則返回falsechecked和unchecked
如果把代碼塊標記為checked,CLR就會執行棧溢出檢測
//byte類型最大取值255 byte a = 255; checked {a++; } //這里如果不加checed.++后輸出0(不會拋異常,但會丟失數據,溢出的位會被舍棄,所以值為0),加上后會拋出棧溢出異常 Console.WriteLine(a);如果要禁止棧溢出,則可以把代碼標記unchecked
is運算符
is運算符可以檢測對象是否與特定類型兼容,兼容表示對象是該類型或者派生自該類型(這里只是做說明沒有實際意義,因為object是所有類型基類)
int i =10; i is object;as運算符
//TODOsizeof運算符
sizeof運算符可以確定棧中值類型需要的長度(單位為字節)
Console.WriteLine(sizeof(int));//4個字節Console.WriteLine(sizeof(byte));//1個字節typeof運算符
返回一個表示特定類型的Systen.Type對象
Console.WriteLine(typeof(int));//System.Int32Console.WriteLine(typeof(byte));//System.Byte可空類型和運算符
在C# 2.0中出現了可空類型,允許值類型也可以為空(null),可空類型的實現基于C#泛型。需要注意的是:在程序中使用可空類型就必須考慮null值在各種運算符一起使用的影響,通??煽仡愋团c一元或二元運算符一起使用時,如果一個操作數為null或兩個操作數為null.結果就是null
int? a = null;int? c = a + 4; //c=null空合并運算符
空合并運算符??提供了快捷方式,處理可控類型和引用類型時表示null可能的值,需要注意:只能針對引用類型處理,規則是
- 如果第一個操作數不是null,值就等于第一個操作數的值
- 如果第一個操作數是null,值就等于第二個操作數的值?
類型安全性
隱式轉換
隱式轉換是系統默認的,不需要加以聲明就會自動執行隱式類型轉換,在隱式轉換過程,編譯器無需對轉換進行詳細檢查就能夠安全的執行.隱式類型轉換是從低精度數值類型=>高精度數值類型
int a = 10; double b = a;//自動隱式類型轉換顯式轉換
將高精度值-->低精度進行數據轉換時,可能會丟失數據,這時候需要使用顯式轉換,并且要考慮到可能出現算術溢出;顯式轉換需要用戶明確指出指定要轉換的類型
需要注意:
可空類型數據轉換=>非可空類型或者另一個可空類型,其中可能會丟失數據,就必須使用顯式類型轉換,并且如果從可空類型轉換為非可空類型時.且變量值為null.就會拋出InvalidOperationException異常
int? a = null; int b = (int)a; //System.InvalidOperationException:“可為空的對象必須具有一個值。 ?通過方法進行類型轉換
ToString()方法:C#中的類型基類都繼承自Object類,所以都可以使用ToString()來轉換成字符串
int a = 10; string s = a.ToString();int.Parse方法():int.Parse()用于將string類型參數轉換為int,需要注意:string類型參數不能為null,并且也只能是各種整型,不能是浮點型
string a = "2"; string b = "2.6"; string c = null; int a1 = int.Parse(a);//正常 int a2 = int.Parse(b);//錯誤:輸入字符串格式錯誤 int a3 = int.Parse(c);//值不能為nullint.TryParse方法():該方法int.Parse()方法類似,不同點在于int.Parse()方法無法轉換成功時會拋出異常.而int.TryParse()方法在無法進行轉換時會返回false,int.TryParse()方法需要一個out類型的參數,如果轉換成功,out參數的值就是正常轉換的值,否則,返回false
string a = "2"; string b = "2.6"; string c = null; int i; bool a1 = int.TryParse(a,out i);//轉換成功,i=2bool a2 = int.TryParse(b, out i);//轉換失敗,a2=false bool a3 = int.TryParse(c, out i);//轉換失敗,a3=false
通過Convert類進行轉換:Convet類提供了多種類型的轉換想
string a = "2"; int a1 = Convert.ToInt32(a);可以通過繼承即可IConventible或者TypeConventer類,實現自定義轉換
使用as運算符轉換:
//TODOint.Parse()/Convert.ToInt()/int.TryParse()方法對比
參數和適用對象不同
- int.Parse():參數數據類型只能是string類型,適用于string類型的數據
- int.TryParse():參數也只能是string類型,適用于string類型的數據,但是在轉換失敗時會返回false,并且需要提供一個out類型的參數
- Convert.ToInt():參數類型較多
異常處理
- Convert.ToInt()參數為null,返回0,參數為""時,拋出異常
- int.Parse 參數為 null 時,拋出異常。參數為""時,拋出異常
- int.TryParse()方法比int.Parse()方法多了一個異常處理,如果出現異常則返回false,并且將輸出參數返回0。
返回值
- int.TryParse與int.Parse和Convert.ToInt 在返回值的不同是返回bool類型。獲取轉換后的值是通過out參數獲取的
比較相等
對象比較相等的機制有所不對,這取決于比較的是引用類型(類的實例)還是值類型(基本數據類型/結構/或枚舉的實例)
默認情況下:
-
值類型使用值類型相等引用類型使用引用相等:兩個值相等
- 引用類型使用引用相等:兩個引用指向同一個對象
值類型比較相等(比較值相等),返回True
int x = 5, y = 5; Console.WriteLine(x == y);?
引用類型比較相等(比較兩個引用是否指向同一對象),返回True
string x = "5", y = x; Console.WriteLine(x == y);?
==和!=運算符:編譯器編譯時根據操作數的數據類型決斷使用何種方式比較,
- 對于基本類型比較的是基本類型的值
- 對于引用類型,比較的是對象的內存地址,不同的對象自然有不同的內存地址
Object.Equals虛方法:Equals在程序運行時決定比較的類型,根據對象的實際類型調用對應類中重寫的Equals方法進行比較
int a = 5, b = 5; string x = "5", y = x; //調用System.Int32的Equals進行比較,返回True Console.WriteLine(a.Equals(b)); //調用System.String的Equals進行比較,返回True Console.WriteLine(x.Equals(y));?但是如果這里把string參數設置為null
string x = null, y = x; Console.WriteLine(x == y);//==依舊判斷是否引用是否指向同一個對象,返回True Console.WriteLine(x.Equals(y));//第一個運算對象是null,Equals方法會拋出NullReferenceException異常;而靜態的運算符則不會?Object靜態的Equals方法:Object.Equals虛方法是在程序運行時決定比較的類型,根據對象的實際類型調用對應類中重寫的Equals方法進行比較,如果對象類型是object怎么處理呢,答案Object類還提供了一個靜態的Equals方法,可以對編譯時不知道類型null對象進行安全的比較
?
object的靜態ReferenceEquals方法
?
這里需要再學習補充
轉載于:https://www.cnblogs.com/GnailGnepGnaw/p/10623264.html
總結
- 上一篇: springboot源码解析autoco
- 下一篇: JavsScript中DOM的基本操作