C#高級編程(第9版) C# 5.0 & .NET 4.5.1 [Professional C# 5.0 and .NET 4.5.1]

C#高級編程(第9版) C# 5.0 & .NET 4.5.1 [Professional C# 5.0 and .NET 4.5.1] pdf epub mobi txt 电子书 下载 2025

[美] Christian Nagel,Jay Glynn,Morgan Skinner 著,李銘 譯
圖書標籤:
  • C# 5
  • 0
  • NET 4
  • 5
  • 1 C#高級編程
  • NET 編程 開發 技術 書籍 計算機 專業級
想要找书就要到 求知書站
立刻按 ctrl+D收藏本页
你会得到大惊喜!!
出版社: 清华大学出版社
ISBN:9787302380023
版次:1
商品编码:11611762
品牌:清华大学
包装:平装
丛书名: .NET 开发经典名著
外文名称:Professional C# 5.0 and .NET 4.5.1
开本:16开
出版时间:2015-01-01
用纸:胶版纸
页数:1552
字数:2

具体描述

編輯推薦

  c#經典名著,纍計暢銷16年,wrox精品紅皮書,引領無數程序員進入程序開發殿堂
  2013年度十大引進版圖書TOP10
  2009年度/2011年度全行業暢銷書,深受廣大讀者喜愛
  2008年度優秀技術圖書!
  2007年度暢銷的C#銷售圖書!
  

海報:
  
  

內容簡介

  《C#高級編程(第9版):C# 5.0 & .NET 4.5.1 》由.NET專傢的夢幻組閤編寫,包含開發人員使用C#所需的所有內容。C#是編寫.NET應用程序的一種語言,本書適閤於希望提高編程技巧的、有經驗的C#程序員,也適用於剛開始使用C#的專業開發人員。
  《C#高級編程(第9版):C# 5.0 & .NET 4.5.1 》探討瞭Visual Studio2013和.NET Framework 4.5.1、新的測試驅動開發和並發編程功能。所有示例的源代碼都可以下載,讀者可以立即開始編寫Windows桌麵應用程序、Windows Store應用程序和ASP.NETWeb應用程序。
  主要內容
  ◆ 涵蓋Visual Studio 2013的主要更新和改進,重新討論瞭C#開發人員與VS的交互方式
  ◆ 提供瞭專業開發人員必須瞭解和掌握的所有C#知識
  ◆ 研究瞭.NET Framework 4.5.1 GC的更新、Visual Studio 2013新的UI和用於Windows 8.1的Windows Store應用程序
  ◆ 包含大量有益的示例和用於實踐的代碼,以及處理常見問題的靈活方法

作者簡介

  Christian Nagel,是Microsoft RD、Microsoft MVP、thinktecture的閤作夥伴、CN革新技術的奠基人,他還是一位軟件架構師和開發人員,為開發Microsoft .NET解決方案提供培訓和谘詢服務。他具備超過25年的軟件開發經驗。Christian從PDP 11和VAX/VMS係統開始其計算機生涯,熟悉各種語言和平颱。他具備Microsoft技術的深厚功底,編寫瞭大量圖書,並獲得瞭Microsoft認證培訓師和專業開發人員證書。

  Jay Glynn,開發軟件的時間超過20年,使用PICK Basic為PICK操作係統編寫應用程序。到目前為止,他使用過Delphi、VBA、Visual Basic、C、Java和C#編寫軟件。他目前是VGT的高級軟件工程師,編寫基於Web的應用程序。

  Morgan Skinner,是一位自由顧問,他在開始自己的顧問生涯之前,在Microsoft工作瞭將近10年。


目錄

第Ⅰ部分 C# 語 言
第1章 .NET體係結構 2
1.1 C#與.NET的關係 2
1.2 公共語言運行庫 3
1.2.1 平颱無關性 3
1.2.2 提高性能 3
1.2.3 語言的互操作性 4
1.3 中間語言 6
1.3.1 麵嚮對象和接口的支持 6
1.3.2 不同的值類型和引用類型 7
1.3.3 強數據類型化 7
1.3.4 通過異常處理錯誤 12
1.3.5 特性的使用 12
1.4 程序集 12
1.4.1 私有程序集 13
1.4.2 共享程序集 13
1.4.3 反射 14
1.4.4 並行編程 14
1.4.5 異步編程 14
1.5 .NET Framework類 15
1.6 名稱空間 15
1.7 用C#創建.NET應用程序 16
1.7.1 創建ASP.NET應用程序 16
1.7.2 使用WPF 17
1.7.3 Windows Store應用程序 18
1.7.4 Windows服務 18
1.7.5 WCF 18
1.7.6 Windows WF 19
1.8 C#在.NET企業體係結構中的作用 19
1.9 小結 20

