《C#高级编程第6版》 读书笔记 (张迅雷闪击C#系列)

第一章  概述

MSIL=IL  microsoft中间语言
CTS   common type  system
CLS   Common Language  Specification  公共语言规范
CLR  公共语言允许库    在CLR的控制下运行的代码称为托管代码 managed  code
ildsm 实用工具。

WinCv  浏览结构库中的类、结构、接口、枚举。
WPF  是迈向声明性编程的一步,   XAML  
windows控件
Windows服务     System.ServiceProcess
WCF   ASP.NET  WEB服务 .NET  Remoting、Enterprise  Services  MSMQ

      ADO.NET  LINQ  
ASP.NET   早期绑定、继承、模块化。

IL与Java字节代码共享一种理念:他们都是低级语言,语法很简单(使用数字代码,而不是文本代码),IL总是即时编译(成为JIT编译),而Java字节代码常常是解释性的。

中间语言的主要特征:
 面向对象和使用接口
值类型和引用类型之间的巨大差别
强数据类型
使用异常来处理错误
使用特性(attrribute)

.NET接口与COM接口不同,但他与COM接口共享下述理念:提供一个契约,实现给定接口的类必须提供该接口指定的方法和属性的实现方式。

ildasm 是一个基于Windos的实用程序。

程序集(assemly)是包含编译好的、面向.NET Framework的代码的逻辑单元

第二章  基础知识

 var关键字 类型推断

如果在代码中没有对某个非整数值硬编码,则编译器一般假定该变量是double。
 c# 中只能把局部变量和字段声明为常量。
 常量:a 必须在声明时初始化,指定了其值后,就不能修改了。
       b  常量的值必须能在编译时用于计算,不能从其它变量中提取的值来初始化常量,如果需要这么做          ,应使用只读字段。
       c  常量总是静态的。

  值类型存储在堆栈中
  引用类型存储在托管堆上

   如果变量是一个引用,就可以把其值设置为null,表明他不引用任何对象。类似java的null  c++ NULL  vb中的nothing





C#中支持9种整型:sbyte,byte,short,ushort,int,
uint,long,ulong和char.  口诀记忆  sbs  ui ul uc  
傻逼傻  又爱幼儿UC


java的基本数据类8种      鄙视爱二胡 大cB
  byte      short  int  long   float double  char  boolean

   8        16     32    64   32     64       16    1

  c#  认为byte类和char类型完全不同,他们之间的编程转换必须显示写出。
  float
  double
  decimal  d=12.30M (m)
 8位到16位   ACII编码是Unicode的一个子集。
  \a 警告  \0  空   
  string  关键字,翻译为.NET类时,它就是System.String

  string  filepath=@"C:\Pro\Fist.cs.";

  ctrl+f5  可以停顿
  while 相当于vb中的while..Wend
  预测式的循环 前面一般把布尔标记设置为false
 
  do  while 是while的后测试版本  前置标记为true
  return语句用于退出类的方法,把控制权返回方法的调用者。

  Main()  方法必须是类或结构的静态方法,并且其返回类型必须是int或void
  csc /t:library  /doc:Math.xml   Math.cs
  预处理指令可以禁止编译与额哎功能相关的代码。
  switch  注意case的值必须是常量表达式——不允许使用变量

#define   #undef
 #if #elif  #else  #endif
#warning  #error
#region  #endregion
#line


第三章   对象和类型

   变量是通过值送给给方法的,被调用的方法得到的是变量的一个副本,对于复杂的数据类型,按引用传递的效率更高,因为在按值传递时,必须复制大量的数据。

    数据成员包含了类的数据——字段、常量、事件。可以是静态数据或实例数据。
    函数成员提供了操作类中数据的某些功能,包括方法、属性、构造函数和终结器、运算符以及索引器。

   vb  c  c++  可以定义与类完全不相关的全局函数,在c#中,每个函数都必须与类或结构相关。

  类是在heap上 ,而结构是存储在stack上,


第四章    继承
 每个结构都自动派生于System.ValueType
继承分为实现继承 和接口继承 后者被看做一种契约:让类型派生于接口,来保证为客户提供某个功能。

java  使用super  c#使用base
java密封用final   c#用sealed


