C# 調(diào)試與異常處理.ppt_第1頁
C# 調(diào)試與異常處理.ppt_第2頁
C# 調(diào)試與異常處理.ppt_第3頁
C# 調(diào)試與異常處理.ppt_第4頁
C# 調(diào)試與異常處理.ppt_第5頁
已閱讀5頁,還剩44頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第8章調(diào)試與異常處理,程序的開發(fā)過程難免會發(fā)生錯(cuò)誤,在開發(fā)大型項(xiàng)目中,程序的調(diào)試是一個(gè)漫長的過程。 本章將介紹在VS.NET開發(fā)環(huán)境下調(diào)試C#代碼的各種方法,包括使用IDE的調(diào)試環(huán)境、人工尋找邏輯錯(cuò)誤的常用策略,以及程序的異常處理機(jī)制。,2020/8/25,2,C#程序設(shè)計(jì)實(shí)用教程,8.1程序調(diào)試技術(shù),VS.NET開發(fā)環(huán)境提供了強(qiáng)大的代碼調(diào)試功能。 本節(jié)將探討如何利用它來快速消滅代碼中的語法錯(cuò)誤和邏輯錯(cuò)誤。,2020/8/25,3,C#程序設(shè)計(jì)實(shí)用教程,8.1.1使用Visual Studio.NET錯(cuò)誤報(bào)告,代碼中的Bugs主要分為兩種,一種是語法錯(cuò)誤,另一種是邏輯錯(cuò)誤。 首先,來看如何使用

2、VS.NET來解決第一類問題。語法錯(cuò)誤是指程序員所輸入的指令違反了C#語言的語法規(guī)定,例如下面的表達(dá)式: String str=HelloWorld; 顯然,這里應(yīng)該使用雙引號表示字符串變量。 當(dāng)使用VS.NET編譯代碼時(shí),VS.NET會在“任務(wù)列表”窗口提示出現(xiàn)錯(cuò)誤,如圖8-1所示。,2020/8/25,4,C#程序設(shè)計(jì)實(shí)用教程,8.1.1使用Visual Studio.NET錯(cuò)誤報(bào)告,雙擊錯(cuò)誤提示,VS.NET將自動將光標(biāo)定位到出現(xiàn)錯(cuò)誤的代碼中。 除了上面介紹的這種明顯的語法錯(cuò)誤之外,還有一些稍微復(fù)雜的語法錯(cuò)誤。 例如,試圖在類外訪問其私有成員,使用未賦值的變量等,都可以通過這種方式來解決

3、。,2020/8/25,5,C#程序設(shè)計(jì)實(shí)用教程,8.1.2尋找邏輯錯(cuò)誤,與語法錯(cuò)誤相比,邏輯錯(cuò)誤是更讓人頭痛的問題。邏輯錯(cuò)誤是指代碼在語法上沒有錯(cuò)誤,但是從程序的功能上看,代碼卻無法正確完成其功能。 同樣可以使用VS.NET來尋找邏輯錯(cuò)誤。在調(diào)試模式下運(yùn)行程序時(shí),VS.NET并非僅僅是給出最后的結(jié)果,還保留了應(yīng)用程序所有的中間結(jié)果,即VS.NET知道代碼每一行都發(fā)生了什么。既然這樣,程序員就可以通過跟蹤這些中間結(jié)果,來發(fā)現(xiàn)Bug到底藏在哪里。 為了便于介紹,首先給出一個(gè)含有邏輯錯(cuò)誤的示例代碼如下:,2020/8/25,6,C#程序設(shè)計(jì)實(shí)用教程,8.1.2尋找邏輯錯(cuò)誤,【例10-1】含有邏輯錯(cuò)

4、誤的示例。 using System; namespace Example_LogicError public class Student / / 輸出10次:“我不敢了!” / public void Punish() for(int i=0;i=10;i+) Console.WriteLine(我不敢了!); ,2020/8/25,7,C#程序設(shè)計(jì)實(shí)用教程,8.1.2尋找邏輯錯(cuò)誤,/ / Class1 的摘要說明。 / class Class1 / / 應(yīng)用程序的主入口點(diǎn)。 / STAThread static void Main(string args) Student s=new St