第2章 核心C# 22
2.1 C#基礎 23
2.2 第一個C#程序 23
2.2.1 代碼 23
2.2.2 編譯並運行程序 23
2.2.3 詳細介紹 24
2.3 變量 26
2.3.1 變量的初始化 26
2.3.2 類型推斷 27
2.3.3 變量的作用域 28
2.3.4 常量 30
2.4 預定義數據類型 31
2.4.1 值類型和引用類型 31
2.4.2 CTS類型 32
2.4.3 預定義的值類型 32
2.4.4 預定義的引用類型 35
2.5 流控製 37
2.5.1 條件語句 37
2.5.2 循環 40
2.5.3 跳轉語句 43
2.6 枚舉 44
2.7 名稱空間 46
2.7.1 using語句 47
2.7.2 名稱空間的彆名 48
2.8 Main()方法 48
2.8.1 多個Main()方法 49
2.8.2 給Main()方法傳遞參數 50
2.9 有關編譯C#文件的更多內容 50
2.10 控製颱I/O 52
2.11 使用注釋 54
2.11.1 源文件中的內部注釋 54
2.11.2 XML文檔 54
2.12 C#預處理器指令 56
2.12.1 #define和#undef 57
2.12.2 #if、#elif、#else和#endif 57
2.12.3 #warning和# error 58
2.12.4 #region和#endregion 58
2.12.5 #line 59
2.12.6 #pragma 59
2.13 C#編程規則 59
2.13.1 關於標識符的規則 59
2.13.2 用法約定 60
2.14 小結 66

第3章 對象和類型 67
3.1 創建及使用類 67
3.2 類和結構 68
3.3 類 69
3.3.1 數據成員 69
3.3.2 函數成員 69
3.3.3 隻讀字段 81
3.4 匿名類型 82
3.5 結構 82
3.5.1 結構是值類型 84
3.5.2 結構和繼承 84
3.5.3 結構的構造函數 85
3.6 弱引用 85
3.7 部分類 86
3.8 靜態類 87
3.9 Object類 88
3.9.1 System.Object()方法 88
3.9.2 ToString()方法 89
3.10 擴展方法 90
3.11 小結 91

第4章 繼承 92
4.1 繼承 92
4.2 繼承的類型 92
4.2.1 實現繼承和接口繼承 92
4.2.2 多重繼承 93
4.2.3 結構和類 93
4.3 實現繼承 93
4.3.1 虛方法 94
4.3.2 隱藏方法 95
4.3.3 調用函數的基類版本 96
4.3.4 抽象類和抽象函數 97
4.3.5 密封類和密封方法 97
4.3.6 派生類的構造函數 98
4.4 修飾符 102
4.4.1 可見性修飾符 103
4.4.2 其他修飾符 103
4.5 接口 104
4.5.1 定義和實現接口 105
4.5.2 派生的接口 108
4.6 小結 109

第5章 泛型 110
5.1 泛型概述 110
5.1.1 性能 111
5.1.2 類型安全 112
5.1.3 二進製代碼的重用 112
5.1.4 代碼的擴展 113
5.1.5 命名約定 113
5.2 創建泛型類 113
5.3 泛型類的功能 117
5.3.1 默認值 118
5.3.2 約束 118
5.3.3 繼承 120
5.3.4 靜態成員 121
5.4 泛型接口 122
5.4.1 協變和抗變 122
5.4.2 泛型接口的協變 123
5.4.3 泛型接口的抗變 125
5.5 泛型結構 125
5.6 泛型方法 128
5.6.1 泛型方法示例 128
5.6.2 帶約束的泛型方法 129
5.6.3 帶委托的泛型方法 130
5.6.4 泛型方法規範 131
5.7 小結 132

第6章 數組 133
6.1 同一類型和不同類型的多個對象 133
6.2 簡單數組 134
6.2.1 數組的聲明 134
6.2.2 數組的初始化 134
6.2.3 訪問數組元素 135
6.2.4 使用引用類型 136
6.3 多維數組 137
6.4 鋸齒數組 138
6.5 Array類 139
6.5.1 創建數組 139
6.5.2 復製數組 140
6.5.3 排序 141
6.6 數組作為參數 144
6.6.1 數組協變 144
6.6.2 ArraySegment 144
6.7 枚舉 145
6.7.1 IEnumerator接口 146
6.7.2 foreach語句 146
6.7.3 yield語句 147
6.8 元組 152
6.9 結構比較 152
6.10 小結 155

