C# 6.0本質論

C# 6.0本質論 pdf epub mobi txt 电子书 下载 2025

馬剋·米凱利斯(Mark Michaelis),埃裏剋·利珀特(Eric Lippert) 著,周靖,龐燕 譯
圖書標籤:
  • C#
  • C# 6
  • 0
  • 編程
  • 開發
  • 技術
  • 計算機
  • 書籍
  • 教程
  • 微軟
  • dotnet
  • 高級編程
想要找书就要到 求知書站
立刻按 ctrl+D收藏本页
你会得到大惊喜!!
出版社: 人民邮电出版社
ISBN:9787115441317
版次:05
商品编码:12117118
品牌:异步图书
包装:平装
开本:16开
出版时间:2017-01-01
页数:620
正文语种:中文

具体描述

編輯推薦

● C#入門及進階的進階之作
● 內容全麵翔實,講解精彩
● 全新升級版,涵蓋C# 6.0

作為曆年來深受讀者歡迎的C#指南,本書針對C# 6.0和.NET 4.6引入的新功能和新編程模式進行瞭全麵升級,嚮讀者展示如何編寫簡潔、強大、健壯、安全和易於維護的C#代碼。
長期的微軟極有價值專傢(MVP)和技術代言人Mark Michaelis與微軟C#編譯器團隊的前C#主要開發者Eric Lippert這兩位世界C#專傢對這一語言進行瞭全麵而深入的探討,用簡潔、可下載的代碼示例闡釋關鍵構造,為讀者進行C#軟件開發打好基礎。
無論是創建全新的代碼,還是維護已有的係統,本書都讓讀者使用各種版本的C#進行程序開發更加容易。書中頁邊隨附版本指示標簽有助於辨識語言的創新功能在哪個版本中發揮作用。書中對初學者主題和高級主題進行瞭明顯區分。C#的新手可通過本書快速上手,有經驗的C#開發者可通過學習C# 6.0的創新技術來瞭解如何應對當今復雜的編程挑戰。這一版還更新瞭使用C# 6.0構造的編碼規範,編寫C#代碼實踐一目瞭然。
本書適閤對C#感興趣的各層次讀者,無論對初學者還是C#專傢,本書都是一本很有價值的參考書。

內容簡介

這是 C#領域中一部廣受好評的名作,作者用一種易於理解的方式詳細介紹瞭 C#語言的各個方麵。全書共有21章和4個附錄(其中有2個附錄從網上下載),介紹瞭 C#語言的數據類型、操作符、方法、類、接口、異常處理等基本概念,深入討論瞭泛型、迭代器、反射、綫程和互操作性等高級主題,還介紹瞭LINQ技術,以及與其相關的擴展方法、分部方法、Lambda錶達式、標準查詢操作符和查詢錶達式等內容。每章開頭的“思維導圖”指明本章要討論的主題,以及各個主題之間的層次關係。為瞭幫助讀者理解各種 C#構造,書中用豐富的示例展示每一種特性,而且為每個概念都提供瞭相應的規範和實踐,以確保代碼能順利編譯、避免留下隱患,並獲得相應的可維護性。

作者簡介

Mark Michaelis是IntelliTect的創辦者,並任該公司首席技術架構師和培訓師。近二十年來,他一直是微軟的MVP,2007年被評為微軟技術代言人(Microsoft RegionalDirector)。他還服務於幾個微軟軟件設計評審團隊,包括C#、SharePoint和VisualStudio ALM。他經常在開發者大會上做演講,並撰寫過大量文章和書籍。

Eric Lippert是Coverity/Synopsys的C#分析團隊的開發者。他曾是微軟C#編譯器團隊的主要開發者,也是C#語言設計團隊的成員之一。在微軟工作的16年中,他曾參與VBScript、JScript、Windows Script Host和Visual Studio Tools for Office的設計和實現。他還服務於ECMA的JavaScript標準委員會。