5、udent(); s.Punish(); ,2020/8/25,8,C#程序設(shè)計(jì)實(shí)用教程,8.1.2尋找邏輯錯(cuò)誤,代碼定義了一個(gè)學(xué)生類,其中有一個(gè)方法Punish(),希望輸出10次“我不敢了!”。然而,結(jié)果卻輸出11次。 相信讀者已經(jīng)找到了Bug在哪里,就是for語句的循環(huán)語句: for(int i=0;i=10;i+) 中的“i=10”,應(yīng)當(dāng)改為“i10”。 然而,在實(shí)際的開發(fā)中,邏輯錯(cuò)誤往往沒有這么容易被發(fā)現(xiàn)。 針對這個(gè)示例,下面來看如何使用VS.NET把Bug找出來。首先介紹如何配置VS.NET使其進(jìn)入調(diào)試環(huán)境。,2020/8/25,9,C#程序設(shè)計(jì)實(shí)用教程,8.1.2尋找邏輯錯(cuò)誤,想

6、要跟蹤代碼,要把VS.NET配置為中斷模式。 這時(shí),需要把程序的輸出項(xiàng)選為Debug,操作很簡單:在VS.NET工具菜單的“啟動調(diào)試”按鈕后面,調(diào)整下拉框的內(nèi)容為Debug即可,如圖8-2所示。,2020/8/25,10,C#程序設(shè)計(jì)實(shí)用教程,8.1.3 單步執(zhí)行程序,首先可以使用單步執(zhí)行來運(yùn)行程序,然后跟蹤代碼的每一步代碼,最后找到Bug在哪里。 想要單步執(zhí)行,可以使用快捷鍵F11,或者單擊菜單命令【調(diào)試】【逐語句】。 開始單步執(zhí)行后,程序?qū)⑹紫葧和T谥骱瘮?shù)的第一行,繼續(xù)使用快捷鍵F10或F11可以向下執(zhí)行。兩者的區(qū)別在于:單步執(zhí)行時(shí),可以選擇是否路過一行代碼中所調(diào)用的方法,如果是,則使用F

7、10;如果想要進(jìn)入過程,進(jìn)行更為細(xì)致的觀察,則需要使用F11。 另外,當(dāng)程序暫停以后,VS.NET的監(jiān)視窗口便可以顯示當(dāng)前執(zhí)行位置的變量值情況,當(dāng)使用F11單步Punish方法后,“監(jiān)視”窗口如圖8-3所示。,2020/8/25,11,C#程序設(shè)計(jì)實(shí)用教程,8.1.3 單步執(zhí)行程序,監(jiān)視窗口有3列,分別顯示想要監(jiān)視的變量名稱、變量的值,以及變量的數(shù)據(jù)類型。 如果想要監(jiān)視某個(gè)變量的值,可以在監(jiān)視窗口的“名稱”欄直接輸入這個(gè)值,也可以把這個(gè)值從代碼中選中,然后按住左鍵,直接拖放到監(jiān)視窗口中。 另外,除監(jiān)視窗口之外,還有自動窗口和局部變量窗口。,2020/8/25,12,C#程序設(shè)計(jì)實(shí)用教程,8.1

8、.3 單步執(zhí)行程序,在本例中,需要執(zhí)行for語句的語句體,即把以下語句: Console.WriteLine(我不敢了!); 執(zhí)行11次,因此需要在這里按11次F10,然后仔細(xì)觀察監(jiān)視窗口內(nèi)i的值。 在最后一次的時(shí)候,將發(fā)現(xiàn)i值為10,這時(shí)便可以發(fā)現(xiàn)問題所在了。,2020/8/25,13,C#程序設(shè)計(jì)實(shí)用教程,8.1.4 設(shè)置斷點(diǎn),對于單步執(zhí)行,有時(shí)候?qū)τ谳^大規(guī)模程序的調(diào)試是顯然不可行的。 在此,還有另一種方式來解決這個(gè)問題,就是使代碼暫停在程序員想要的地方,也就是設(shè)置斷點(diǎn)(Breakpoint)。 先來看下面所示的代碼,這段代碼是求10以內(nèi)的素?cái)?shù),運(yùn)行結(jié)果如圖8-4所示。,2020/8/25