修饰五类型    ppipp     任派集所和
修饰符            应用于                            说明
public            所有的类型和成员                任何代码均可访问该方法
protected         类型和内嵌类型的所有成员        只有派生的类型访问该方法
internal          类型和内嵌类型的所有成员        只能在包含它的程序集中访问该方法
private           所有的类型和成员                只能在它所属的类型中访问该方法
protected  internal    类型和内嵌类型的所有成员     只能在包含它的程序集和派生类中访问该方法


第五章  数组
一维数组
多维数组
锯齿数组
array  copy传递阶数相同、有足够元素空间的已有数组   clone创建一个新的数组
array.Sort 进行排序

ILIST

yield  return语句返回集合的一个元素,并移动到下一个元素上,yield break可停止迭代。

第六章  运算符和类型强制转换
  i  is  object  检查对象是否与特定的类型兼容,兼容表示对象是该类型。
  as 运算符用于执行引用类型的显示类型转换,as运算符允许在一步中进行安全类型转换,不需要先使用is运算符测试类型,再进行转换。
  sizeof运算符可以确定堆栈中值类型需要的长度(单位是字节)  在unsafe中使用
typeof运算符返回有一个表示特定类型的System.Type对象    使用反射技术动态查找对象的信息时,这个运算符很有效果。

::  命名空间别名限定符  
??  空结合运算符   可以在处理可空类型和引用类型时表示null值,第一个操作数必须是一个可空类型或引用类型。第二个操作数必须与第一个操作数的类型相同,或者可以隐含地转换为第一个操作数的类型。

在比较可空类型时,只要有一个操作数是null,比较的结果就是false。

@  在赋值字符串的前面,会屏蔽所有的转移字符。


运算符的优先级  初一算关,辑条值
隐式转换:自动转换,不丢失数据
显式转换:
装箱boxing: 用于把值类型转为引用类型。
拆箱unboxing: 术语是cast装箱的类型转换回值类型。

对象的比较
ReferenceEquals()方法 静态方法,即两个引用是否包含内存中的相同地址。


第七章  委托


委托实例:
   a   Thread。
   b   通用库类。
   c    事件  通知代码发生了什么事件。GUI编程主要是处理事件。
理解委托的一种好方式是把委托当做给方法签名和返回类型指定名称。
委托在语法上总是带有一个参数的构造函数,这个参数就是为头引用的方法。
list.FindAll(x=>x>5)
线程:c#中,计算机并行运行某些新的执行序列。
满足了委托的需求,这称为返回类型协变。
事件发送器定义接收器要使用的委托,接收器将事件处理程序注册到事件中。连接事件处理的过程称为封装事件。
添加多个事件处理程序,就是一个多播委托。

委托包括多个方法,这种委托称为多播委托,如果调用多播委托,就可以按顺序连续调用多个方法,为此,委托的签名就必须返回void;否则,就只能得到委托调用的最后一个方法的结果。

委托推断也可以用于事件,因为事件基于委托。
Delegate类定义了方法GetInvocationList(),它返回一个Delegate对象数组,可以捕获异常,并继续下一次迭代。

匿名方法是用作委托参数的一个代码块。
Windows的应用程序也是基于消息的,Windows又是使用预定义的消息与应用程序通信的。


第8章  字符串和正则表达式

多次修改或者长字符串 System.Text.StringBuilber  要比String要高。


第9章  泛型


泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个新功能。泛型将类型参数的概念引入 .NET Framework,类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候。例如,通过使用泛型类型参数 T,您可以编写其他客户端代码能够使用的单个类,而不致引入运行时强制转换或装箱操作的成本或风险。

c++中的模板相当于泛型
装箱和拆箱操作很容易使用,但性能损失比较大,迭代许多项时尤其如此。
泛型的优点:
a 性能
b 类型安全
c 二进制代码的重用
d 代码的扩展


泛型的约定:
a  泛型类型的名称用字母T作为前缀
b  如果没有特殊的要求,泛型类型允许用任意类替代,且只使用了一个泛型类型,就可以用字符T作为泛型类   型的名称。
c   如果泛型类型有特定的要求(例如必须实现一个接口或派生于基类),或者使用了两个或多个泛型类型,就应给泛型类型使用描述性的名称。
默认值
null只能用于引用类型,可以通过default关键字,将null赋予引用类型,将0赋予值类型。

Nullable<int>  x1;
int? x2;
都是可空int类型的实例
第10章  集合

