您好,欢迎来到聚文网。 登录 免费注册
构建高质量的C#代码

构建高质量的C#代码

  • 字数: 644000.0
  • 装帧: 平装
  • 出版社: 电子工业出版社
  • 作者: 曹化宇 著
  • 出版日期: 2013-04-01
  • 商品条码: 9787121197130
  • 版次: 1
  • 开本: 16开
  • 页数: 431
  • 出版年份: 2013
定价:¥69 销售价:登录后查看价格  ¥{{selectedSku?.salePrice}} 
库存: {{selectedSku?.stock}} 库存充足
{{item.title}}:
{{its.name}}
精选
内容简介
作为软件的基石,代码的质量决定了最终产品的质量,本书从这一点出发,介绍了高质量C#代码的成就过程,即从基础代码到软件结构,以及不断优化和重构的过程。本书主要内容包括C#的基本语法、结构与应用特点,常用开发资源与技术要点,设计模式在C#中的应用等,以及特别重要的一点,即我们应该养成良好的开发习惯,不仅要注重技术细节,还要从更宽阔的视野角度来重新审视代码的构建工作。
无论你是C#初学者,还是正在应用C#的开发者,如果你关注代码的质量,愿意进一步提高软件项目的质量,本书能为你提供帮助。
目录
第1章  开启C#之旅 1
1.1  软件开发概述 1
1.1.1  开发应用软件 1
1.1.2  软件开发的一般步骤 2
1.2  代码构建的重要性 3
1.3  认识C#编程语言 4
1.3.1  C#简史 5
1.3.2  C#关键字及相关标识符 6
1.3.3  C#中的语句和表达式 7
1.4  构建C#开发环境 8
1.4.1  安装开发环境 8
1.4.2  C#程序的基本结构 10
1.4.3  如何创建窗体程序 12
1.5  高质量代码准则:可阅读 15
1.5.1  养成好的代码编写习惯 15
1.5.2  代码不是私人财产,而是艺术品 16
1.5.3  代码应该具有可维护性 16
1.5.4  注释你的代码 16
1.6  高质量代码准则:用实践证明一切 17
1.7  高质量代码准则:好心情带来高质量 18
1.8  准备你的开发工具箱 19
第2章  处理数据 21
2.1  C#数据处理基础 21
2.1.1  C#数据类型 21
2.1.2  变量与常量 23
2.1.3  高质量代码准则:给变量起个好名字 24
2.1.4  值类型与引用类型 25
2.1.5  字面值 26
2.2  整数 26
2.2.1  整数的一般运算 26
2.2.2  溢出检查 28
2.2.3  ++与--运算 31
2.2.4  移位运算 32
2.2.5  高质量代码准则:准确使用整数 33
2.3  浮点数与decimal类型 34
2.3.1  浮点数与decimal数据的运算 34
2.3.2  高质量代码准则:合理使用浮点数和decimal类型 35
2.4  布尔类型 40
2.4.1  布尔运算 40
2.4.2  布尔类型数据的用途 41
2.5  字符 41
2.5.1  char类型 41
2.5.2  ASCII码表(0~127) 42
2.6  字符串 44
2.6.1  转义字符 44
2.6.2  逐字字符串(@) 45
2.6.3  字符串的常用操作 46
2.6.4  单个字符时使用char类型 51
2.6.5  使用StringBuilder类型 52
2.7  日期与时间的处理 53
2.7.1  使用DateTime结构类型 53
2.7.2  获取中国农历信息 55
2.8  数据类型的转换 58
2.8.1  显式转换 58
2.8.2  隐式转换 60
2.8.3  TryParse()方法转换 60
2.8.4  使用Convert类 61
2.8.5  转换是有代价的 63
2.9  object类型 63
2.9.1  一切皆对象 63
2.9.2  装箱和拆箱 64
2.9.3  高质量代码准则:object不应作为万能类型 65
2.10 C#运算符 67
第3章  控制程序流程 69
3.1  if语句 69
3.1.1  使用if语句 69
3.1.2  注意事项 76
3.2  switch语句 77
3.2.1  使用switch语句 77
3.2.2  注意事项 81
3.3  for语句 81
3.3.1  使用for语句 81
3.3.2  注意事项 84
3.4  while语句 85
3.4.1  使用while语句 85
3.4.2  注意事项 86
3.5  do语句 86
3.5.1  使用do语句 86
3.5.2  注意事项 87
3.6  foreach语句 88
3.6.1  使用foreach语句 88
3.6.2  注意事项 89
3.7  break语句 89
3.8  continue语句 90
3.9  goto语句与标签 91
第4章  处理异常 93
4.1  C#中的异常处理 93
4.1.1  Exception类型 93
4.1.2  try-catch语句结构 93
4.1.3  处理具体的异常类 95
4.1.4  使用finally语句块 96
4.1.5  throw语句 98
4.2  高质量代码准则:处理异常智能化、模式化 100
4.3  在Visual C#中调试代码 101
第5章  数组 106
5.1  C#中的数组 106
5.1.1  简单数组 106
5.1.2  洗牌――随机排序算法 109
5.1.3  多维数组 110
5.2  使用Array类 113
5.2.1  排序 113
5.2.2  反序排列 114
5.2.3  修改成员数量 115
5.3  使用ArrayList类 116
5.4  使用Hashtable类 118
5.5  表驱动法――完善中国农历信息的处理 120
第6章  结构 124
6.1  创建结构类型 124
6.2  结构成员 125
6.2.1  结构中的方法 125
6.2.2  结构中的属性 126
6.2.3  其他成员 128
6.3  结构的应用 128
第7章  枚举 130
7.1  C#中的枚举 130
7.2  枚举的应用 133
第8章  类 135
8.1  创建类的作用与目的 135
8.2  C#中的类 135
8.2.1  创建类 135
8.2.2  创建类的实例 136
8.2.3  构造函数与析构函数 137
8.2.4  构造函数的重载 139
8.2.5  构造函数链 140
8.3  类成员的可访问性 141
8.4  变量 142
8.5  属性 142
8.6  方法 145
8.6.1  创建方法 145
8.6.2  方法的参数 147
8.6.3  方法的返回值 152
8.6.4  方法的重载 152
8.6.5  高质量代码准则:创建高质量的方法 154
8.7  索引器 154
8.8  静态类与静态成员 157
8.8.1  静态成员 157
8.8.2  静态类 159
8.9  关于类的更多内容 160
8.10 高质量代码准则:创建高质量的类 160
8.11 封装中国农历信息类 161
8.11.1  第一个版本 161
8.11.2  重构版本 165
第9章  类的继承 170
9.1  继承概述 170
9.1.1  现实世界中的继承 170
9.1.2  C#中的继承 170
9.1.3  能否继承 175
9.2  子类 176
9.2.1  扩展功能 177
9.2.2  隐藏基类成员 178
9.2.3  区分子类与基类成员 179
9.2.4  重写虚成员 181
9.3  抽象类与抽象成员 182
9.4  继承的局限性 187
第10章  接口 188
10.1  接口的特点 188
10.2  创建接口 189
10.3  实现接口 190
10.4  接口的继承 191
10.5  实现多个接口 193
第11章  委托与事件 197
11.1  访问者模式 197
11.2  委托 199
11.3  事件 201
11.4  多路广播委托 205
第12章  命名空间 207
12.1  命名空间的成员 207
12.2  命名空间的组织 208
12.3  引用与别名 209
12.3.1  引用命名空间 209
12.3.2  命名空间别名 210
12.4  使用Microsoft.VisualBasic命名空间 212
12.4.1  获取操作系统与内存信息 213
12.4.2  播放波形文件 215
12.4.3  网络基本应用 216
第13章  泛型 217
13.1  泛型方法 217
13.2  泛型类 218
13.3  约束 220
第14章  运算符重载 221
14.1  在结构中重载运算符 221
14.2  在类中重载运算符 223
第15章  资源同步与自动清理 226
15.1  多线程 226
15.2  易失域(volatile field) 229
15.3  lock语句 231
15.4  using语句 232
第16章  关于C#的其他主题 235
16.1  预处理 235
16.1.1  根据条件编译代码 235
16.1.2  发布警告或错误 237
16.1.3  定义代码区域 238
16.2  特性 238
16.2.1  使用DllImportAttribute特性 239
16.2.2  自定义特性 241
16.3  不安全代码 243
16.3.1  指针与寻址运算 244
16.3.2  sizeof运算 246
16.4  分部类型(partial type) 247
16.5  可空类型(nullable type) 249
第17章  代码的进化 251
17.1  从代码到架构 251
17.1.1  基础代码 251
17.1.2  代码集成 252
17.2  重构 252
17.3  设计模式 253
17.4  关注代码改进的过程 254
17.5  找寻.NET Framework中的设计模式 255
17.5.1  迭代器模式 255
17.5.2  适配器模式 258
17.5.3  模板方法模式 264
第18章  策略模式 266
18.1  虚拟战争游戏示例:使用策略模式组合作战单位 266
18.1.1  第一设计方案 266
18.1.2  陆、海、空 269
18.1.3  真正的设计方案 271
18.1.4  组合第一个作战单位 275
18.1.5  这一切是怎样发生的 277
18.2  应用分析 278
18.2.1  问题 279
18.2.2  解决方案 280
18.2.3  应用特点 284
第19章  工厂方法模式 285
19.1  虚拟战争游戏示例:控制作战单位的创建 285
19.1.1  收起自由创建单位的权力 285
19.1.2  控制作战单位类型 288
19.1.3  统一作战单位的创建方法 290
19.2  应用分析 294
19.2.1  问题 294
19.2.2  解决方案 295
19.2.3  使用空对象 299
19.2.4  应用特点 300
19.3  工厂方法的应用 301
19.3.1  代替构造函数 301
19.3.2  隐藏特殊对象的创建 303
第20章  抽象工厂模式 304
20.1  示例:模拟组装电脑 304
20.2  应用分析 310
20.2.1  问题 310
20.2.2  解决方案 311
20.2.3  应用特点 316
20.2.4  与工厂方法模式的对比 317
第21章  生成器模式 319
21.1  示例:创建汽车配置清单 319
21.2  应用分析 324
21.2.1  问题 324
21.2.2  解决方案 325
21.2.3  应用特点 331
第22章  单件模式 332
22.1  虚拟战争游戏示例:唯一的重要人物 332
22.1.1  重要人物登场 332
22.1.2  应用单件模式 334
22.2  应用分析 337
22.2.1  问题 337
22.2.2  解决方案 337
22.2.3  应用特点 338
22.2.4  多线程中的单件 338
第23章  观察者模式 341
23.1  订阅邮件――现实版观察者模式 341
23.2  虚拟战争游戏示例:空降作战 342
23.2.1  准备登机 342
23.2.2  诺曼底大空降 346
23.3  .NET Framework 4.0中的观察者 347
23.4  应用分析 351
23.4.1  问题 351
23.4.2  解决方案 351
23.4.3  应用特点 358
第24章  享元模式 359
24.1  虚拟战争游戏示例:点缀作战地图 359
24.1.1  第一个方案 359
24.1.2  使用享元模式 361
24.2  应用分析 364
24.2.1  问题 364
24.2.2  解决方案 364
24.2.3  应用特点 368
第25章  组合模式 369
25.1  虚拟战争游戏示例:多武器平台 369
25.1.1  一个平台,多种武器 369
25.1.2  使用组合模式 369
25.2  应用分析 372
25.2.1  问题 372
25.2.2  解决方案 372
25.2.3  应用特点 377
第26章  装饰者模式 378
26.1  三国游戏示例:装备提高战斗力 378
26.1.1  角色与装备 378
26.1.2  使用装饰者模式 381
26.2  应用分析 386
26.2.1  问题 386
26.2.2  解决方案 387
26.2.3  应用特点 389
第27章  状态模式 391
27.1  三国游戏示例:角色被击中后 391
27.1.1  添加角色状态 391
27.1.2  使用状态模式 395
27.2  应用分析 401
27.2.1  问题 401
27.2.2  解决方案 401
27.2.3  应用特点 404
第28章  桥接模式 406
28.1  绘图示例:绘制图形与文本 406
28.1.1  抽象与实现的分离 406
28.1.2  应用桥接模式 408
28.2  应用分析 414
28.2.1  问题 414
28.2.2  解决方案 415
28.2.3  应用特点 419
第29章  软件开发之路 420
29.1  C#与设计模式 420
29.2  如何使用设计模式 421
29.3  继续学习 422
附录A  设计模式名录 426
代码目录

