今年的课程有汇编。真为校领导的智商捉鸡。。不过还是要学的。分享一篇来自中文FLEX例子的汇编寄存器的文章。很不错的一篇寄存器详解的文章。文章最后是我找到的一个汇编指令助手。
4个数据寄存器(EAX、EBX、ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS) 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)
1、数据寄存器 数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。对低16位数据的存取,不会影响高16位的数据。这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。
4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。程序员可利用数据寄存器的这种”可分可合”的特性,灵活地处理字/字节的信息。
寄存器AX和AL通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。累加器可用于乘、 除、输入/输出等操作,它们的使用频率很高; 寄存器BX称为基地址寄存器(Base Register)。它可作为存储器指针来使用; 寄存器CX称为计数寄存器(Count Register)。在循环和字符串操作时,要用它来控制循环次数;在位操作 中,当移多位时,要用CL来指明移位的位数;
寄存器DX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也 可用于存放I/O的端口地址。在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,但在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
2、变址寄存器 32位CPU有2个32位通用寄存器ESI和EDI。其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。
寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的功能。
3、指针寄存器 32位CPU有2个32位通用寄存器EBP和ESP。其低16位对应先前CPU中的SBP和SP,对低16位数据的存取,不影响高16位的数据。
寄存器EBP、ESP、BP和SP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。指针寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
它们主要用于访问堆栈内的存储单元,并且规定:
BP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据;
SP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。
4、段寄存器 段寄存器是根据内存分段的管理模式而设置的。内存单元的物理地址由段寄存器的值和一个偏移量组合而成
的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址。
CPU内部的段寄存器:
CS——代码段寄存器(Code Segment Register),其值为代码段的段值; DS——数据段寄存器(Data Segment Register),其值为数据段的段值; ES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值; SS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值; FS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值; GS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。
在16位CPU系统中,它只有4个段寄存器,所以,程序在任何时刻至多有4个正在使用的段可直接访问;在32位微机系统中,它有6个段寄存器,所以,在此环境下开发的程序最多可同时访问6个段。32位CPU有两个不同的工作方式:实方式和保护方式。在每种方式下,段寄存器的作用是不同的。有关规定简单描述如下:
实方式: 前4个段寄存器CS、DS、ES和SS与先前CPU中的所对应的段寄存器的含义完全一致,内存单元的逻辑地址仍为”段值:偏移量”的形式。为访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移量。
保护方式: 在此方式下,情况要复杂得多,装入段寄存器的不再是段值,而是称为”选择子”(Selector)的某个值。
5、指令指针寄存器 32位CPU把指令指针扩展到32位,并记作EIP,EIP的低16位与先前CPU中的IP作用相同。
指令指针EIP、IP(Instruction Pointer)是存放下次将要执行的指令在代码段的偏移量。在具有预取指令功能的系统中,下次要执行的指令通常已被预取到指令队列中,除非发生转移情况。所以,在理解它们的功能时,不考虑存在指令队列的情况。
在实方式下,由于每个段的最大范围为64K,所以,EIP中的高16位肯定都为0,此时,相当于只用其低16位的IP来反映程序中指令的执行次序。
6、标志寄存器 一、运算结果标志位
1、进位标志CF(Carry Flag)
进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。
2、奇偶标志PF(Parity Flag)
奇偶标志PF用于反映运算结果中”1″的个数的奇偶性。如果”1″的个数为偶数,则PF的值为1,否则其值为0。
利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。
3、辅助进位标志AF(Auxiliary Carry Flag)
在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:
(1)、在字操作时,发生低字节向高字节进位或借位时; (2)、在字节操作时,发生低4位向高4位进位或借位时。
对以上6个运算结果标志位,在一般编程情况下,标志位CF、ZF、SF和OF的使用频率较高,而标志位PF和AF的使用频率较低。
4、零标志ZF(Zero Flag)
零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。
5、符号标志SF(Sign Flag)
符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。
6、溢出标志OF(Overflow Flag)
溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。”溢出”和”进位”是两个不同含义的概念,不要混淆。如果不太清楚的话,请查阅《计算机组成原理》课程中的有关章节。
二、状态控制标志位
状态控制标志位是用来控制CPU操作的,它们要通过专门的指令才能使之发生改变。
1、追踪标志TF(Trap Flag)
当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。指令系统中没有专门的指令来改变标志位TF的值,但程序员可用其它办法来改变其值。
2、中断允许标志IF(Interrupt-enable Flag)
Html解析工具-HtmlAgilityPack
这个工具是在暑假的时候发现的。但是最后没用这个工具。不过,这个工具可是非常强悍的。。
HtmlAgilityPack主要就是解析DOM的。常用的基础类其实不多,对解析DOM来说,就只有HtmlDocument和HtmlNode这两个常用的类,还有一个 HtmlNodeCollection集合类。我给出一个抓取我博客首页文章的例子。看代码可能更清楚一点。你可以去看看压缩包里提供的文档。
xpath如果自己写表达式比较麻烦。所以我还找到了这个HtmlAgilityPack提供了的一个xpath辅助工具-HAPExplorer。都给出了地址。
首先看我的例子,抓取我博客的首页文章:
程序运行结果: xpath表达式的具体书写都是需要分析你需要解析的网站源码的。。。。 xpath辅助工具的界面: 下载:HtmlAgilityPack 下载:HAPExplorer
《商务智能与数据挖掘-谢邦昌》第三章读书笔记
3.数据挖掘
3.1定义
数据挖掘是指找寻隐藏在数据中的信息,如趋势。特征及相关性的过程。也就是从数据中发掘信息或知识(Knowledge Discovery in Database)。也有人称之为数据考古学。。记住,它不是一个无所不能的软件或是一种技术,他是一种结合数种专业技术的应用。数据挖掘工具从数据中发掘出个各种假设。但是并不帮你查证。确认这些假设。也不帮你判断这些假设是否有价值。
3.2数据挖掘的功能
1.分类(Classification),按照分析对象的属性进行分门别类加以定义。建立类组(Class)。例如划分银行信用申请者的风险属性,使用的技术有决策树(Decision Tree),记忆基础推理(memory-based reasoning)
2.估计(Estimation),根据既有连续性数值的相关属性数据。以获知某一属性未知值。。例如按照信用申请者的教育程度,行为估计其的信用卡缴费量。使用的技术包括相关分析,回归分析及神经网络算法。
3.预测(Prediction)根据对象属性的过去观察值来估计该属性未来值。比如根据顾客过去刷卡消费量来预测其未来刷卡消费量。使用的技术包括回归分析,时间序列分析,神经网络。
4.关联分组(Affinity Grouping)从所有对象决定哪些相关对象放在一起销售。比如那个啤酒和尿不湿。。在客户营销系统上,此功能用来确定交叉销售。。
5.聚类(Clustering),将异质总体中区分为特征相近的同质类组。目的是将组和组之间的差异辨识出来。并对个别组内相似样本进行挑选。
3.3数据挖掘的步骤
1.理解数据和数据所代表的含义(Data Understanding)
2.获取相关知识和技术(Domain Knowledge Acquisition)
3.整合和检查数据(Integration and Checking)
4.去除错误或不一致的数据(Data Cleaning)
5.建模与假设(Model and Hypothesis Development)
6.数据挖掘运行(Running)
7.测试与验证所挖掘的数据(Testing and Verification)
8.解释与使用数据(Interpretation and Use)
3.4数据挖掘建模的标准CRISP-DM
CRISP-DM模型强调完整的数据挖掘过程,不能只针对数据整理、数据呈现、数据分析以及构建模型,还需要对企业的需求问题进行了解,同时,后期对模型进行评价和模型的延伸应用,也是一个完整的数据挖掘过程不可或缺的要素。
CRISP-DM分为六个阶段(phase)和四个层次(level),分别简介如下:
1. 商业理解(Business Understanding)
本阶段主要的工作是要针对企业问题以及企业需求进行了解确认,针对不同的需求做深入的了解,将其转换成数据挖掘的问题,并拟定初步构想。在此阶段中,需要与企业进行讨论,以确定分析者可以对于问题有非常清楚的了解,只有这样才可以正确地针对问题拟定分析过程。
2. 数据理解(Data Understanding)
这部分包含建立数据库与分析数据。在此阶段必须收集初步数据,然后了解数据的内涵与特性,选择要进行数据挖掘所必须的数据,然后进行数据整理及评估数据的质量,必要时再将分属不同数据库的数据加以合并及整合。数据库建立完成后再进行数据分析,找出影响预测最大的数据。
3. 数据预处理(Data Preparation)
此步骤和第二步数据理解是数据处理的核心,这是建立模型之前的最后一步数据准备工作。数据预处理任务很可能要执行多次,并且没有任何规定的顺序。
4. 建立模型(Modeling)
针对已预处理过的数据加以分析,配合各种技术方法加以应用,针对既有数据建构出模型,替企业解决问题;面对同一种问题,会有多种可以使用的分析技术,但是每一种分析技术却对数据有些限制及要求,因此需要回到数据前置处理的阶段,来重新转换需要的变量数据加以分析。
5. 评价和解释(Evaluation)
从数据分析的观点看,在开始进入这个阶段时已经建立了看似是高质量的模型,但在实际应用中,随着应用数据的不同,模型的准确率肯定会变化。这里,一个关键的目的是确定是否有某些重要的商业问题还没有充分地考虑。在这个阶段的结尾,应该获得对数据挖掘结果的判定。
6. 实施(Deployment)
一般而言,创建模型完成并不意味着项目结束。模型建立并经验证之后,可以有两种主要的使用方法。一种是提供给决策人员做参考,由他察看和分析这个模型之后提出行动方案建议;另一种是把此模型应用到不同的数据集上。此外,在应用了模型之后,当然还要不断监控它的效果。
四个层次分别为阶段(phase)、一般任务(generic task)、专项任务(specialized task)、流程实例(process instance)。每个阶段由若干一般任务组成,每个一般任务又实施若干专项任务,每个专项任务由若干流程实例来完成。其中,上两层独立于具体数据挖掘方法,即是一般数据挖掘项目均需实施的步骤(What to do?),这两层的任务将结合具体数据挖掘项目的“上下文”(context)映像到下两层的具体任务和过程。所谓项目的“上下文”是指项目开发中密切相关、需要综合考虑的一些关键问题,如应用领域、数据挖掘问题类型、技术难点、工具及其提供的技术等。
《商务智能与数据挖掘-谢邦昌》第二章读书笔记
2.数据仓库
数据仓库名字上来看是很好理解的。他与传统的数据库的不同在于。传统的数据库是未经整理后的一大堆数据集。而数据仓库是从数据库中萃取出来。经过整理,规划,建构而成的一个有系统的数据库的子集合。
2.1数据仓库特点:
数据仓库的四个特点。
1.面向主题(Subject Orient)。数据建立的着重点就是在于以重要的主题组件作为核心。作为建构的方向。数据需求者只要把谣言觉得相关主题数据,从数据库中攫取,整合之后就可以做研究之用。
2.整合性(Integrated)各应用系统的数据需经过整合。以便利执行相关分析操作
3.长期性(Time Variance) 为了执行趋势的分析。数据仓库系统需保留1-10年的历史数据。这与数据库为日常性的数据有所不同。
4.稳定性(Non-Volatile)数据库可以被随时修改,但数据仓库基本上不会大动。只有内部人员会定期修改。但频率不会太多。也不允许用户做更新的动作。
由于以上的几个特点。数据仓库必须通过一连串的程序才可建立。而不是说即买即用。。
2.2数据仓库架构
数据源->整体数据仓库->部门性数据仓库->查询工具->终端用户
数据仓库的建设过程:
专业顾问通过与企业进行需求访谈,建立数据仓库的model,然后将企业内各种数据整合到数据库中,并建立前端分析数据的工具以及管理工具,这样的过程即为建立数据仓库的基本过程。
1.设计(Design) 即数据仓库的数据Model设计,这部分是最重要的,若Model设计的不够周全或布里希那个,不管之后的报表设计如何精美,也可能跑出错误的信息。这也是需要有经验的专业顾问建立数据仓库的一个重要原因。
2.整合(Integrate)即数据的整合转换过程,包含数据解释(Data Extraction) ,数据转换(Data Transformation)数据清理(Data Cleaning),数据加载(Data Loading)将各种来源的数据整理,转换并加载数据仓库中,程序编写较为繁杂,自动化处理困难,经常需要人工参与操作,大约占掉该项目60-70%的时间和人力。
3.可视化(Visualize)即前端呈现给用户看的形式,例如数据挖掘(Data Mining) 即OLAP工具,用以呈现分析过的数据形式。
4.调度(Administration)为管理的工具。
2.3建立数据仓库的原因和目的
提高企业的竞争能力,降低成本,提高客户满意度。创造利润。
《商务智能与数据挖掘-谢邦昌》第一章读书笔记
1.绪论
商务智能的含义就是指通过企业所拥有的数据和数据仓库的汇总,结合联机分析及数据挖掘技术挖掘出潜藏在数据库中的有用信息,并将其提供给决策者或部门主管作为平时运营的决策依据。而当企业面临危机时或必须立即做出重大决策时,也能依据数据仓库所提供的正确数据及时作出正确的决策。协助企业顺利解决问题。化危机为转机。更可见商务智能的重要性。
商务智能应用的几个方面
对于一般企业来说,商务智能主要应用在以下几个方面。1.了解运营状况,2.衡量绩效。3.改善关系。4.创造获利机会。
企业引用商务智能的流程
商务智能的核心:根据企业数据库整合成可以作为分析用的数据仓库。再进一步通过分析技术来探索数据。
《Building the Data Warehouse》的作者William Inmon认为数据仓库必须具有面对主题,整合性,时间转化,不易变化四个特性。
联机分析简单来说就是能让用户根据本身决策需求来浏览数据。动态且实时的产生其所需的报表,以提高分析效率的技术。事实上,他除了能提供在线实时数据分析模块外,更重要的是能展示多维度的数据。
商务智能的另一项重要技术:数据挖掘:是指在大量数据库中寻找有意义或是有价值的信息的过程。通过机器学习技术或是统计分析方法论。根据整合的数据加以分析探索,发掘出隐含在数据中的特性。通过专业领域知识整合及分析。从中找出合理且有用的信息,经过相关部门针对该模型的评估后,再提供给相关决策单位加以运用。
企业间的竞争模式,从传统的“红海策略”,即采取压低成本与价格的杀价流血竞争。到近来倡导以创新为核心竞争力的“蓝海策略”,不论哪一种策略模式,都是不断地从研发,制造,营销,客服或资源配置等运营的相关问题上。寻求问题的发生原因,并尝试找出解决方案,而运营阶段中,陆续积累的庞大数据,往往就是答案的隐身之处。这也是数据挖掘的目的。
数据库仓库强大而实用,但有一个局限性。就是他实质上反映的过去的历史,由于数据仓库经常在特定周期或时间点进行加载和处理。因此他只是表示一个时间点上的快照。即使构建了实时或是近似实时的数据仓库,其数据仍然只表示当前和历史的数据。无法达到预测的需要。与传统的统计分析方法不同的是,数据挖掘不是让人提出假设。然后据此去找相关数据。而是让数据仓库确定数据相关性。并允许采用与以往不同的模式对数据进行分析。
WPF主题分享及使用
首先是一个很流行的WPF20多种xaml主题合集源码。这个主题系列是非常漂亮的。我找到了源码。但是没有找到官网。 update:感谢月亮云的提醒,官网是:http://wpfthemes.codeplex.com 截两幅图如下:
使用很简单。一种是将WPF.Theme.dll导入。像demo展示的那样。使用其提供的主题管理类来使用。可以实现任意切换效果。另一种就是直接把源文件的各种theme.xaml提取出来,添加到资源字典就行了。当然还有一些不重要的小细节。相信你对wpf比较了解的话可以搞得定的。。还可以自己学习一下。。
昨天还看到一个主题,也比较漂亮。Amazing WPF Controls分享一下。如果有什么疑问。欢迎留言讨论。
下载:WPF20多种xaml主题合集源码
Eclipse安装JavaCC
今年的编译原理课程上机实践是讲这个的。。要求用JavaCC来做一个简单的解释器。今天总算是有点时间找找文档先把这个安装了。安装过程很简单。。
1.希望你已经安装了Eclipse。。。
2.去sourceforge该项目主页下载javaCC压缩包
3.下载完成后解压到你的Eclipse根目录。会提示覆盖plugins和features。直接覆盖即可。
4.测试一下是否成功。具体步骤就是,打开eclipse,新建一个空java项目。然后对着项目点击右键new->other->javaCC->javaCC template file。然后选择命名空间。包名。和文件名就可以了。这个地方的什么的是由你建立的java项目决定的。所以你可以先把java项目设置好,然后直接选就可以了。。
5.点击运行。选择java application。控制台输出 Reading from standard input… Enter an expression like “1+(2+3)*4;": 完成。。。
Update:其实吧。这里安装的是JavaCC的插件。但是已经可以进行开发了。可能你需要一个例子来开始。或者你不喜欢eclipse。那么去JavaCC的项目下载你喜欢的即可。我下的是javacc-5.0.zip 里面有例子。可以参考。
C# 委托知识总结
如果你足够强大,你就不会把幸福押在别人身上,你会自己创造幸福或者给别人带来幸福。而变得强大的途径就是学习,就是读书,学一切东西,读任何想读的书。 爱你让我变得更强。。 继续读一些专业文章了。不保证都是原创,但是保证每篇技术文章的质量。也会注明来源,标准就是浅显易懂。但不简单。
原文来自:贺臣感谢原作者的好文章。 1.什么是委托,为什么要使用委托
我正在埋头苦写程序,突然想喝水,但是又不想自己去掉杯水而打断自己的思路,于是我就想让女朋友去给我倒水。她去给我倒水,首先我得让她知道我想让她干什么,通知她之后我可以继续写自己的程序,而倒水的工作就交给了她。这样的过程就相当于一个委托。
在程序过程中,当程序正在处理某个事件的时候,我需要另外的程序代码去辅助处理一些事情,于是委托另一个程序模块去处理,而委托就可以达到这种目的,我可以利用委托通知另外的程序模块,该去调用哪个函数方法。委托其实就起到了这样一个作用,将函数签名传递到了另一个函数中。或许这样讲还是有些模糊,看看后面的具体实例。
2.委托的定义
上面是定义两个委托的例子,其实很简单。声明一个委托使用delegate关键字,上面分别是定义的带返回值的委托和不带返回值的委托,
两个委托都有传递参数,当然也可以不传递参数。其实委托也是一个类,委托派生为System.MulticastDelegate,而System.MulticastDelegate
又继承System.Delegate,如果你知道这个也就明白委托其实是一个特殊的类。 委托的简单实用例子
输出结果 上面使用最普通的一种方式来定义了一个委托的使用,这个例子虽然很简单,但是能够很形象的描述委托的使用。
3.委托的三种形式
(1).推断 推断委托例子
在委托定义的例子中我们看到委托的使用方法是在委托实例化的时候指定的[new DelegateName(FunctionName)],这里可能表述不是太但是代码应该看得白了。 而委托的推断,并没有new 委托这个步骤,而是直接将Function 指定给委托。
(2).匿名函数 匿名委托例子
至于匿名委托,给人的感觉更为直接了,都不用显示的指定方法名,因为根本没有方法,而是指定的匿名方法。匿名方法在.NET 中提高了
代码的可读性和优雅性。对于更多操作较少的方法直接写为匿名函数,这样会大大提高代码的可读性。这里有两个值得注意的地方: 第一,不能使用
跳转语句跳转到该匿名方法外,第二 不能使用ref,out修饰的参数
(3).多播委托 多播委托例子
还是上面的那个实例,我不尽想让女朋友去给我掉杯水,还让她帮我将程序设计图稿拿过来。这个时候做的就不是一件事了,而是多件。
程序中也有很多这种情况,于是我们需要多播委托,在一个委托上指定多个执行方法,这是在程序中可以行的。上面提到了,委托直接继承于
System.MulticastDelegate,正是因为这个类可以实现多播委托。如果调用多播委托,就可以按顺序连续调用多个方法。为此,委托的签名就必须返回void;否则,就只能得到委托调用的最后一个方法的结果。所以在上面的这段代码中是得不到结果的
4.事件
使用C#编程,无论是WinForm,WebForm 给人很难忘得就是它的控件,而他们的控件库使用方式都是使用使用事件驱动模式,而事件驱动模式却少不了委托。话不多说,看代码能够更清好的理解事件和委托之间的联系. 事件的使用
上面的代码中我们定义了一个委托,然后定义了一个类EventSource,这个类中声明了一个事件。定义一个事件使用event 关键字,定义一
个event必须指定这个event传递消息的委托,在触发事件之前必需订阅事件,我们使用+= new 语法来订阅一个事件,也就相当于实例化一个事件。
当我们触发事件的时候,就会调用相应的方法去处理。
5. 泛型委托
委托是类型安全的引用,泛型委托就和我们常用的泛型类一样,这个类在使用的时候才能确定类型.通过泛型委托,我们可以在委托传递参数
之后知道它的类型.在.NET中有一个很典型的泛型委托:
这是一个非常有特色的泛型委托,可能我们用的比较少,但是作用是不能忽视的。 我们看看三个非常具有代表性的泛型委托.现在.NET4.0已经出来了,但是泛型委托.NET2.0就出来了,Linq 大家用的那叫一个甜,
为啥 函数式编程风格,匿名方法,Lamda表达式表达式使用是如此的魅力。但是大家仔细观察过没有,Linq 中的方法有几个经常出现的参数:
Func<T, E>:封装一个具有一个参数并返回 E 参数指定的类型值的方法,T 是这个委托封装方法的参数类型,E是方法的返回值类型。当然Func<T, Result> 只是其中的一种情况,这个委托还有其他的几种情况:Func<T> 这个是方法没有参数,返回值类型是T;Func<T1,T2,Result> 这个方法有两个参数,类型分别为T1,T2,返回值是Result,还有Func<T1,T2,T3,Result>,Func<T1,T2,T3,T4,Result> 这几中情况,具体情况就不介绍了.我们还可以通过扩展类型,扩展为更多的参数. Func 委托的使用
Action<T>:封装一个方法,该方法只采用一个参数并且不返回值,包括Action<T>,Action<T1,T2>,Action<T1,T2,T3>,Action<T1,T2,T3,T4> 这几种情况,也可以通过扩展方法去扩展参数的个数 。 Action 委托使用例子
Predicate<T>:表示定义一组条件并确定指定对象是否符合这些条件的方法。该委托返回的是一个bool类型的值,如果比较满足条件
返回true,否则返回false.其实上面的Func 委托可以包含这个委托.不过这个委托和上面的两个不一样,它只有一种类型 Predicate 委托使用例子public void TestPredicate() { TEventSource eventSource = new TEventSource(); Predicatepredicate = eventSource.IsRigth; Console.WriteLine(predicate(0)); }
public bool IsRigth(int value) { if (value == 0) { return true; } else { return false; } }</pre> 6.异步委托
投票技术: 委托其实相当于一个线程,使用投票技术是使用异步委托的一种实现方式.Delegate类提供了方法BeginInvoke(),可以传送委托类型定义的输入参数,其返回类型为IAsyncResult。IAsyncResult的IsCompleted属性可以判断委托任务是否完成 异步委托投票技术
等待句柄:等待句柄是使用AsyncWaitHandle属性访问,返回一个WaitHandle类型的对象,它可以等待委托线程完成其任务。在这个参数中可以设置最大的等待时间。 异步委托等待句柄
异步回调:这个方式和投票技术有点类似,不过在投票方式中BeginInvoke()方法第三个参数指定了一个方法签名,而这个方法参数接收IAsyncResult 类型的参数。 异步委托回调函数
通过Windows应用进行服务寄宿示例代码
此程序部分源码来自《WCF技术剖析》。。但是。这本书上讲的非常不清楚。有些很小的地方没讲。。导致出现很多问题。。。比如ListView需要先添加列。默认的config需要删除。等等。。
最终是成功了。
源码下载:Lazy.FormDemo
WCF读书笔记(4)
三种供客户端和服务端控制通信的契约介绍: 1.服务契约描述了由特定服务端点所公开的操作,每一种操作,通过参数和返回值定义请求和响应消息的格式。 2.数据契约描述了复杂类型如何被串行化为消息的一部分,数据契约是服务契约中优先用来包含复杂类型的方式。 3.消息契约提供对某个soap消息格式的控制,包括支持定制消息标题和数据契约所描述的单个消息体元素。
消息参数(Message Parameter) 对于
若客户端传入的参数为“Hello”,则生成的请求消息体中标记为Hello,而响应返回的消息体则被标记为返回内容,可以通过
来定制消息中的标签。
绑定元素 实际上,每个绑定元素都会被映射到一个信道上,这样,绑定元素和信道在这个意义上可以互换。
执行上下文(OperationContext) 是System.ServiceModel命名空间的一种类型,他为服务请求提供了对执行上下文的访问,OperationContext.Current为请求在生命周期期间提供了对上下文的访问。
WCF的实例化模式 实例化控制模式服务对象被分配给请求的方式,一旦服务主机已经建立而且为每个端点创建了信道监听器,对各终端的请求已经由适当的服务对象所执行,则这些对象是基于服务类型的实例化模式的。他们是InstanceContextMode的一个枚举。 1.PerCall 服务对象为每一个对服务的调用所创建。 2.PerSession 对每一个客户端创建一个。默认是这样 3.Single 创建单一的服务对象。并由所有客户端的调用使用。 尽可能使用PerCall,大规模的部署避免PerSession并发。
WCF的四种会话 应用会话,传输会话,可靠会话,安全会话。
信道发生器取得SessionId