接口 类型转换 try-catch(学习笔记)
(抽象類,接口)內容已經在前面的博客有記載http://www.cnblogs.com/tobecabbage/p/3460984.html? http://www.cnblogs.com/tobecabbage/p/3468115.html
- 轉換的說明
-》隱式類型轉換:正常的值類型的隱式轉換,里氏轉換原則,裝箱
double? dNum=123;
-》強制類型轉換:正常的值類型的強制轉換,里氏轉換原則,拆箱
int num=(int)123.456;
-》類型轉型
int? num=Convert.ToInt32("123");
計算機只認識0和1,所以用二進制表示(兩個位bit),8個bit表示一個字節
int32 4個字節 0000 0000 0000 0000 0000 0000 0000 0000
因這二進制不便于閱讀,所以計算機用16進制描述數據。
8位一個字節
0000 0001 1?
0000 0010 2
0000 0011 3
0000 0100 4
0000 0101 5
0000 0110 6
0000 0111 7
....
1111 1111 0-255共256個數字? 恰好是16的平方
??????? 二進制?? 16進制
1000 8
1001 9
1010 a
?? 1011?? b
1100???c
?? 1101 d
?????????1110 e
1111??? f
0001 0000??? 10
?單步調試到Main方法的最后一行,查看變量內存地址中數據
?
?
double類型的數據可以除以0,得到正無窮大
double bd=90.0000; Console.WriteLine(bd/0.0000000000);//結果為正無窮大?
里氏轉換見前面的博客已有記載,簡單解釋概括為:子類的對象new sub()分配的內存空間地址偏移量比父類的對象New base()要大。所以一個父類的引用變量指向一個子類的對象是可以的,只是訪問不到子類的數據而已(若想訪問到子類對象的數據,需要重寫父類的方法)。而一個父類的對象地址偏移量小,卻用一個子類的引用變量指向,這就意味這可以用這個子類的引用變量反問到子類的數據,可是該子類引用變量指向的確實父類的對象,內存空間里根本沒有子類的數據。這與子類引用變量能訪問到子類的數據相矛盾()。
里氏轉換 base? b= new sub();???? sub s=(sub)b;因為b本來指向的就是一個sub()對象,里面存有子類的數據,所以sub類型引用變量s能訪問到sub對象的數據。轉換陳功。里氏轉換的存在的目的是為了實現多肽。
?
裝箱拆箱前面博客已有記
- 異常是程序中運行時錯誤,它違反了一個系統的約束或應用程序約束,或出現了正常操作時未預料的情形。?
Convert.ToInt32("123abc");//格式不正確
Convert.ToInt32("12345678901234567890");//對于int32太大或太小
寫程序
-》遇到程序怎么樣讓程序不掛起
-》怎樣拋出異常
try語句
如果程序沒有提供處理異常的代碼,系統會掛起這個程序。
?try語句用來指明被正異常保護的代碼塊,并提供代碼以處理異常。
?catch字句部分含有一個或多個catch字句。,這些都是處理異常的代碼塊,它們也稱為是異常的處理程序。
?finally塊含有在所有情況下都要被執行的代碼,無論有沒有異常發生。
catch字句部分與finally字句部分必須至少有一個,如果兩個都有,finally必須放在最后,即catch字句的后面
處理異常的代碼
satic void Main(){
int x=10;
try{
int y=0;
x/y;
}
catch{
...//處理異常的代碼
Console.WriteLine("Handling all exceptions - Keeping on Runing");
}
}
這段代碼產生以下消息。注意,除了輸出消息,沒有異常已經發生的跡象。
Handling all exceptions-Keeping on Runing
異常類
有許多不同類型的異常可以在程序中發生,BCL定義了許多類,每一個類代表了一個指定的異常類型。當一個異常發生時,CLR:
?創建該類型的異常對象;
?尋找適當的catch字句以處理它。
所有的異常都從根本上派生自System.Exception類。
System.Exception:所以異常類的基類
??-》SystemException:所有預定義系統異常的基類。IndexOfRangeException NullReference IOException
? -》ApplicationException:所有致命的、應用程序定義的異常的基類。
異常對象含有只讀屬性,帶有導致該異常的信息。
屬性?????? 類型???? 描述
Message string 這個屬性含有解釋異常的原因的消息
? StackTrace???string ?這個屬性含有描述異常發生在何處的信息
???? InnerException? Exception 如果當前異常是由另一個異常引起的,這個異常包含前一個異常的引用
???? HelpLink???????? string?????? 這個屬性可以被應用程序定義的異常設置,為異常原因信息提供URN或URL
???? Source??????????? string?????? 如果沒有被應用程序定義的異常設定,那么這個屬性含有異常起源所在的程序集的名稱。
Catch字句的三種形式
catch{
? Statements?? 一般catch字句,在catch關鍵字之后沒有參數列表,匹配try塊中引起的任何類型的異常。
}
catch(ExceptionType){
Statements? 特定catch字句 帶有異常類的名稱作為參數 匹配任何該類型的異常
}
catch(ExceptionType Exception){
? Statements??? 帶對象的的特定Catch字句,在異常類名稱之后包括一個標識符,該標識符在catch字句塊中相當于一個本地變量,并被稱為異常變量
}?????????????????????異常變量應用異常對象,并能用于訪問該變量的信息
一般catch字句能接受任何異常,但不能確定引發異常的類型。
特定catch字句形式把一個異常類的名作為參數,它匹配該指定類或派生自它的異常類的異常。
帶對象的特定catch字句提供最多的關于異常的信息。它匹配指定類的異常,或派生自它的異常類的異常。它還給出一個異常實例,稱為異常變量,它是一個對CLR創建的異常對象的引用。
?使用特定Catch字句的示例
int x=0;
try{
int y=0;
x/y;
}
catch(DivideByException){
...
Console.WritelLine("Handling an exception");
}
int x=0;
try{
int y=0;
x/y;
}
catch(DividedByException e){
Console.WriteLine("Messsage:{0},e.Message);
Console.WriteLine("Source:{0},e.Source);
Console.WriteLine("Stack:{0},e.StackTrace);
}
Catch 字句塊目的是允許你以一種優雅的方式處理異常。
catch字句塊可以包含多個catch字句,特定catch 字句允許多于一個,一般catch字句只允許一個。
catch字句的排序有兩個重要的規則
?特定catch字句必須以一種順序排序,最明確的異常類型第一,直到最普通的類型,例如,如果聲明一個派生自NullReferenceException的異常類,那么派生自異常類型的Catch子句應該被列在NullReferenceException的catch字句之前。
?如果有一個catch子句,它必須是最后一個,它必須在所有特定的catch子句之后,使用一般catch子句一般是不好的,應該盡可能使用特定的catch子句。一般catch子句通過讓程序繼續執行隱藏錯誤。
- 拋出異常
func1(){func2();}
func2(){func3();}
func3(){func4();}
如果func4()里面出現異常,首先在func4()里查找是否有匹配的異常處理的代碼,若沒有,繼續往上拋異常,在func3()里面找匹配的代碼塊...若一直沒找找到,就拋給Main()方法,若還是找不到匹配的異常處理代碼,繼續拋給CLR,繼續拋給操作系統。
class Program{static void Main(string[] args){Myclass MCls = new Myclass();try{MCls.A();}catch (System.DivideByZeroException){Console.WriteLine("catch cause in main()");}finally{Console.WriteLine("finally cause in main()");}Console.WriteLine("After try statement in Main.");Console.WriteLine(" ---keep running");Console.ReadKey();}}class Myclass{public void A(){try{B();}catch (System.NullReferenceException){Console.WriteLine("catch clause in A()");}finally{Console.WriteLine("finally clause in A()");}}void B(){int x = 0, y = 0;try{x/=y;}catch (System.IndexOutOfRangeException){Console.WriteLine("catch clause in B()");}finally{Console.WriteLine("finally clause in B()");}}}程序運行結果
圖解:
?拋出異常
throw new Exception();
- ?異常的性能問題
從以上代碼中可以看出,try{}catch(){}會導致運行速度非常慢。所以建議慎用try-catch字句,盡可能用if-esle。若是涉及到訪問本地文件,沒有權限,或是訪問數據庫,網忽然斷掉的異常采用try-catch
?
?
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
轉載于:https://www.cnblogs.com/tobecabbage/p/3528076.html
總結
以上是生活随笔為你收集整理的接口 类型转换 try-catch(学习笔记)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于memcached
- 下一篇: C# viewstate