第7章 運算符和類型強製轉換 156
7.1 運算符和類型轉換 156
7.2 運算符 156
7.2.1 運算符的簡化操作 158
7.2.2 運算符的優先級 162
7.3 類型的安全性 163
7.3.1 類型轉換 163
7.3.2 裝箱和拆箱 167
7.4 比較對象的相等性 168
7.4.1 比較引用類型的相等性 168
7.4.2 比較值類型的相等性 169
7.5 運算符重載 169
7.5.1 運算符的工作方式 170
7.5.2 運算符重載的示例:Vector
……

精彩書摘

  2.1 C#基礎
  理解瞭C#的用途後,就可以學習如何使用它瞭。本章將介紹C#的基礎知識,本章的內容也是後續章節的基礎,好的開端等於成功的一半。閱讀完本章後,讀者就有足夠的C#知識編寫簡單的程
  序瞭,但還不能使用繼承或其他麵嚮對象的特徵。這些內容將在後麵的幾章中討論。
  2.2 第一個C#程序
  下麵編譯並運行最簡單的C#程序,這是一個簡單的控製颱應用程序,它由把某條消息寫到屏幕上的一個類組成。
  2.2.1 代碼
  在文本編輯器(如Notepad)中輸入下麵的代碼,把它保存為後綴名為.cs 的文件(如First.cs)。Main()方法如下所示(更多信息參見2.7 節):
  using System;
  namespace Wrox
  {
  public class MyFirstClass
  {
  static void Main()
  {
  Console.WriteLine("Hello from Wrox.");
  Console.ReadLine();
  return;
  }
  }
  }
  2.2.2 編譯並運行程序
  對源文件運行C#命令行編譯器(csc.exe),編譯這個程序:後麵幾章會介紹許多代碼示例。編寫C#程序最常用的技巧是使用Visual Studio2013 生成一個基本項目,再添加自己的代碼。但是,第Ⅰ部分的目的是講授C#語言,為瞭簡單起見,在第17 章之前避免涉及Visual Studio 2013。我們使代碼顯示為簡單的文件,這樣就可以使用任何文本編輯器輸入它們,並在命令行上編譯。
  csc First.cs
  如果使用csc 命令在命令行上編譯代碼,就應注意.NET 命令行工具(包括csc)隻有在設置瞭某些環境變量後纔能使用。根據安裝.NET(和Visual Studio)的方式,這裏顯示的結果可能與你計算機上的結果不同。
  編譯代碼,會生成一個可執行文件First.exe。在命令行或Windows Explorer 上,像運行任何可執行文件那樣運行該文件,得到如下結果:
  csc First.cs
  Microsoft (R) Visual C# Compiler version 12.021005.1
  For C# 5.0
  Copyright (C) Microsoft Corporation. All rights reserved.
  First.exe
  Hello from Wrox.
  2.2.3 詳細介紹
  首先對C#語法做幾個一般性的解釋。在C#中,與其他C 風格的語言一樣,大多數語句都以分號(;)結尾,語句可以寫在多個代碼行上,不需要使用續行字符。用花括號({})把語句組閤為塊。單行注釋以兩個斜杠字符開頭(//),多行注釋以一條斜杠和一個星號(/*)開頭,以一個星號和一條斜杠(*/)結尾。在這些方麵,C#與C++和Java 一樣,但與Visual Basic 不同。分號和花括號使C#代碼與VisualBasic 代碼有差異很大的外觀。如果你以前使用的是Visual Basic,就應特彆注意每條語句結尾的分號。對於新接觸C 風格語言的用戶,忽略分號常常是導緻編譯錯誤的一個最主要的原因。另一個方麵是,C#區分大小寫,也就是說,變量myVar 與MyVar 是兩個不同的變量。
  在上麵的代碼示例中,前幾行代碼與名稱空間有關(如本章後麵所述),名稱空間是把相關類組閤在一起的方式。namespace 關鍵字聲明瞭應與類相關的名稱空間。其後花括號中的所有代碼都被認為是在這個名稱空間中。編譯器在using 語句指定的名稱空間中查找沒有在當前名稱空間中定義但在代碼中引用的類。這非常類似於Java 中的import 語句和C++中的using namespace 語句。
  using System;
  namespace Wrox
  {
  在First.cs 文件中使用using 指令的原因是下麵要使用一個庫類System.Console。using System語句允許把這個類簡寫為Console(System 名稱空間中的其他類也與此類似)。如果沒有using,就必如果沒有設置環境變量,有兩種解決方法。第1 種方法是在運行csc 之前,從命令提示符窗口上運行批處理文件%Microsoft Visual Studio 2013%Common7Toolsvsvars32.bat。其中%Microsoft Visual Studio 2013%是Visual Studio 2013 的安裝文件夾。
  第2 種方法(更簡單)是使用Visual Studio 2013 命令提示符代替通常的命令提示符窗口。
  Visual Studio 2013 命令提示符在菜單“開始”|“程序”| Microsoft Visual Studio 2013|VisualStudio Tools 子菜單下。它隻是一個命令提示符窗口,打開時會自動運行vsvars32.bat。
  第2 章 核 心 C#須完全限定對Console.WriteLine()方法的調用,如下所示:
  System.Console.WriteLine("Hello from Wrox.");
  標準的System 名稱空間包含瞭最常用的.NET 類型。在C#中做的所有工作都依賴於.NET 基類,認識到這一點非常重要;在本例中,我們使用瞭System 名稱空間中的Console 類,以寫入控製颱窗口。C#沒有用於輸入和輸齣的內置關鍵字,而是完全依賴於.NET 類。接著,聲明一個類MyFirstClass。但是,因為該類位於Wrox 名稱空間中,所以其完整的名稱是
  Wrox.MyFirstCSharpClass:
  class MyFirstCSharpClass
  {
  所有的C#代碼都必須包含在一個類中。類的聲明包括class 關鍵字,其後是類名和一對花括號。
  與類相關的所有代碼都應放在這對花括號中。
  下麵聲明方法Main()。每個C#可執行文件(如控製颱應用程序、Windows 應用程序和Windows服務)都必須有一個入口點——Main()方法(注意M大寫):
  public static void Main()
  {
  在程序啓動時調用這個方法。該方法要麼沒有返迴值(void),要麼返迴一個整數(int)。注意,在
  C#中方法的定義如下所示:
  [modifiers] return_type MethodName([parameters])
  {
  // Method body. NB. This code block is pseudo-code.
  }
  第一個方括號中的內容錶示可選關鍵字。修飾符(modifiers)用於指定用戶所定義的方法的某些特性,如可以在什麼地方調用該方法。在本例中,有兩個修飾符public 和static。修飾符public 錶示可以在任何地方訪問該方法,所以可以在類的外部調用它。修飾符static 錶示方法不能在類的實例上執行,因此不必先實例化類再調用。這非常重要,因為我們創建的是一個可執行文件,而不是類庫。把返迴類型設置為void,在本例中,不包含任何參數。
  最後,看看代碼語句:
  Console.WriteLine("Hello from Wrox.");
  Console.ReadLine();
  return;
  在本例中,我們隻調用瞭System.Console 類的WriteLine()方法,把一行文本寫到控製颱窗口上。WriteLine()是一個靜態方法,在調用之前不需要實例化Console 對象。
  Console.ReadLine()讀取用戶的輸入,添加這行代碼會讓應用程序等待用戶按迴車鍵,之後退齣幾乎所有的C#程序都使用System 名稱空間中的類,所以假定本章所有的代碼文
  件都包含using System;語句。
  應用程序。在Visual Studio 2013 中,控製颱窗口會消失。
  然後調用return 退齣該方法(因為這是Main 方法,所以也退齣瞭程序)。在方法頭中指定void,因此沒有返迴值。
  對C#基本語法有瞭大緻的認識後,下麵就詳細討論C#的各個方麵。因為沒有變量不可能編寫齣重要的程序,所以首先介紹C#中的變量。
  2.3 變量
  在C#中聲明變量使用下述語法:
  datatype identifier;
  例如:
  int i;
  該語句聲明int 變量i。編譯器不允許在錶達式中使用這個變量,除非用一個值初始化瞭該變量。
  聲明i 之後,就可以使用賦值運算符(=)給它賦值:
  i = 10;
  還可以在一行代碼中聲明變量,並初始化它的值:
  int i = 10;
  如果在一條語句中聲明和初始化瞭多個變量,那麼所有的變量都具有相同的數據類型:
  int x = 10, y =20; // x and y are both ints
  要聲明不同類型的變量,需要使用單獨的語句。在多個變量的聲明中,不能指定不同的數據類型:
  int x = 10;
  bool y = true; // Creates a variable that stores true or false
  int x = 10, bool y = true; // This won't compile!
  注意上麵例子中的“//”和其後的文本,它們是注釋。“//”字符串告訴編譯器,忽略該行後麵的文本,這些文本僅為瞭讓人更好地理解程序,它們並不是程序的一部分。本章後麵會詳細討論代碼中的注釋。
  2.3.1 變量的初始化
  變量的初始化是C#強調安全性的另一個例子。簡單地說,C#編譯器需要用某個初始值對變量進行初始化,之後纔能在操作中引用該變量。大多數現代編譯器把沒有初始化標記為警告,但C#編譯器把它當作錯誤來看待。這就可以防止我們無意中從其他程序遺留下來的內存中獲取垃圾值。
  C#有兩個方法可確保變量在使用前進行瞭初始化:
  ● 變量是類或結構中的字段,如果沒有顯式初始化,創建這些變量時,其默認值就是0(類和結構在後麵討論)。
  ● 方法的局部變量必須在代碼中顯式初始化,之後纔能在語句中使用它們的值。此時,初始化不是在聲明該變量時進行的,但編譯器會通過方法檢查所有可能的路徑,如果檢測到局部變量在初始化之前就使用瞭它的值,就會産生錯誤。
  例如,在C#中不能使用下麵的語句:
  public static int Main()
  {
  int d;
  Console.WriteLine(d); // Can't do this! Need to initialize d before use
  return 0;
  }
  注意在這段代碼中,演示瞭如何定義Main(),使之返迴一個int 類型的數據,而不是void。在編譯這些代碼時,會得到下麵的錯誤消息:
  Use of unassigned local variable 'd'
  考慮下麵的語句:
  Something objSomething;
  在C#中,這行代碼僅會為Something 對象創建一個引用,但這個引用還沒有指嚮任何對象。對該變量調用方法或屬性會導緻錯誤。
  在C#中實例化一個引用對象需要使用new 關鍵字。如上所述,創建一個引用,使用new 關鍵字把該引用指嚮存儲在堆上的一個對象:
  objSomething = new Something(); // This creates a Something on the heap
  2.3.2 類型推斷
  類型推斷(type inference)使用var 關鍵字。聲明變量的語法有些變化。編譯器可以根據變量的初始化值“推斷”變量的類型。例如:
  int someNumber = 0;
  就變成:
  var someNumber = 0;
  即使someNumber 從來沒有聲明為int,編譯器也可以確定,隻要someNumber 在其作用域內,就是一個int。編譯後,上麵兩個語句是等價的。
  下麵是另一個小例子:
  using System;
  namespace Wrox
  {
  class Program
  {
  static void Main(string[] args)
  {
  var name = "Bugs Bunny";
  var age = 25;
  var isRabbit = true;
  Type nameType = name.GetType();
  Type ageType = age.GetType();
  Type isRabbitType = isRabbit.GetType();
  Console.WriteLine("name is type " + nameType.ToString());
  Console.WriteLine("age is type " + ageType.ToString());
  Console.WriteLine("isRabbit is type " + isRabbitType.ToString());
  }
  }
  }
  這個程序的輸齣如下:
  name is type System.String
  age is type System.Int32
  isRabbit is type System.Bool
  需要遵循一些規則:
  ● 變量必須初始化。否則,編譯器就沒有推斷變量類型的依據。
  ● 初始化器不能為空。
  ● 初始化器必須放在錶達式中。
  ● 不能把初始化器設置為一個對象,除非在初始化器中創建瞭一個新對象。
  第3 章在討論匿名類型時將詳細探討。聲明瞭變量,推斷齣瞭類型後,就不能改變變量類型瞭。變量的類型確定後,就遵循其他變量類型遵循的強類型化規則。
  2.3.3 變量的作用域
  變量的作用域是可以訪問該變量的代碼區域。一般情況下,確定作用域遵循以下規則:
  ● 隻要類在某個作用域內,其字段(也稱為成員變量)也在該作用域內。
  ● 局部變量存在於錶示聲明該變量的塊語句或方法結束的右花括號之前的作用域內。
  ● 在for、while 或類似語句中聲明的局部變量存在於該循環體內。
  1. 局部變量的作用域衝突
  大型程序在不同部分為不同的變量使用相同的變量名很常見。隻要變量的作用域是程序的不同部分,就不會有問題,也不會産生多義性。但要注意,同名的局部變量不能在同一作用域內聲明兩
  次,所以不能使用下麵的代碼:
  int x = 20;
  // some more code
  int x = 30;
  考慮下麵的代碼示例:
  using System;
  namespace Wrox.ProCSharp.Basics
  {
  public class ScopeTest
  {
  public static int Main()
  {
  for (int i = 0; i < 10; i++)
  {
  Console.WriteLine(i);
  } // i goes out of scope here
  // We can declare a variable named i again, because
  // there's no other variable with that name in scope
  for (int i = 9; i >= 0; i—)
  {
  Console.WriteLine(i);
  } // i goes out of scope here.
  return 0;
  }
  }
  }
  這段代碼使用兩個for 循環打印0~9 的數字,再逆序打印0~9 的數字。重要的是在同一個方法中,代碼中的變量i 聲明瞭兩次。可以這麼做的原因是i 在兩個不同的循環內部聲明,所以變量i
  對於各自的循環來說是局部變量。
  下麵是另一個例子:
  public static int Main()
  {
  int j = 20;
  for (int i = 0; i < 10; i++)
  {
  int j = 30; // Can't do this — j is still in scope
  Console.WriteLine(j + i);
  }
  return 0;
  }
  如果試圖編譯它,就會産生如下錯誤:
  ScopeTest.cs(12,15): error CS0136: A local variable named 'j' cannot be declared in
  this scope because it would give a different meaning to 'j', which is already used
  in a 'parent or current' scope to denote something else.
  其原因是:變量j是在for循環開始前定義的,在執行for循環時應處於其作用域內,在Main()方法結束執行後,變量j纔超齣作用域,第2個j(不閤法)則在循環的作用域內,該作用域嵌套在Main()方法的作用域內。因為編譯器無法區分這兩個變量,所以不允許聲明第2個變量。
  2. 字段和局部變量的作用域衝突
  某些情況下,可以區分名稱相同(盡管其完全限定的名稱不同)、作用域相同的兩個標識符。此時編譯器允許聲明第2 個變量。原因是C#在變量之間有一個基本的區分,它把在類型級彆聲明的變
  量看作字段,而把在方法中聲明的變量看作局部變量。
  考慮下麵的代碼:
  using System;
  namespace Wrox
  {
  class ScopeTest2
  {
  static int j = 20;
  public static void Main()
  {
  int j = 30;
  Console.WriteLine(j);
  return;
  }
  }
  }
  雖然在Main()方法的作用域內聲明瞭兩個變量j,這段代碼也會編譯——在類級上定義的j,在該類刪除前是不會超齣作用域的(在本例中,當Main()方法終止,程序結束時,纔會刪除該類);以
  及在Main()中定義的j。此時,在Main()方法中聲明的新變量j 隱藏瞭同名的類級變量,所以在運行這段代碼時,會顯示數字30。但是,如果要引用類級變量,該怎麼辦?可以使用語法object.fieldname,在對象的外部引用類或結構的字段。在上麵的例子中,我們訪問靜態方法中的一個靜態字段(靜態字段詳見下一節),所以不能使用類的實例,隻能使用類本身的名稱:
  ..
  public static void Main()
  {
  int j = 30;
  Console.WriteLine(j);
  Console.WriteLine(ScopeTest2.j);
  }
  ..
  如果要訪問一個實例字段(該字段屬於類的一個特定實例),就需要使用this 關鍵字。
……

前言/序言


用户评价

评分

此用户未及时填写评价内容,系统默认好评!

评分

价格便宜,超级实惠,明年再来

评分

不错不错分量足就是买错了多点了一本我就有点不开心了gg

评分

很好。和想象的一样

评分

我要变强,我要变强,我要变强

评分

此用户未及时填写评价内容,系统默认好评!

评分

很不错的书 很有用 强烈推荐

评分

很不错的书,趁着这回打折力度很大,买了好多

评分

C#高级编程(第9版) C# 5.0 &amp; .NET

相关图书

本站所有內容均為互聯網搜索引擎提供的公開搜索信息,本站不存儲任何數據與內容,任何內容與數據均與本站無關,如有需要請聯繫相關搜索引擎包括但不限於百度google,bing,sogou

© 2025 tushu.tinynews.org All Rights Reserved. 求知書站 版权所有