9、,14,C#程序設(shè)計(jì)實(shí)用教程,8.1.4 設(shè)置斷點(diǎn),【例10-2】求出10以內(nèi)的素?cái)?shù)。 static void Main(string args) int i, s; for (s = 2; s = s) Console.WriteLine(0是素?cái)?shù), s); else Console.WriteLine(0不是素?cái)?shù), s); Console.Read(); ,2020/8/25,15,C#程序設(shè)計(jì)實(shí)用教程,8.1.4 設(shè)置斷點(diǎn),由運(yùn)行結(jié)果可知,這段代碼雖然沒有語法錯(cuò)誤,但執(zhí)行出來的結(jié)果卻不正確。 要判定問題出在哪里,就需要用VS2005中的調(diào)試工具來進(jìn)行檢查。在此,通過設(shè)置斷點(diǎn)來解決此問題的

10、調(diào)試。,2020/8/25,16,C#程序設(shè)計(jì)實(shí)用教程,8.1.4 設(shè)置斷點(diǎn),首先在程序可能出現(xiàn)問題的開始處設(shè)置斷點(diǎn),使程序能夠在某一行程序上停下來。 使用中斷的方法有以下幾種: 在設(shè)置斷點(diǎn)時(shí),首先把光標(biāo)放置在想要程序需要暫停的地方,然后使用快捷鍵F9或者用鼠標(biāo)單擊那一行的前邊界或者Ctrl+D+N或者單擊菜單命令【調(diào)試】【新斷點(diǎn)】。 如果使用后兩者進(jìn)行設(shè)置斷點(diǎn),將出現(xiàn)斷點(diǎn)屬性對話框,如圖8-5所示。,2020/8/25,17,C#程序設(shè)計(jì)實(shí)用教程,8.1.4 設(shè)置斷點(diǎn),該程序的斷點(diǎn)設(shè)置在外層循環(huán)體語句開始處,如圖8-6所示,用圓點(diǎn)來表示。 單擊“啟動調(diào)試”按鈕 ,或按下F5鍵,程序執(zhí)行到斷點(diǎn)

11、處中斷,根據(jù)前面的運(yùn)行結(jié)果,第個(gè)數(shù)據(jù)結(jié)果是正確的,單擊“啟動調(diào)試”按鈕,使第1個(gè)數(shù)據(jù)輸出,程序停留在斷點(diǎn)處,開始執(zhí)行第2個(gè)數(shù)據(jù)的循環(huán)。,2020/8/25,18,C#程序設(shè)計(jì)實(shí)用教程,8.1.4 設(shè)置斷點(diǎn),單擊“逐語句”按鈕 或按下F11鍵,程序從斷點(diǎn)處逐語句執(zhí)行,黃色顯示當(dāng)前要執(zhí)行的語句。當(dāng)程序逐句執(zhí)行時(shí),可以從“局部變量”窗口查看當(dāng)前變量的值,在即時(shí)窗口檢查某個(gè)變量或表達(dá)式的值,還可以在即時(shí)窗口中執(zhí)行一些Visual Studio命令。 選擇“調(diào)試”“窗口”,打開“局部變量”窗口,如圖8-7 所示,在這個(gè)窗口中,可以看到當(dāng)前方法中的局部變量的值。 打開“即時(shí)窗口”,如圖8-8所示,在這個(gè)窗

12、口可以輸入命令,查看變量,或計(jì)算表達(dá)式的值。,2020/8/25,19,C#程序設(shè)計(jì)實(shí)用教程,8.1.4 設(shè)置斷點(diǎn),“即時(shí)窗口”是一個(gè)有用的調(diào)試工具,在提示符“”狀態(tài)下,輸入字母,可以智能顯示相關(guān)的命令。 通過調(diào)試,當(dāng)s等于3時(shí),內(nèi)層循環(huán)結(jié)束后,i的值應(yīng)該為3,可見出現(xiàn)問題的原因在于內(nèi)循環(huán)中。單擊“停止調(diào)試”按鈕或按下Shift+F5組合鍵,停止程序運(yùn)行。將錯(cuò)誤語句修改為: if (s % i = 0) break; 則程序運(yùn)行結(jié)果正確。,2020/8/25,20,C#程序設(shè)計(jì)實(shí)用教程,8.1.5 在哪里設(shè)置斷點(diǎn),在工程中,如何恰當(dāng)?shù)卦O(shè)置斷點(diǎn),以迅速地縮小Bug藏身之處,是非常重要的技術(shù)。在此