队列  queue   private  readonly  Queue<Document>  documentQueue=new  Queue<Document>
栈     statck  lifo  后进先出   fifo  先进先出
链表  linkedlist
有序表 sortedlist
字典  称为映射或散列表   Dictionary
Hashset  
位数组  BitArray和结构的BitVector32。

数组的大小事固定的,但可以使用列表作为动态增长的集合。队列以先进先出的方式访问元素,栈以后进先出的方式访问元素。链表可以快速插入和删除元素,但搜索操作比较慢,通过键和值可以使用字典,它的搜索和插入操作比较快。hashset用于无序的唯一项。

第11章  LINQ
LINQ提供了不同数据源的抽象层,所以可以使用相同的语法。
用List<T>  在对象上执行传统查询
扩展方法  可以将方法写入最初没有提供该方法的类中。还可以把方法添加到实现某个接口的任何类中,这样多个类就可以使用相同的实现代码。为了区分扩展方法和一般的静态方法,扩展方法还需要给第一个参数使用this关键字。
人表达式
人运算符=>的左边是参数,不需要添加参数类型,因为他们是由编译器解析的,人运算符的右边定义了执行代码。而在匿名方法中,需要花括号和return语句。
linq查询  一个简化的查询几号。编译器编译查询表达式,调用扩展方法。
推迟查询执行
表达式树
linq提供程序
查询表达式必须以from字句开头,以select或group字句结束。在这两个字句之间,可以使用where orderby  join  let和其它from字句。
任何集合都可以获得FindAll()和Sort()方法   String类是密封的,所以不能从这个类中继承。但是可以执行一个扩展方法。
匿名方法中,需要花括号和return语句,人表达式可以包括也可以不包括。

生产操作符  生产操作符 Range()、Empty()、Repear()不是扩展方法、而是返回序列的正常静态方法。

人表达式也可以赋予Expression<T>  类型的参数,Expression<T>  类型指定,来自于人表达式的表达式树存储在程序集中。


使用TakeWhile()和SkipWhile()方法,还可以传送一个谓词,根据谓词的结果提取或跳过某些项。

第12章  内存管理和指针
虚拟寻址系统,改系统把程序可用的内存地址映射到硬件内存中的实际地址上,这些任务完全由windos在后台管理,其实际结果是32位处理器上的每个进程都可以使用4GB的内存。堆栈指针(操作系统维护的一个变量)表示堆栈中下一个自由空间的地址。程序第一次运行时,堆栈指针指向为堆栈保留的内存块末尾。
堆heap

不安全代码块命令  csc/unsafe MySource.CS    csc -unsafe MySource.CS


&  “取地址”   把一个值数据类型转换为指针
*   “获取地址的内容”  把一个指针转换为值数据类型  “间接寻址运算符” 有时候称为“取消引用运算符”

32位处理器的内存分解为4字节的块,windows上,每个快称为DWORD。堆栈给变量向下分配内存,总是按4字节的倍数进行分配。

分配高性能的数组,stackalloc 分配堆栈上的一定量的内存,2条信息  a  要存储的数据类型;需要存储的数据项数。


第13章  反射  普通术语,描述在运行过程中检查和处理程序元素的功能。
完成以下任务:

a  枚举类型的成员
b  实例化新对象
c  查找对象的成员
d  查找类型的信息
e  查找程序集的信息
f  检查应用于类型的定制特性
g  创建和编译新程序集
支持反射的一些基类
   System.Type
   System.Reflection.Assembly类

第14章  错误和异常

finally块应包含总是执行的清理代码,如果finally块防止了return语句,编译器就会标记一个错误。


第二部分 visual  studio2008

第15章   IDE

intelliSense列表框不见时,按下快捷键Ctrl+Space
obj的子文件夹存储各种临时或中间文件,bin的子文件夹存储编译好的程序集。
design view,
自己定制的组件类别添加到工具箱中,方法是右击任一类别,从弹出的菜单中选择Add tab,从该菜单中选择Choose Items,就可以把其它工具放在工具箱中。
pin按钮  钉住或不钉住窗口。
断点  单击该行,或者按下F9   debug-windows-breakpoints  设置条件断点
修订功能  菜单的Refactoring选项
监视  debug-windows-Autos
多目标 选择NET版本

第16章   部署
Xcopy实用工具  默认情况下,程序集会从当前的应用程序文件夹中查找从属文件。
Copy  Web工具
发布web站点