譯者介紹
周靖 微軟極有價值專傢(C# MVP),理工男,知名譯者。從事計算機行業二十多年,涉獵廣泛,具有深厚的技術功底和良好的文學素養,翻譯風格嚴謹、準確、樸實、流暢,深受讀者歡迎。代錶譯著有《Visual C#從入門到精通》《C#本質論》《Windows核心編程(第5版)》《CLR via C#(第4版)》和Walter Savitch教授的《C++程序設計》係列版本。

龐燕 北京大學理學博士。從事軟件、互聯網行業開發工作多年,發錶多篇計算機專業相關論文,對多部計算機著作進行過審校。目前主要感興趣的領域是大數據計算、分布式計算、軟件架構和方法學,緻力於提高軟件開發的品質和效率。

目錄

第1章 C#概述 1
1.1 Hello, World 1
1.2 C#語法基礎 3
1.2.1 C#關鍵字 3
1.2.2 標識符 4
1.2.3 類型定義 5
1.2.4 Main 6
1.2.5 語句和語句分隔符 7
1.2.6 空白 8
1.2.7 使用變量 8
1.2.8 數據類型 9
1.2.9 變量的聲明 9
1.2.10 變量的賦值 10
1.2.11 變量的使用 11
1.3 控製颱輸入和輸齣 11
1.3.1 從控製颱獲取輸入 11
1.3.2 將輸齣寫入控製颱 12
1.3.3 注釋 14
1.3.4 應用程序接口 16
1.3.5 托管執行和公共語言基礎結構 16
1.3.6 C#和.NET版本 18
1.3.7 CIL和ILDASM 18
1.4 小結 21
第2章 數據類型 22
2.1 基本數值類型 22
2.1.1 整數類型 23
2.1.2 浮點類型 24
2.1.3 十進製浮點類型 24
2.1.4 字麵量 25
2.2 更多基本類型 28
2.2.1 布爾類型 28
2.2.2 字符類型 28
2.2.3 字符串 30
2.3 null和void 36
2.3.1 null 37
2.3.2 void 37
2.4 類型的分類 39
2.4.1 值類型 39
2.4.2 引用類型 40
2.5 可空修飾符 41
2.6 數據類型之間的轉換 41
2.6.1 顯式轉型 41
2.6.2 隱式轉型 43
2.6.3 不使用轉型操作符的類型轉換 44
2.7 數組 45
2.7.1 數組的聲明 46
2.7.2 數組的實例化和賦值 47
2.7.3 數組的使用 50
2.7.4 字符串作為數組使用 54
2.7.5 常見數組錯誤 55
2.8 小結 56
第3章 操作符和控製流 57
3.1 操作符 57
3.1.1 一元操作符正和負 58
3.1.2 二元算術操作符 58
3.1.3 復閤賦值操作符 64
3.1.4 遞增和遞減操作符 65
3.1.5 常量錶達式和常量符號 68
3.2 控製流程概述 68
3.2.1 if語句 70
3.2.2 嵌套if 71
3.3 代碼塊 72
3.4 代碼塊、作用域和聲明空間 74
3.5 布爾錶達式 75
3.5.1 關係操作符和相等性操作符 76
3.5.2 邏輯布爾操作符 77
3.5.3 邏輯求反操作符 78
3.5.4 條件操作符 78
3.5.5 空接閤操作符 79
3.5.6 null條件操作符 80
3.6 按位操作符 82
3.6.1 移位操作符 83
3.6.2 按位操作符 83
3.6.3 按位賦值操作符 85
3.6.4 按位取反操作符 86
3.7 控製流語句(續) 86
3.7.1 while和do/while循環 86
3.7.2 for循環 88
3.7.3 foreach循環 90
3.7.4 switch語句 92
3.8 跳轉語句 94
3.8.1 break語句 94
3.8.2 continue語句 96
3.8.3 goto語句 97
3.9 C#預處理指令 98
3.9.1 排除和包含代碼 99
3.9.2 定義預處理符號 100
3.9.3 生成錯誤和警告 100
3.9.4 關閉警告消息 101
3.9.5 nowarn:選項 101
3.9.6 指定行號 101
3.9.7 可視編輯器提示 102
3.10 小結 103
第4章 方法和參數 105
4.1 方法的調用 106
4.1.1 命名空間 107
4.1.2 類型名稱 108
4.1.3 作用域 109
4.1.4 方法名稱 109
4.1.5 形參和實參 109
4.1.6 方法返迴值 109
4.1.7 語句與方法調用的比較 110
4.2 方法的聲明 110
4.2.1 形式參數聲明 112
4.2.2 方法返迴類型聲明 112
4.2.3 錶達式主體方法 113
4.3 using指令 114
4.3.1 using static指令 115
4.3.2 使用彆名 116
4.4 Main()的返迴值和參數 117
4.5 方法的參數 119
4.5.1 值參數 119
4.5.2 引用參數(ref) 120
4.5.3 輸齣參數(out) 121
4.5.4 參數數組 123
4.6 遞歸 125
4.7 方法重載 127
4.8 可選參數 129
4.9 用異常實現基本錯誤處理 132
4.9.1 捕獲錯誤 133
4.9.2 使用throw語句報告錯誤 139
4.10 小結 142
第5章 類 143
5.1 類的定義和實例化 145
5.2 實例字段 148
5.2.1 實例字段的聲明 148
5.2.2 實例字段的訪問 148
5.3 實例方法 149
5.4 使用this關鍵字 150
5.5 訪問修飾符 155
5.6 屬性 157
5.6.1 屬性的聲明 158
5.6.2 自動實現的屬性 159
5.6.3 屬性和字段的設計編碼規範 161
5.6.4 提供屬性驗證 162
5.6.5 隻讀屬性和隻寫屬性 163
5.6.6 屬性作為虛字段使用 165
5.6.7 為取值方法和賦值方法指定訪問修飾符 166
5.6.8 屬性和方法調用不允許作為ref或out參數值使用 168
5.7 構造器 169
5.7.1 構造器的聲明 169
5.7.2 默認構造器 170
5.7.3 對象初始化器 171
5.7.4 構造器的重載 172
5.7.5 構造器鏈:使用this調用另一個構造器 173
5.8 靜態成員 177
5.8.1 靜態字段 177
5.8.2 靜態方法 179
5.8.3 靜態構造器 180
5.8.4 靜態屬性 181
5.8.5 靜態類 182
5.9 擴展方法 184
5.10 封裝數據 185
5.10.1 const 185
5.10.2 readonly 186
5.11 嵌套類 187
5.12 分部類 189
5.12.1 定義分部類 189
5.12.2 分部方法 190
5.13 小結 192
第6章 繼承 193
6.1 派生 194
6.1.1 基類型和派生類型之間的轉型 196
6.1.2 private訪問修飾符 197
6.1.3 protected訪問修飾符 198
6.1.4 擴展方法 199
6.1.5 單繼承 199
6.1.6 密封類 201
6.2 基類的重寫 201
6.2.1 virtual修飾符 202
6.2.2 new修飾符 205
6.2.3 sealed修飾符 208
6.2.4 base成員 208
6.2.5 構造器 209
6.3 抽象類 210
6.4 所有類都從System.Object派生 214
6.5 使用is操作符驗證基礎類型 215
6.6 使用as操作符進行轉換 215
6.7 小結 217
第7章 接口 218
7.1 接口概述 218
7.2 通過接口實現多態性 220
7.3 接口實現 223
7.3.1 顯式成員實現 225
7.3.2 隱式成員實現 226
7.3.3 顯式接口實現與隱式接口實現的比較 226
7.4 在實現類和接口之間轉換 227
7.5 接口繼承 227
7.6 多接口繼承 229
7.7 接口上的擴展方法 230
7.8 通過接口實現多繼承 231
7.9 版本控製 233
7.10 接口與類的比較 234
7.11 接口與特性的比較 235
7.12 小結 235
第8章 值類型 236
8.1 結構 236
8.1.1 結構的初始化 240
8.1.2 default操作符的使用 242
8.1.3 值類型的繼承和接口 242
8.2 裝箱 243
8.3 枚舉 248
8.3.1 枚舉之間的類型兼容性 251
8.3.2 枚舉和字符串之間的轉換 252
8.3.3 枚舉作為標誌使用 253
8.4 小結 256
第9章 良構類型 258
9.1 重寫object的成員 258
9.1.1 重寫ToString() 258
9.1.2 重寫GetHashCode() 259
9.1.3 重寫Equals() 261
9.2 操作符重載 267
9.2.1 比較操作符 267
9.2.2 二元操作符 268
9.2.3 賦值與二元操作符的結閤 269
9.2.4 條件邏輯操作符 270
9.2.5 一元操作符 270
9.2.6 轉換操作符 271
9.2.7 轉換操作符的規範 272
9.3 引用其他程序集 273
9.3.1 更改程序集目標 273
9.3.2 引用程序集 273
9.4 定義命名空間 276
9.5 XML注釋 279
9.5.1 將XML注釋與代碼構造關聯到一起 279
9.5.2 生成XML文檔文件 281
9.6 垃圾迴收 282
9.7 資源清理 284
9.7.1 終結器 284
9.7.2 使用using語句進行確定性終結 285
9.7.3 垃圾迴收、終結和IDisposable 288
9.8 延遲初始化 290
9.9 小結 291
第10章 異常處理 292
10.1 多異常類型 292
10.2 捕獲異常 294
10.3 常規catch塊 297
10.4 異常處理的規範 299
10.5 定義自定義異常 301
10.6 封裝異常並重新引發 303
10.7 小結 306
第11章 泛型 307
11.1 如果C# 沒有泛型 307
11.2 泛型類型概述 311
11.2.1 泛型類的使用 312
11.2.2 簡單泛型類的定義 313
11.2.3 泛型的優點 314
11.2.4 類型參數命名規範 314
11.2.5 泛型接口和結構 315
11.2.6 構造器和終結器的定義 316
11.2.7 默認值的指定 317
11.2.8 多個類型參數 317
11.2.9 元數 318
11.2.10 嵌套泛型類型 319
11.3 約束 320
11.3.1 接口約束 321
11.3.2 類類型約束 322
11.3.3 struct/class約束 323
11.3.4 多個約束 323
11.3.5 構造器約束 324
11.3.6 約束繼承 325
11.4 泛型方法 329
11.4.1 泛型方法類型推斷 329
11.4.2 約束的指定 330
11.5 協變性和逆變性 332
11.5.1 在C# 4.0中使用out類型參數修飾符允許協變性 333
11.5.2 在C# 4.0中使用in類型參數修飾符允許逆變性 334
11.5.3 數組對不安全協變性的支持 336
11.6 泛型的內部機製 336
11.7 小結 339
第12章 委托和Lambda錶達式 340
12.1 委托概述 341
12.1.1 背景 341
12.1.2 委托數據類型 342
12.1.3 委托類型的聲明 343
12.1.4 委托的實例化 344
12.2 Lambda錶達式 348
12.2.1 語句Lambda 348
12.2.2 錶達式Lambda 350
12.3 匿名方法 351
12.4 通用的委托:System.Func和System.Action 353
12.4.1 委托沒有結構相等性 354
12.4.2 外部變量 356
12.4.3 錶達式樹 359
12.5 小結 364
第13章 事件 366
13.1 使用多播委托來編碼Observer模式 367
13.1.1 定義訂閱者方法 367
13.1.2 定義發布者 368
13.1.3 連接發布者和訂閱者 368
13.1.4 調用委托 369
13.1.5 檢查null值 369
13.1.6 委托操作符 371
13.1.7 順序調用 373
13.1.8 錯誤處理 375
13.1.9 方法返迴值和傳引用 377
13.2 事件 378
13.2.1 事件的作用 378
13.2.2 事件的聲明 379
13.2.3 編碼規範 380
13.2.4 泛型和委托 382
13.2.5 自定義事件的實現 384
13.3 小結 385
第14章 支持標準查詢操作符的集閤接口 386
14.1 匿名類型和隱式類型的局部變量聲明 387
14.1.1 匿名類型 387
14.1.2 隱式類型的局部變量 388
14.1.3 匿名類型和隱式局部變量的更多注意事項 389
14.2 集閤初始化器 391
14.3 是什麼使類成為集閤:IEnumerable 394
14.3.1 foreach和數組 394
14.3.2 foreach和IEnumerable 394
14.3.3 foreach循環內不要修改集閤 398
14.4 標準查詢操作符 398
14.4.1 使用Where()來篩選 401
14.4.2 使用Select()來投射 402
14.4.3 使用Count()對元素進行計數 404
14.4.4 推遲執行 405
14.4.5 使用OrderBy()和ThenBy()來排序 408
14.4.6 使用Join()來執行 內部聯接 413
14.4.7 使用GroupBy分組結果 415
14.4.8 使用GroupJoin()實現一對多關係 416
14.4.9 調用SelectMany() 419
14.4.10 更多標準查詢操作符 420
14.5 小結 423
第15章 使用查詢錶達式的LINQ 424
15.1 查詢錶達式概述 425
15.1.1 投射 426
15.1.2 篩選 431
15.1.3 排序 432
15.1.4 let子句 433
15.1.5 分組 434
15.1.6 使用into進行查詢延續 436
15.1.7 用多個from子句“平整”序列的序列 437
15.2 查詢錶達式作為方法調用 438
15.3 小結 439
第16章 構建自定義集閤 440
16.1 更多集閤接口 441
16.1.1 IList與IDictionary  441
16.1.2 ICollection 442
16.2 主要集閤類 442
16.2.1 列錶集閤:List 442
16.2.2 全序 445
16.2.3 搜索List 446
16.2.4 字典集閤:Dictionary 447
16.2.5 已排序集閤:SortedDictionary和SortedList 452
16.2.6 棧集閤:Stack 452
16.2.7 隊列集閤:Queue 454
16.2.8 鏈錶:LinkedList 454
16.3 提供索引器 454
16.4 返迴null或者空集閤 457
16.5 迭代器 457
16.5.1 迭代器的定義 458
16.5.2 迭代器語法 458
16.5.3 從迭代器生成值 459
16.5.4 迭代器和狀態 460
16.5.5 更多的迭代器例子 461
16.5.6 將yield return語句放到循環中 463
16.5.7 取消更多的迭代:yield break 465
16.5.8 在單個類中創建多個迭代器 467
16.5.9 yield語句的要求 467
16.6 小結 468
第17章 反射、特性和動態編程 469
17.1 反射 469
17.1.1 使用System.Type訪問元數據 470
17.1.2 成員調用 471
17.1.3 泛型類型上的反射 476
17.2 nameof操作符 477
17.3 特性 478
17.3.1 自定義特性 481
17.3.2 查找特性 482
17.3.3 使用構造器來初始化特性 482
17.3.4 System.Attribute UsageAttribute 486
17.3.5 命名參數 487
17.4 使用動態對象進行編程 495
17.4.1 使用dynamic調用反射 496
17.4.2 dynamic的原則和行為 497
17.4.3 為什麼需要動態綁定 498
17.4.4 靜態編譯與動態編程的比較 499
17.4.5 實現自定義動態對象 500
17.5 小結 502
第18章 多綫程處理 504
18.1 多綫程基礎 506
18.2 使用System.Threading 509
18.2.1 使用System.Threading.Thread進行異步操作 509
18.2.2 綫程管理 511
18.2.3 在生産代碼中不要讓綫程進入睡眠 511
18.2.4 在生産代碼中不要中止綫程 512
18.2.5 綫程池處理 513
18.3 異步任務 514
18.3.1 從Thread到Task 515
18.3.2 理解異步任務 515
18.3.3 任務延續 518
18.3.4 用AggregateException處 理Task上的未處理異常 522
18.4 取消任務 527
18.4.1 Task.Run()是Task.Factory.StartNew()的簡化形式 529
18.4.2 長時間運行的任務 530
18.4.3 對任務進行資源清理 530
18.5 基於任務的異步模式 531
18.5.1 以同步方式調用高延遲操作 531
18.5.2 使用TPL異步調用高 延遲操作 532
18.5.3 通過async和await實現基於任務的異步模式 535
18.5.4 異步Lambda 538
18.5.5 任務調度器和同步上下文 543
18.5.6 async/await和Windows UI 545
18.5.7 await操作符 546
18.6 並行迭代 547
18.7 並行執行LINQ查詢 554
18.8 小結 557
第19章 綫程同步 559
19.1 為什麼要同步 560
19.1.1 使用Monitor來同步 563
19.1.2 使用lock關鍵字 565
19.1.3 lock對象的選擇 566
19.1.4 為什麼要避免鎖定this、typeof(type)和string 566
19.1.5 將字段聲明為volatile 568
19.1.6 使用System.Threading.Interlocked類 568
19.1.7 多個綫程時的事件通知 569
19.1.8 同步設計最佳實踐 570
19.1.9 更多的同步類型 571
19.1.10 綫程本地存儲 577
19.2 計時器 579
19.3 小結 581
第20章 平颱互操作性和不安全的代碼 582
20.1 平颱調用 583
20.1.1 外部函數的聲明 583
20.1.2 參數的數據類型 584
20.1.3 使用ref而不是指針 585
20.1.4 為順序布局使用StructLayoutAttribute 585
20.1.5 錯誤處理 586
20.1.6 使用SafeHandle 588
20.1.7 外部函數的調用 589
20.1.8 用包裝器簡化API調用 591
20.1.9 函數指針映射到委托 591
20.1.10 編碼規範 592
20.2 指針和地址 592
20.2.1 不安全的代碼 592
20.2.2 指針的聲明 593
20.2.3 指針的賦值 594
20.2.4 指針的解引用 596
20.2.5 訪問被引用物類型的成員 598
20.2.6 通過委托執行不安全的代碼 598
20.3 在C#中使用WinRT庫 599
20.3.1 具有自定義Add/Remove處理程序的WinRT事件 600
20.3.2 自動變換的接口 601
20.3.3 基於任務的異步 601
20.4 小結 601
第21章 CLI 602
21.1 CLI的定義 602
21.2 CLI實現 603
21.3 C#編譯成機器碼 604
21.4 運行時 605
21.4.1 垃圾迴收 606
21.4.2 .NET的垃圾迴收 606
21.4.3 類型安全 607
21.4.4 代碼訪問安全性 607
21.4.5 平颱可移植性 607
21.4.6 性能 608
21.5 應用程序域 608
21.6 程序集、清單和模塊 609
21.7 公共中間語言 610
21.8 公共類型係統 611
21.9 公共語言規範 611
21.10 基類庫 612
21.11 元數據 612
21.12 小結 612
附錄A 下載和安裝C#編譯器與CLI平颱 614
附錄B 井字棋源代碼清單 617
附錄C 使用TPL和C# 6.0之前的多綫程處理模式(網上下載)
附錄D C# 6.0的async/await模式之前的計時器(網上下載)

精彩書摘

  《C# 6.0本質論》:
  18.3.1 從Thread到Task
  創建綫程代價高昂,而且每個綫程都要占用大量虛擬內存(默認1 MB)。前麵說過,更有效的做法是使用綫程池,需要時分配綫程,為綫程分配異步工作,運行直至結束,再為後續的異步工作重用綫程,而不是在工作結束後銷毀再重新創建綫程。
  在NET Framework 4中,TPL不是每次開始異步工作時郜創建一個綫程,而是創建一個Task,並告訴任務調度器有異步工作要執行。此時任務調度器可能采取多種策略實現這一目的,但默認是從綫程池請求一個工作者綫程。綫程池會自行判斷怎麼做最高效。可能在當前任務結束後再運行新任務,也可能將新任務的工作者綫程調度到特定處理器上。綫程池還會判斷是創建一個全新綫程,還是重用一個之前已結束運行的現有綫程。
  通過將異步工作的概念抽象到Task對象中,TPL提供瞭一個能代錶異步工作的對象,還提供瞭相應的API以便與工作進行交互。通過提供代錶工作單元的對象,TPL使我們能通過編程將小任務閤並成大任務,從而建立起一個工作流程,詳情請參見稍後的討論。
  任務是對象,其中封裝瞭以異步方式執行的工作。,這聽起來有點兒耳熟,委托不也是封裝瞭代碼的對象嗎?區彆在於,委托是同步的,而任務是異步的。如果執行一個委托(例如一個Action),當前綫程的控製點會立即轉移到委托的代碼;除非委托結束,否則控製不會返迴調用者。相反,啓動一個任務,控製兒乎立即返迴調用者,無論任務要執行多少工作,任務在另一個綫程上異步執行(本章梢後會講到,可以隻用一個綫程來異步執行任務,而且這樣做還有一些好處)。簡單地說,任務將委托從同步執行模式轉變成異步。
  ……

用户评价

评分

正版图书,很不错

评分

包装不错 比较适合有一定基础的程序员

评分

比较基础吧 不过也是以看看就当作查漏补缺了

评分

很不错,学习中

评分

too哦哦用我的哦哦www,可以

评分

评分

整体感觉还是挺好的,内容看了一部分应该比其他的同类的书籍好一点

评分

很好

评分

很好(?▽?)

相关图书

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

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