13、簡單介紹常用的設(shè)置斷點(diǎn)策略。 1. 從大到小,逐步縮小范圍 有時(shí)候,程序員很難判定錯(cuò)誤到底出現(xiàn)在哪種方法、哪一行,這時(shí),可以從外到內(nèi),從大到小,逐步縮小Bug所在的范圍。 一方面,可以通過設(shè)置斷點(diǎn),然后逐個(gè)過程執(zhí)行來實(shí)現(xiàn)。,2020/8/25,21,C#程序設(shè)計(jì)實(shí)用教程,8.1.5 在哪里設(shè)置斷點(diǎn),另一方面,還需要程序員理清代碼的邏輯結(jié)構(gòu),迅速判定Bug可能所在的位置,然后在相應(yīng)的位置設(shè)置斷點(diǎn)進(jìn)行驗(yàn)證。,2020/8/25,22,C#程序設(shè)計(jì)實(shí)用教程,8.1.5 在哪里設(shè)置斷點(diǎn),2. 注釋掉可能出錯(cuò)的行 另外一種比較有效的尋找Bug的策略是,注釋掉一部分代碼,然后運(yùn)行程序,看其是否出錯(cuò)。其實(shí)這

14、也是縮小Bug所在范圍的一種策略,不同于使用斷點(diǎn)來實(shí)現(xiàn)。 在注釋掉一部分代碼之后,運(yùn)行程序,如果程序不再出現(xiàn)錯(cuò)誤,那么很明顯,Bug就在注釋掉的代碼之中。但是反過來,如果注釋掉部分代碼后運(yùn)行結(jié)果仍不正確,也不能說注釋掉的代碼肯定正確。,2020/8/25,23,C#程序設(shè)計(jì)實(shí)用教程,8.2 異常處理,再熟練的程序員也不能說自己編寫的代碼沒有任何問題。 可以說,代碼中異常陷阱無處不在,如數(shù)據(jù)庫連接失敗、IO錯(cuò)誤、數(shù)據(jù)溢出、數(shù)組下標(biāo)越界等。 鑒于此,C#提供了異常處理機(jī)制,允許開發(fā)者捕捉程序運(yùn)行時(shí)可能出現(xiàn)的異常。,2020/8/25,24,C#程序設(shè)計(jì)實(shí)用教程,8.2.1 異常類,當(dāng)代碼出現(xiàn)諸如被

15、除數(shù)為零、分配空間失敗等錯(cuò)誤時(shí),就會自動創(chuàng)建異常對象,它們大多是C#異常類的實(shí)例。 System.Exception類是異常類的基類,一般不要直接使用System.Exception,它沒有反映具體的異常信息,而使用是它的派生類。 在C#中,經(jīng)常使用的異常類見表8-1。,2020/8/25,25,C#程序設(shè)計(jì)實(shí)用教程,8.2.1 異常類,2020/8/25,26,C#程序設(shè)計(jì)實(shí)用教程,8.2.2 異常處理,在C#中,使用try、catch和finally關(guān)鍵字定義異常代碼塊。 【例10-3】異常處理的示例。 程序代碼如下: / / 未使用異常處理機(jī)制示例 / public void test_

16、notry() int arr=0,1,2; for(int i=0;i=3;i+)/i=3時(shí),越界了! Console.WriteLine(arri); ,2020/8/25,27,C#程序設(shè)計(jì)實(shí)用教程,8.2.2 異常處理,程序運(yùn)行后,會報(bào)錯(cuò): “未處理的異常:System.IndexOutOfRangeException:索引超出了數(shù)組界限?!?2020/8/25,28,C#程序設(shè)計(jì)實(shí)用教程,8.2.2 異常處理,停止繼續(xù)運(yùn)行。通過使用try-catch-finally語句處理后就可以妥善解決這個(gè)問題。 將有可能發(fā)生異常的代碼放在try語句塊,處理try語句中出現(xiàn)的異常代碼放到catch