16.5 简单的部署

CLICKONCE  是一种允许应用程序自动升级的部署技术。
正确的清单文件可以命令工具 mage.exe    mageUI.exe
no   touch deployment部署方式   无干涉部署

第三部分 基类库
第17章  程序集
程序集  用于部署和配置单元的术语  应用程序的部署单元

第18 跟踪和事件

第19 线程和同步
一个进程的多个线程可以同时运行在不同的CPU上,或多个核心CPU的不同核心上。
线程是程序中独立的指令流。 进程包含资源,例如window句柄、文件系统句柄或其他核心对象。每个进程都分配了虚拟内存。
进程管理的资源包括虚拟内存和Window句柄。


BeginInvoke()  方法总是有两个AsyncCallback和Object类型的额外参数,返回类型 IAsyncResult,可以获得委托的信息,并验证委托是否完成任务。等待异步委托的结构的另一种方式是使用与IAsyncResult相关的等待句柄。使用AsyncWaitHandle属性可以访问等待句柄。这个属性返回一个WaitHandle类型的对象,它可以等待委托线程完成其任务。
   用委托的EndInvoke()方法接收结果。
  委托是方法的类型安全的引用。

使用不同的技术异步调用委托:a  投票  b等待句柄  c 异步回调    ”投饼不?“

如果需要给线程传送一些数据,可以采用两种方式,一种方式是使用带ParameterizedThreadStart委托参数的Thread构造函数;
另一种方式是创建一个定制类,把线程的方法定义为实例方法,这样就可以初始化实例的数据,之后启动线程。

默认情况下,用Thread类创建的线程是前台线程。线程池中的线程总是后台线程。

Thread类中,可以设置Priority属性,级别有Highest、AboveNormal、BelowNormal、Loweast

停止一个线程 Thread.Abort()方法
等待线程的结束 Thread.Join()方法 会停止当前线程,把它设置为WaitSleepJoin状态,直到加入的线程完成为止。
Thread.Suspend()方法    暂停
Thread.Resume()方法  继续

线程池列表由ThreadPool类管理。

双核CPU中,默认设置为50个工作线程和1000个I/O线程。

第20 安全
第21 本地化
第22 事务处理
第23章 windows服务
第24章 互操作性

第四部分 数据
第24章 文件访问和操作注册表
file是静态的 fileinfo是动态的
流是一个用于传输数据的对象。
filestream(文件流) 用于二进制文件中读写二进制数据,也可以使用它读写任何文件

streamreader  StreamWriter  流读取器和流写入器:专门用于读写文本文件。



文件、目录和注册表键的访问控制表ACL


注册表的节点是注册巢  registry  hive  有7个

第26章  .NET数据访问
SqlCommand  sql语句或存储过程调用的包装器。
SqlCommandBuilder  用于从一个select语句中生成的sql命令。
SqlDataReader  只向前的链接数据读取器。

integrated  security=SSPI 这个参数使用windows  authentication链接数据库,而不是用户名和密码。

高效的链接
1  try  catch  finally
2  using语句会确保关闭数据库连接

ExecuteNonQuery() 执行命令,不返回任何结果。
ExecuteReader()  执行命令,返回一个类型化的IDataReader。
ExecuteScalar()  执行命令,返回一个值。
ExecuteXmlReader()  执行命令,返回一个XmlReader对象。


sql在执行触发器时候,没有old和new概念
@@IDENTITY
SCOPE_IDENTITI()
IDENT_CURRENT()  
其中第三个最为准确。
FOR  XML子句来扩展SQL字句

<Table>_ID   保持数据命名的友好型。
 
FOR  XML AUTO 根据FROM字句中的表建立一个树。
FOR  XML RAW 结果集中的行映射为元素,其中的列映射为属性。
FOR  XML EXPLICIT 必须指定要返回的XML树的形状。


存储过程的命令参数可以直接使用AddWithValue()方法设置,也可以通过构建
SqlParameter实例来设置
cmd.Parameters.AddWithValue("@Regionid",23)

cmd.Parameters.Add(new SqlParameter("@Regionid",SqlDbType.Int,0,"Regionid"));


data reader  选择数据的最简单快捷的方法,但是不能直接实例化数据阅读器。是一个只向前的链接游标,即只能沿着一个方()录,而使用的数据库链接一直打开,直到关闭DataReader为止。