代码 1 1:C#程序基本结构 9
代码 1 2:控制台输出(<Hello>\Program.cs) 9
代码 1 3:窗体的启动(<HelloForm>\Program.cs) 13
代码 1 4:退出按钮(<HelloForm>\Form1.cs) 14
代码 1 5:性能测试模板(<SpeedTestTemplate>\Program.cs) 18

代码 2 1:定义变量(<VariableDemo>\Program.cs) 23
代码 2 2:定义常量(<ConstantDemo>\Program.cs) 24
代码 2 3:整数除法运算应用错误演示(<DivisionDemo1>\Program.cs) 27
代码 2 4:浮点数除法(<DivisionDemo2>\Program.cs) 28
代码 2 5:整数溢出(<OverflowDemo>\Program.cs) 29
代码 2 6:检查溢出(<checkedDemo>\Program.cs) 29
代码 2 7:++运算(<PlusPlusDemo>\Program.cs) 31
代码 2 8:整数移位运算(<ShifeDemo>\Program.cs) 32
代码 2 9:计算两点间距离(<MathDemo>\Program.cs) 34
代码 2 10:Equals()方法比较数值(<EqualsDemo>\Program.cs) 36
代码 2 11:Round()方法获取指定小数位(<RoundDemo>\Program.cs) 36
代码 2 12:整数与浮点数运算速度测试(<SpeedTest>\Program.cs) 38
代码 2 13:布尔数据运算(<boolDemo>\Program.cs) 40
代码 2 14:字符及其编码的转换(<charDemo>\Program.cs) 42
代码 2 15:转义字符(<stringDemo1>\Program.cs) 44
代码 2 16:逐字字符串(<stringDemo2>\Program.cs) 46
代码 2 17:字符串连接(<stringDemo3>\Program.cs) 47
代码 2 18:字符串比较(<stringDemo4>\Program.cs) 48
代码 2 19:Equals()方法比较字符串(<stringDemo5>
代码 5 6:二维数组成员调用(<ArrayDemo6>\Program.cs) 112
代码 5 7:数组成员排序(<ArraySortDemo>\Program.cs) 113
代码 5 8:数组成员反序排列(<ArrayReverseDemo>\Program.cs
代码 8 8:定义类的属性(<propertyDemo>\Program.cs) 144
代码 8 9:定义类的方法(<methodDemo1>\Program.cs) 146
代码 8 10:方法的值参数(<methodDemo2>\Program.cs) 147
代码 8 11:方法的引用参数(<methodDemo3>\Program.cs) 148
代码 8 12:方法的输出参数(<methodDemo4>\Program.cs) 150
代码 8 13:方法的参数数组(<methodDemo5>\Program.cs) 151
代码 8 14:方法的重载(<methodDemo6>\Program.cs) 152
代码 8 15:定义类的索引器(<indexerDemo>\CDictionary.cs) 155
代码 8 16:索引器的应用(<indexerDemo>\Program.cs) 156
代码 8 17:定义类的静态成员(<staticDemo>\CTest.cs) 157
代码 8 18:静态成员的调用(<staticDemo>\Program.cs) 158
代码 8 19:定义静态类(<staticClassDemo>\CC.cs) 160
代码 8 20:封装农历信息类(<CnCalendar>\CCalendar.cs) 161
代码 8 21:添加(<CnCalendar>\Form1.cs) 164
代码 8 22:重构农历信息类(<CnCalendar1>\CCalendar1.cs) 165
代码 8 23:测试两个版本的农历信息类(<CnCalendear1>\Program
代码 10 3:接口测试(<interfaceDemo1>\Program.cs) 191
代码 10 4:接口的继承(<interfaceDemo2>\Program.cs) 192
代码 10 5:实现多个接口(<interfaceDemo3>\Program.cs) 193
代码 10 6:多接口同名方法区分(<interfaceDemo4>\Program.cs) 194
代码 10 7:接口类型转换调用(<interfaceDemo5>\Program.cs) 195

代码 11 1:委托的定义与应用(<delegateDemo1>\Program.cs) 199
代码 11 2:按钮控件Click事件响应代码结构(<eventDemo1>\Form1.cs) 201
代码 11 3:定义NumberTextBox控件(<eventDemo2>\NumberTextBox.cs) 202
代码 11 4:添加事件响应代码(<eventDemo2>\Form1.cs) 204
代码 11 5:多路广播委托(<MulticastDelegateDemo>\Program.cs) 205

代码 12 1:内部类(<classDemo>\Program.cs) 207
代码 12 2:不同命名空间中的同名类(<usingDemo>\Class1.cs) 210
代码 12 3:命名空间别名(<usingDemo>\Program.cs) 211
代码 12 4:类的别名(<usingDemo1>\Program.cs) 211
代码 12 5:获取操作系统与内存信息(<ComputerInfoDemo>\Program.cs) 213
代码 12 6:获取系统信息重构(<ComputerInfoDemo1>\Program.cs) 214
代码 12 7:播放波形文件(<AudioDemo>\Program.cs) 215

代码 13 1:定义泛型方法(<GenericDemo1>\Program.cs) 217
代码 13 2:定义泛型类(<GenericDemo2>\Program.cs) 219

代码 16 12:测试分部类型(<partialDemo>\Program.cs) 248
代码 16 13:可空类型(<nullableDemo>\Program.cs) 250

代码 17 1:foreach语句遍历窗体中的控件(<foreachDemo>\Program.cs) 255
代码 17 2:迭代器模式(实现IEnumerable接口)(<IteratorDemo>\Program.cs) 256
代码 17 3:适配器模式示例1(<AdapterDemo>\CDbY.cs) 259
代码 17 4:适配器模式示例2(<AdapterDemo>\CDbX.cs) 260
代码 17 5:适配器模式示例3(<AdapterDemo>\CDbYAdapter.cs) 261
代码 17 6:适配器模式示例4(<AdapterDemo>\CDb.cs) 261
代码 17 7:适配器模式示例5(<AdapterDemo>\Program.cs) 262

代码 18 1:策略模式示例(接口定义)(<StrategyDemo>\Interfaces.cs) 271
代码 18 2:策略模式示例(CUnit类)(<StrategyDemo>\CUnit.cs) 272
代码 18 3:策略模式示例(CWeapon类)(<StrategyDemo>\CWeapon.cs) 274
代码 18 4:策略模式示例(CBehavior类)(<StrategyDemo>\CBehavior.cs 274
代码 18 5:策略模式示例(行为类)(<StrategyDemo>\BehaviorAll.cs) 275
代码 18 6:策略模式示例(武器类)(<StrategyDemo>\WeaponAll.cs) 275
代码 18 7:策略模式示例(组合测试)(<StrategyDemo>\Program.cs) 276
代码 18 8:策略模式示例(CUnit类构造函数)(<StrategyDemo>\CUnit.cs) 276
代码 20 5:抽象工厂模式示例(内存类型)(<AbstractFactoryDemo>\MemoryAll.cs) 306
代码 20 6:抽象工厂模式示例(抽象工厂接口)(<AbstractFactoryDemo>\Interfaces.cs) 306
代码 20 7:抽象工厂模式示例(抽象工厂类)(<AbstractFactoryDemo>AbstractFactoryAll.cs) 307
代码 20 8:抽象工厂模式示例(CComputer类)(<AbstractFactoryDemo>\CComputer.cs) 308
代码 20 9:抽象工厂模式示例(应用测试)(<AbstractFactoryDemo>\Program.cs) 309
代码 20 10:抽象工厂模式模型(组件接口)(<AbstractFactoryPatternModel>\Interfaces.cs) 311
代码 20 11:抽象工厂模式模型(组件类)(<AbstractFactoryPatternModel>\CComponent.cs) 312
代码 20 12:抽象工厂模式模型(组件结构类型)(<AbstractFactoryPatternModel>PartAll.cs) 313
代码 20 13:抽象工厂模式模型(抽象工厂接口)(<AbstractFactoryPatternModel>Interfaces.cs) 314
代码 20 14:抽象工厂模式模型(抽象工厂基类)(<AbstractFactoryPatternModel>CAbstractFactory.cs) 314
代码 20 15:抽象工厂模式模型(抽象工厂类)(<AbstractFactoryPatternModel>AbstractFactoryAll.cs) 314
代码 20 16:抽象工厂模式模型(在组件中应用抽象工厂)(<AbstractFactoryPatternModel>CComponent.cs) 315
代码 20 17:抽象工厂模式模型(应用测试)(<AbstractFactoryPatternModel>\Program.cs) 315

代码 21 1:生成器模式示例(生成器接口)(<BuilderDemo>\ICarBuilder.cs) 319
代码 21 2:生成器模式示例(生成器基类)(<BuilderDemo>\CCarBuilder.cs) 320
代码 21 3:生成器模式示例(生成器类)(<BuilderDemo>\CarBuilderAll.cs) 320
代码 21 4:生成器模式示例(汽车配置清单类)(<BuilderDemo>\CCarScheme.cs) 321
代码 23 6:观察者模式示例(应用测试)(<ObserverDemo>\Program.cs) 346
代码 23 7:.NET中的观察者(实现IObserver<T>接口)(<IObservableAndIObserver>CObserver.cs) 348
代码 23 8:.NET中的观察者(实现IObservable接口)(<IObservableAndIObserver>CObservable.cs) 348
代码 23 9:.NET中的观察者(应用测试)(<IObservableAndIObserver>\Program.cs) 350
代码 23 10:观察者模式模型(接口定义)(<ObserverPatternModel>\Interfaces.cs) 353
代码 23 11:观察者模式模型(主题类)(<ObserverPatternModel>\CSubject.cs) 353
代码 23 12:观察者模式模型(观察者类)(<ObserverPatternModel>\CObserver.cs) 355
代码 23 13:观察者模式模型(应用测试)(<ObserverPatternModel>\Program.cs) 356

代码 24 1:享元模式示例(单位枚举类型)(<FlyweightDemo>\Enums.cs) 359
代码 27 4:状态模式示例(状态接口)(<StateDemo1>\Interfaces.cs) 395
代码 27 5:状态模式示例(状态基类)(<StateDemo1>\CUnitState.cs) 395
代码 27 6:状态模式示例(状态类型)(<StateDemo1>\UnitStateAll.cs) 396
代码 27 7:状态模式示例(单位接口)(<StateDemo1>\Interfaces.cs) 397
代码 27 8:状态模式示例(单位基类)(<StateDemo1>\CUnit.cs) 397
代码 27 9:状态模式示例(单位类型)(<StateDemo1>\Units.cs) 399
代码 27 10:状态模式示例(应用测试)(<StateDemo1>\Program.cs) 399
代码 27 11:状态模式模型(状态接口)(<StatePatternModel>\Interfaces.cs) 401
代码 27 12:状态模式模型(状态基类)(<StatePatternModel>\CState.cs) 402
代码 27 13:状态模式模型(状态类型)(<StatePatternModel>\States.cs) 402
代码 27 14:状态模式模型(组件类)(<StatePatternModel>\CComponent.cs) 403
代码 27 15:状态模式模型(应用测试)(<StatePatternModel>\Program.cs) 404

代码 28 1:桥接模式示例(图形信息接口)(<BridgeDemo>\Interfaces.cs) 406
代码 28 2:桥接模式示例(图形绘制接口)(<BridgeDemo>\Interfaces.cs) 407
代码 28 3:桥接模式示例(图形信息基类)(<BridgeDemo>\CShape.cs) 408
代码 28 4:桥接模式示例(图形绘制基类)(<BridgeDemo>\CShapeDraw.cs) 409
代码 28 5:桥接模式示例(图形信息类)(<BridgeDemo>\Shapes.cs) 410
代码 28 6:桥接模式示例(图形绘制类)(<BridgeDemo>\CShapeDrawGraphic.cs) 410
代码 28 7:桥接模式示例(文本绘制类)(<BridgeDemo>\CShapeDrawText.cs) 411
代码 28 8:桥接模式示例(绘制文本信息)(<BridgeDemo>\Form1.cs) 412
代码 28 9:桥接模式示例(绘制图形)(<BredgeDemo>\Form1.cs) 413
代码 28 10:桥接模式模型(接口定义)(<BridgePatternModel>\Interfaces.cs) 415
代码 28 11:桥接模式模型(组件基类)(<BridgePatternModel>\CComponent.cs) 416
代码 28 12:桥接模式模型(组件类)(<BridgePatternModel>\ComponentAll.cs) 416
代码 28 13:桥接模式模型(实现者类型)(<BridgePatternModel>\ImplementorAll.cs) 417
代码 28 14:桥接模式模型(应用测试)(<BridgePatternModel>\Program.cs) 418

蜀ICP备2024047804号

Copyright 版权所有 © jvwen.com 聚文网