17、語句塊,finally語句則是不管try語句中有沒有異常發(fā)生,最后都要執(zhí)行finally語句中的程序塊。,2020/8/25,29,C#程序設(shè)計(jì)實(shí)用教程,8.2.2 異常處理,public void test_withtry() int arr=0,1,2; try for(int i=0;i=3;i+)/i=3時(shí),越界了! Console.WriteLine(arri); catch(Exception e) Console.WriteLine(e.Message); finally Console.WriteLine(Exit test_withtry(); ,2020/8/25,30,C

18、#程序設(shè)計(jì)實(shí)用教程,8.2.2 異常處理,說明:當(dāng)在try代碼塊中出現(xiàn)異常時(shí),C#將自動轉(zhuǎn)向catch代碼塊,并執(zhí)行其中的內(nèi)容。無論是否出現(xiàn)異常,程序都會執(zhí)行finally中的代碼。 try-catch-finally語句有三種形式: try-catch try-catch-finally try- finally 通常情況下要將可能發(fā)生異常的多條代碼放入在try塊中,一個(gè)try塊必須有至少一個(gè)與之相關(guān)聯(lián)的catch塊或finally塊,單獨(dú)一個(gè)try塊是沒有意義的。,2020/8/25,31,C#程序設(shè)計(jì)實(shí)用教程,8.2.2 異常處理,catch塊中包含的是出現(xiàn)異常時(shí)要執(zhí)行的代碼。一個(gè)try

19、后面可以有零個(gè)以上的catch塊。如果try語句中沒有異常,則catch塊中代碼不會被執(zhí)行。catch后面括號放入希望捕獲的異常。 當(dāng)兩個(gè)catch語句的異常類有派生關(guān)系的時(shí)候,要將包括派生的異常類catch語句放到前面,包括基類的catch語句放置到后面。 finally塊包含了一定要執(zhí)行的代碼,通常是一些資源釋放,關(guān)閉文件等代碼。,2020/8/25,32,C#程序設(shè)計(jì)實(shí)用教程,8.2.2 異常處理,下面請看多catch語句的示例。 【例10-4】含有多catch語句的示例。 / / 使用異常處理機(jī)制示例 / public void test_withtry_mulcatch() int

20、arr = 0, 1, 2 ;,2020/8/25,33,C#程序設(shè)計(jì)實(shí)用教程,8.2.2 異常處理,try for (int i = 0; i = 3; i+)/i=3時(shí),越界了! Console.WriteLine(arri); catch (IndexOutOfRangeException e) Console.WriteLine(e.Message); catch (Exception e) Console.WriteLine(e.Message); finally Console.WriteLine(Exit test_withtry_mulcatch(); ,2020/8/25,3

21、4,C#程序設(shè)計(jì)實(shí)用教程,8.2.2 異常處理,運(yùn)行結(jié)果如下: 索引超出了數(shù)組界限。 Exit test_withtry_mulcatch() 第一個(gè)catch語句捕獲異常是IndexOutOfRangeException,表示使用了下標(biāo)小于零或超出數(shù)組下標(biāo)界限的數(shù)組時(shí)引發(fā)異常,第二個(gè)catch語句捕獲異常是Exception,它是所有異常類的基類。 最終執(zhí)行的是第二個(gè)catch語句。 但是,如果將在代碼中現(xiàn)有的第二個(gè)catch語句作為第一個(gè)catch語句來使用,程序編譯不能通過,將提示: “上一個(gè) catch 子句已經(jīng)捕獲了此類型或超類型(“System.Exception”)的所有異常”。