把新行添加到DataTable有2种方式
a   NewRow()函数
b   一组数据传送给Rows.Add()方法
    DataRow  r=ds.Tables["Region"].Rows.Add.NET数据访问bo.比不使用的速度要快的多。

第27章  LINQ  to  SQL


DataContext  对象全面管理与数据库的事务处理。该对象包含一个链接字符串,并管理所发生的所有事务处理,还负责记录操作,管理数据的输出。

select  new 语句创建一个新对象
迭代  foreach语句使用var关键字,因为类型在此刻是未知的。

过滤  StartsWith("L")
链接  join    on
组合

拖放到O/R设计器这个部分的所有存储过程都变成可以在DataContext对象中使用的方法。

where  实现过滤、查询等功能。
     where分为简单形式、关系条件形式、First()形式。


第28章 处理xml

串行化是将对象保存在硬盘上的过程。应用程序的另一部分,甚至另外一个应用程序都可以并行化对象,使它的状态与串行化之前相同。

AppDomain.CurrentDomain.BaseDirectory
第29章  LINQ  TO  xml

XDocument  替代了.NET3.5之前的XmlDocument对象,更容易处理XML文档。


第30章  .NET编程和sql server

 用户定义的类型 UDT
 EXEC  sp_addtype  ZIP 'CHAR(5)'  'NOT NULL'

第五部分 显示

第31章  Windows窗体

第32章  数据绑定
  DataGridView   可以绑定到Array、DataTable、DataView或者DataSet类,或者绑定到实现IListSource或IList接口的组件上。在最简单的情况下,设置DataSource和DataMember属性,就可以显示数据。
除了把DataSource设置为Dataset,DataMember设置为要显示的表名之外。

using(Sqlconnection con=new  SqlConnection(ConfigurationSettings.ConnectionStrings["northwind"].ConnectionString))


string[]  stuff=new  string[]{"one","two","three"};
DataGridView.DataBinding=stuff;

DataView  不允许过滤要显示的数据列,只允许过滤要显示的数据行。
DataView.Sort="ProductName  ASC,ProductID DESC";

DataGrid1.SetDataBinding(ds,"Customers");


textBox1.DataBinds.Add("Text",ds,"Products.ProductName");
5  select语句中可以用0替代ReportsTo列中的null值  IsNull(ReportsTo,0)sTo


 第33章  使用GDI+绘HUITU



对象只不过存储在内存中的数据。


 第34章  Windows  Presentation  Foundation
windos窗体控件基于windows内置控件,利用了基于屏幕像素的Windows句柄;
而WPF基于DirectX,便于重新设置UI的大小,并内置了音频和视频的支持。

XAML  XML for  Applications  Markup  Language是一种XML语法。也可以编辑为BAML  Binary  Applications  Markup  Language
实用工具  XAMLPad.exe


 第35章 高级WPF

 第36章 插件

第39章  ASP.NET  AJAX

第40章   Visual  Studio  Tools For  Office


第5部分  通信


第41章  访问Internet
TCP提高了有保证的传输、错误校正和缓存。


第42章   Windows  Communication   Foundation
1  SOAP  Simple  Oject Access Protocol
2  WSDL  Web  Services  Description Language描述了服务的操作和消息。定义了服务的元数据,这些元数   据可用于为客户应用程序创建代理。WCF中,WSDL信息由MEX (Metedata  Exchange)端点提供。
3  JSON  JavaScript  Object  Notation,包含一个数据合同串行化器,可以用JSON记号创建对象。

.NET SDK包含一个Service  Trace  Viewer工具  svctraceviewer.exe  选择跟踪和消息日志文件。
合同定义了服务提供的功能和客户程序可以使用的功能。合同可以完全独立于服务的实现代码。

合同好,数务息
数据合同:定义了从服务中接受和返回的数据。用于收发消息的类关联了数据合同属性。
         要求用[DataMember]属性明确标记要串行化的字段。
服务合同:定义描述了服务的WSDL.这个合同用接口和类定义。
消息合同:如果需要完全控制SOAP消息,消息合同就可以指定应放在SOAP标题中的数据以及放在SOAP主体中的数据。


第43章   Windows  Workflow  Foundation


ifElseActivity
ParalleActivity
CallExternalMethodActivity
DelayActivity
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值