22、,2020/8/25,35,C#程序設(shè)計(jì)實(shí)用教程,8.3 高質(zhì)量編碼標(biāo)準(zhǔn),一般來說,程序總是有可能出現(xiàn)錯(cuò)誤的。 不過,好的編碼方式可以大大降低常見錯(cuò)誤出現(xiàn)的機(jī)會。 8.3.1 好的編碼結(jié)構(gòu) 對比下面兩段代碼,它們的功能相同,都是定義了一個(gè)圓類,并包含求面積的方法。,2020/8/25,36,C#程序設(shè)計(jì)實(shí)用教程,8.3.1 好的編碼結(jié)構(gòu),代碼段A(結(jié)構(gòu)良好的圓類實(shí)現(xiàn)): public class Circle public double dblRadius; public Circle(double _dblRadius) this.dblRadius = _dblRadius; public

23、 double GetArea() return dblRadius * dblRadius * 3.1415926; ,2020/8/25,37,C#程序設(shè)計(jì)實(shí)用教程,8.3.1 好的編碼結(jié)構(gòu),代碼段B(結(jié)構(gòu)混亂的圓類實(shí)現(xiàn)): public class Circle public double dblRadius; public Circle(double _dblRadius) this.dblRadius = _dblRadius; public double GetArea() return dblRadius * dblRadius * 3.1415926; 相信,在不做任何解釋的情

24、況下,讀者是能看明白代碼A的內(nèi)容,因?yàn)樗s進(jìn)結(jié)構(gòu)良好,體現(xiàn)了清晰的邏輯結(jié)構(gòu)。而代碼B呢?要想看明白,則很困難。,2020/8/25,38,C#程序設(shè)計(jì)實(shí)用教程,8.3.1 好的編碼結(jié)構(gòu),說明:縮進(jìn)應(yīng)使用Tab鍵,而不要使用空格鍵。 由上述可以看出,良好的代碼層次結(jié)構(gòu)以及清晰的代碼邏輯結(jié)構(gòu),可以很大程序上提高代碼的質(zhì)量,一方面可以降低程序員出錯(cuò)的可能性,另一方面,在代碼出現(xiàn)錯(cuò)誤的時(shí)候也較容易尋找到錯(cuò)誤所在。,2020/8/25,39,C#程序設(shè)計(jì)實(shí)用教程,8.3.2 好的注釋風(fēng)格,良好的注釋可以大大提高代碼的可閱讀性,另外在編寫程序時(shí),還可以幫助程序員具有更為清晰的編程思路。 同樣,比較8.3.

25、1中的代碼段A與下面的代碼段C。,2020/8/25,40,C#程序設(shè)計(jì)實(shí)用教程,8.3.2 好的注釋風(fēng)格,代碼段C(具有良好注釋的圓類實(shí)現(xiàn)): / / 圓類 / public class Circle public double dblRadius;/半徑 / / 構(gòu)造函數(shù) / / 半徑 public Circle(double _dblRadius) this.dblRadius = _dblRadius; ,2020/8/25,41,C#程序設(shè)計(jì)實(shí)用教程,8.3.2 好的注釋風(fēng)格,/ / 求圓的面積 / / 面積 public double GetArea() return dblRad

26、ius * dblRadius * 3.1415926; ,2020/8/25,42,C#程序設(shè)計(jì)實(shí)用教程,8.3.2 好的注釋風(fēng)格,顯而易見,有了注釋之后,完全沒有必要對這段代碼進(jìn)行解釋了,讀者一定能夠看懂。 另外,VS.NET提供了良好的自動注釋功能,在方法或者類的前面用“/”添加注釋時(shí),會自動生成大量的注釋格式,只需要在相應(yīng)的位置添入注釋項(xiàng)即可。 在此,推薦盡量使用“/”對類或方法進(jìn)行注釋,這樣做還有另外一個(gè)好處,當(dāng)引用這個(gè)類或者方法時(shí),VS.NET會自動提示注釋的內(nèi)容。,2020/8/25,43,C#程序設(shè)計(jì)實(shí)用教程,8.3.3 好的命名規(guī)范,在編碼中,常常使用到的命名規(guī)范有: Pascal命名規(guī)范:每個(gè)單詞的首字母大寫,例如ProductType。 Camel命名規(guī)范:首個(gè)單詞的首字母小寫,其余單詞的首字母大寫,例如productType。 在C#中,推薦的命名規(guī)范如下: (

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論