关于C#委托 有个显示样式的功能,用委托怎么做
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于C#委托 有个显示样式的功能,用委托怎么做相关的知识,希望对你有一定的参考价值。
现有样式a,b,c,d,e,f.....许多种,每种都对应一个显示方法ashow(),bshow().........用来显示相应样式
想实现窗体加载时,如果读出的配置是A,就ashow(),如果配置是B,就bshow();
如果用if语句很好实现,现在如果用委托来实现,该怎么写代码
什么是合格的程序员?那我们应该先问:什么是程序员?程序员,顾名思义就是写程序的人。那什么是合格的程序员呢?就是写出合格的程序的人。那什么是合格的程序呢?这个问题,就很难回答了。合格的程序,首先要是可以运行的程序,其次还牵扯效率、安全性、可扩展性、可移植性、可读性……等等很多很多东西。所以什么是合格的程序员?我觉得,还是把眼光放得低一点,能写出可以实现所有功能的、可以正常地运行的程序的人吧。
这个问题看似很简单,其实,事情不像想象的样子。
这里指的能实现所有的功能,可以正常地运行的程序并不是说仅仅写出一个“Hello World。”你就可以说自己是程序员了。那程序员早就满天飞了,你也不用看我废话了。
这里所说的实现所有的功能,起码是解决一个具体的问题,比如说一个信息发布系统、一个学生管理系统、一个办公系统或者是某些通用的平台等。但也不要被吓倒,其实也不像想象的那么难。只要肯吃苦,合格的水平还是人人都可以达到的,而且应该是很快就可以达到的。但成为一个合格的程序员之后的路,更长、更艰苦,那就不是我们这篇文章讨论的问题了。
废话不表,我们进入正题。
三,成为程序员的阶段:
我将成为一个合格的程序员的过程分为以下几个阶段:
(一) 熟悉电脑的基本操作
(二) 熟悉一门编程语言
(三) 掌握一门DotNet语言
(四) 掌握针对数据的编程
(五) 掌握网络编程
下面我一个阶段一个阶段的讲解:
(一) 熟悉电脑的基本操作
如果你已经能够独立的重装操作系统了,那么这个阶段你就可以跳过了。
其实这个阶段没有什么实质性的东西,就是对电脑的熟悉。电脑,总该在学习开发之前熟练的应用吧?
说具体点,要会用Office2003,会用IE浏览器上网,能找到并且正确安装自己需要的应用程序,再进一步,要能够自己把自己的系统搞崩溃,再自己重装。这段时间兴趣是最重要的,因为没有什么明确的目标,所以你对什么感兴趣就学什么。而且千万不要对电脑有恐惧感,如果你真的能把你的电脑搞坏了(指的是物理损坏,排除暴力因素),那也算是一件了不起的事情了。呵呵,所以不要怕,使劲用它就是了,只要能把电脑的基本操作熟悉了,起码你买电脑的钱,已经赚回一半来了。
这段时期如果能够对服务器系统(主要是WindowsServer2003和IIS),有一定的了解,就更好不过了,然后你就可以给人家很自豪地说,我会假设服务器了。还有就是用Server系统,需要花点功夫研究一下权限系统,很有必要。建议如果对自己的英文有信心的话,使用英文版的操作系统。
还有一个很重要的方面,就是对网络的应用要熟悉,比如Google、P2P下载。这些都是宝贵的资源,善加利用,事半功倍。
另外如果你身边有一个高手,那么你简直就是买彩票中奖了,不要浪费,一定要不厌其烦地问,问得越多,学得越快。
总的来说,这段时间是一个很有乐趣的时间,大概经历一到两个月,你就可以摆脱电脑盲的帽子了。不过真正的熟练掌握电脑,还需要在学习开发的同时,不断的实践。
(二) 掌握一门编程语言
从这个阶段开始,就正式进入我们的学习阶段了,学习是枯燥的,学习程序的初期尤其如此,所以如果有的时候你受够了,就调剂一下,继续做你第一阶段做的事情,继续漫无目的的捣鼓一下你的电脑,是一种一箭双雕的好办法。
我们应该从什么语言学起呢?C,种种迹象表明,学C,是初学者最好的途径,可以让你有一个很坚实的基础,虽然我们以后几乎不会用C来做实际的开发,但是在C中学到的东西,足以使我们在整个职业生涯中受益,甚至可以把话说得大一点,不论是程序、美工、服务器管理员,只要是从事电脑开发工作的相关人员,都应该学C。
C语言是大学计算机二级的标准课程,也是国家计算机等级考试二级的考试科目,还是计算机专业很基础的专业课。所以学C不是一件很难的事情,采用的教材也很统一,谭浩强老先生的《C语言教程》,一般用的是第二版,第三版也出了,我没看过,我以第二版为主。这本书是清华大学出版社出的,几乎是所有高校的标准教材,所以好不好就不用我多说了。
这本书我觉得也不用所有的都看,比如位操作、文件读写等,我们就很少用,我指的是实际开发,走算法优化或者竞赛路线的,不在此类考虑范围内。
具体地说一下这本书的阅读方法:
第一章到第十章:精读,所有的课后题全部都要做,而且最好是全部要上机调试通过。其中条件语句(第五章:if语句)、循环(第六章:for语句、while语句)、函数(第八章:形参和实参),指针(第十章)都是重点中的重点。必须要掌握。
第十五章:面向对象的开发,了解概念。这个概念很重要,所有我单独拿出来说,因为以后我们的开发,基本就是面向对象的了,所以面向对象的概念,必须非常透彻的理解(其实很容易理解,但容易不代表不重要)。其中类、对象、继承、派生、多态等概念,在以后的开发中是基础的基础。
这个阶段其实比较好渡过,因为学习的模式和我们接受了十几年的应试教育的模式基本一致,就是看书,做题。而且如果你肯下功夫,这个阶段也很短暂。我的一个学生,用了十天的时间,从没接触过编成,到把C基本学成。很惊人的速度。当然,这十天他过得很艰苦,每天看十几个小时的书,基本上除了睡觉其它时间都在看,无论是吃饭、坐车、上课、上厕所……
不过按照我的看法,仅仅是《C语言教程》这本书所带的习题是远远不够的,还应该有些深度,建议把南开一百道题全部做完,上机调试通过,再适当的做一些ACM/ICPC的预赛题,效果会更好。当然搞实际开发的,没必要把算法优化到变态的地步。主要是锻炼自己的数学建模能力。
(三) 掌握一门Dotnet语言
当你走到这一个阶段的时候,也许在某种意义上说,你已经是一个程序员了,因为你已经写了很多程序了。但是你可以问一下自己,你写的程序有什么用处吗?判断闰年还是找出100以内的素数?难道这就是你学习的最终目的?当然不是,这只是开始。
当我们开始学习DotNet的开发时,我们可以说,我们开始学习一些实际的,而且是与世界前沿的计算机技术接轨的东西了。
我在这里并不想给出DotNet的任何描述,那不是这篇文章的内容。我想说的是怎样学。其实方法很简单,看书 写程序。和学C没有什么差别,只是没有了习题,大概学起来就会有一种找不到北的感觉。习惯了就好了,以后我们要学的东西,都不会有习题。
我推荐两本书:
1,《C#高级编程》(《Professional C#》)清华大学出版社翻译出版,Wrox公司原著,128.00RMB。网上有电子版,评价不一。我的启蒙书。
2,《C#编成思想》(《Thinking in C#》)机械工业出版社出版,Larry O’Brien & Bruce Eckel著。网上有电子版的,评价很高。
以上这两本书都很好,都很值得看,其中Wrox的书是一整套,很方便后续的学习。这也是我推荐这本书的很重要的原因。至于《Thinking in C#》这本书,网上的评价是很高的。而且和他一套的还有《Thinking in C 》、《Thinking in Java》等,都是难得的好书。建议这两本书中至少要买一本。两本书都有英文版的,仍然建议E文好的优先选择英文版。
说一下读书的方法。这两本书都很有分量。比如说《Professional C#》,一千多页,还是大本的,很有震撼力。不用说全部看懂吃透,只是逐字逐句地读一遍,也要不少功夫。但是谁让咱要学呢?忍了。
顺便说一下我对Wrox这一套书的一些看法。Wrox,中文翻译叫乐思。他们出的书很全,基本上涵盖开发的所有方面,从Asp到Asp.net,从C#到Java,从关系数据库到XML。而且大部分的内容分为“入门经典(Beginning)”和“高级编程(Professional)”两类。我觉得入门经典没有必要看,因为讲的太过基础,给人一种唠唠叨叨的感觉。所以我建议直接看高级编程,特别是如果你认识高手的话。虽然已开始看高级编程会觉得比较吃力,但是一旦入门,进步的速度会很快。
我讲一下《Professional C#》这本书的阅读方法,因为我一直拿这本书当教材。其实这本书的章节的划分我认为不是很合理,我认为好的阅读顺序如下:
1,第一章:描述性的东西。了解就可以了,开始肯定不明白。
2,第二章到第五章:必须看,重点。也很基础,有C的基础很容易搞定。
3,第九章、第十一章、第十二章、第十九章:这些算是新的内容了,也是很重要的。
4,二十一章、二十二章:数据访问。我们以后和数据打交道是最普通的,数据库是必须要掌握的,书上这两章讲的很基础,必须要深入理解。
5,二十五章、二十七章:网络开发的基础。个人认为网络开发是趋势,学程序不学网络开发部完整。
以上我说的是第一遍要看的东西。剩下的我没有提到的,可以以后慢慢看,像是委托和事件(第六章)、反射(第十章)、程序集(第十三章)、线程(第十五章)等都是有重要、也是很有用的技术,但是对于初学者比较困难。
第一遍读的时候肯定会很迷糊,没关系,很正常。耐着头皮看,一定要挺住。第一遍看到一半的时候,应该就有点感觉了,如果第一遍确实看不完,也不用勉强,看个十几二十章的,开始第二遍。第二遍看得时候,收获就会很大,很多东西很自然的就明白了,特别是面向对象的概念。然后这一遍看到看不下去的时候,你已经入门了。然后是第三遍,建议第三遍仔仔细细得看,尽量多懂一些。
只是死读书很容易导致读书死的,所以我们要注重实践,那么实践的内容是什么?下面我列举一下,也算是一些不太高明的习题。
1, 安装编译环境。不要以为很容易,装个TC也许你可以一下子搞定,但是能装好VS.Net,绝不是一件容易的事情。这里我推荐VS.net 2005,刚刚发布的,确实很好用。
2, “Hello World”。没错,学习所有的开发语言、开发环境,先写一个“Hello World”是很有必要的。这代表是一个完整的开发过程。
3, 书上的示例。也许你在看的时候,觉得示例很容易,但真正的把它写成一个可以执行的文件,还是有很多不同之处的。从理论到实践是很有差距的。不过“高级编程”这个系列的书有个算不上缺点的缺点,就是它给出的都是代码的片断,很少给出完整的代码。所以如果你写不出来的话可以把源代码找来看。示例代码也不用都写,主要是实际的用C#写点东西,避免眼高手低。
4, MSDN演练。我们主要还是用VS.net开发(不要给我说你用NotePad写程序,这不是王道)。微软的看家东西,功能自然不必多说。掌握这个IDE(集成开发环境)是必须的事情。方法就是做MSDN所带的演练。做得越多越好,其实全加起来也没有几个。演练讲的很细,只要你按照他说的做,或许无法最后实现功能,但是肯定可以把开发环境熟悉了,这样我们的目的就达到了。
5, 写一个计算器。主要目的是掌握一个实际的程序的开发。了解.net的主要类,习惯面向对象的系统开发。这个计算器写得越复杂越好,呵呵。
当你成功的运行了自己写的计算器的时候,你对开发,已经有一个全新的认识了。不过很显然,这些还远远不够,那么,我们还应该掌握什么呢?
(四) 掌握针对数据的编程
数据,可是说是我们开发的最基础的东西了,没有数据,那我们在处理什么?
我这里所说的数据,可以分为如下几类:
1, 基础的数据结构
2, DotNet中的主要数据类型,特别是集合类型
3, 关系型数据库
4, XML
对于传统的数据结构,要求不是很高,主要看自己的兴趣,不想看的话,掠过也可以,想学的话。清华大学的那本《数据结构》(C语言版)就够了。也是大部分高效的标准教材。
对于DotNet中的数据类型,就要很熟悉了,其实很基础,所以在平时练习中就潜移默化的掌握了。只是像HashTable这种很有用的集合类型(其实就已是一个类),要好好研究一下。
关系型数据库才是真正的重点。主要是M$ SQL Server、M$ Access、mysql、Oracle等比较程序的数据库系统,不要被这么多不同的种类的数据库吓倒,其实就是掌握SQL语言,和连接、访问数据库的方法。
千万不要把SQL和M$ SQL Server混了,后者是微软的一种产品,而SQL(Structured Query Language,结构化查询语言)是一种类似C、C#的语言,只是不时程序设计语言,而是一种用于操作数据库的语言,是一种大家都支持的标准。所以我们只要掌握了这种语言,对任何数据库都是通用的。
学习SQL语言,推荐一本书:《数据库系统概论》(第三版),高等教育出版社,萨师煊、王珊,25.10RMB,是计算机国家三级考试的教程,也是很多计算机专业大四的专业课。这本书不用都看,主要是第三章,其他的随意。另外M$ SQL Server自带的联机丛书也是很好的参考资料。另外市面上还有一些专门讲数据访问的书,例如Wrox的《.NET数据服务 C#高级编程》(《Data-Centric .NET Programming with C#》)之类的,如果自己觉得有必要,也可以买来看一下,有益无害。
对数据库的了解,不应只限于访问,数据库系统的安装、备份、故障恢复、权限设置、安全性设置等一系列的操作都应该很熟悉。特别是Access和M$ SQL Server这两个系统,用得比较多。Oracle就比较专业了,只用得比较大型的项目中。
在.NET中,对数据库的访问主要是System.Data命名空间。DataSet类,核心,重点掌握,还有DataAdapter,Command,Connection这几个类,说白了,也就这点儿东西了。这也就是我们所谓的ADO.NET(Active Data Object.Net)。
至于XML,是一个很重要的,很基本的东西。注意是很基本,不是很基础。基本的意思是它有些属于系统底层,但不基础,因为也许并不是很好学。
这里我仍然推荐Wrox的《C# XML 高级编程》(《Professional C# XML》),看完一遍应该就明白什么是XML了,当然你也可以买专门讲XML的书来看。
等到数据的访问比较熟悉了,可一个自己写一个通讯录,功能自己定,只要能把你学到的都用上,就是个很完美的程序。这个小东西基本涵盖了数据访问到数据操作的所有东西。
(五) 掌握网络编程
我认为学习开发,但不学习网络开发是不完整的,毕竟网络是一个趋势,这也就是为什么会有DotNet的原因了。
在DotNet下的网络开发其实和基于WinForm看起来没什么差别,当然,学到一定的程度就知道了,其实根本不是一回事儿。
对于DotNet中基于网络的开发,说白了,就是ASP.NET(Active Server Page.Net)。基本上看一本书就可以了:Wrox的《ASP.NET 1.1 高级编程》(《Professional ASP.Net 1.1》)。也是一本厚度惊人的书。1K多页吧。
这本书有些部分可以先不看:Web服务(第十九章、第二十章)、移动控件(第二十一章)。其他的尽量看,同样,第一遍不可能全部看懂,每看一遍都会有新的收获。
掌握ASP.Net大概也就是半年的时间,当然,辛苦不用我再说了。
不过网络开发的面,不能只限于ASP.Net,还有很多很多相关的东西:
1, html(超文本标记语言)。也是网页的官方语言,必须掌握。当然,我不建议你每个标签的每个属性都滚瓜烂熟,也不可能。只要你知道怎么用就可以了。其实标记语言(ML)都是很简单的。
2, CSS样式。其实是和HTML算是一类的,都输入网页设计的范畴,有些和美工交叉。但是没办法,大部分的整合工作还是有程序原来做的,所以这些东西必须会。
3, javascript。不要和Java语言混了,根本不是一个东西。它是一种小型的网页互动的脚本,功能很弱(相对而言)。其实也应该属于美工的范畴。
4, 一定的服务器假设和维护的知识。我们要调试网站,必须在服务器操作系统上,现在也就是Windows Server 2003。所有相关的知识必须会,比如怎么用IIS,如何分配权限、如何配置防火墙等。这有些和系统维护的范围交叉。
当你大抵熟悉了以上的内容时,那么恭喜你,你可以开始着手开发你的第一个系统了,这个系统,我建议是一个信息发布系统,说白了就是一个文章系统。让用户可以查看、发表、修改、删除文章就可以了,复杂得还可以实现文章分类、用户分类、文件上传等。你可以自由发挥。如果你认识做美工的,给你做套页面最好不过,不过没有也没关系,主要是实现所有功能。
这个系统,如果你真的开发出来了,那么,我就可以以程序员称呼你了。J其实从什么都不会,到现在战胜最终的BOSS,也就一年的时间吧。
四,今后的路
当你真正的成为了一个程序员,那么以后的路,不确定地方,就会多很多,我说一下我的一些看法吧,并不成熟,因为我也在探索。
在可以开发出一个合格的程序之后,我们的着眼点就变成了如何开发出一个优秀的程序,这牵扯到更多的东西,所以我们要进行更多的学习。一下我列举一些比较重要的东西:
1, MSDN:M$开发资料的大本营,不论是网站还是Library,都是第一手的和最权威的资料。其实大部分的内容都是由MSDN转化而来的,但是MSDN的逻辑性太差了,它是以类似字典的结构整理的,所有用来查询最好不过。不过有的时候随手翻翻也会受益匪浅。
2, Duwamish:这是MSDN一直自带的一个示例,现在有DotNet版本的了,这个示例是官方版本的,好不好不说,但是规范程度绝对是最一流的!网上有一种说法,如果你把Duwamish全看懂了,你就是高手了。
3, 《Design Patterns》:关于设计模式的一种经典书,必看。
4, Wrox的一些书:Wrox的一系列的书清华引进了很多,网上也可以找到很多。有一些很有难度的,比如那本《ASP.NET 电子商务高级编程 提出问题-设计方案-解决方案》(《ASP.NET E-Commerce Programming Problem-Design-Solution》)就很好。自己去书店翻翻,看不懂的就买几本回来仔细看,呵呵。
5, CSDN:大概算是中国的MSDN了吧,如果你缺乏帮助,缺乏交流,那就不用犹豫了。上CSDN吧。
6, TeahNet:同样是微软的网站,它的教学中心,里面的WebCast有很多很好的,类似面对面的讲座,可以学到很多最新的技术。而且微软的网站,下载速度非常快。微软有一些讲师,特别是一些有金牌讲师称号的,水平确实很高(无论是技术水平还是讲解的水平)。网站更新很快,应该经常看。
7, ASP:虽然说我们已经掌握了ASP.NET,而ASP已经是昨日的黄花,但是这黄花的数量实在太大,我们不能回避这个庞大的资源。其实如果已经学会了ASP.NET,再看ASP应该是小菜一碟,随便找一个系统的源代码看一下就OK了。
8, 动易文章系统&动网论坛:算是民族软件中不可多得的东西了吧,也许是我见识太短,但我认为这两个软件的水平,绝对算得上是高的。更可贵的是两个软件都有免费办的,值得好好研究一下。有能力的话,可以写一个和功能类似的系统,自己用。不过这两个系统都是ASP的,要求有ASP的一定基础。另外,这两个系统对模版的支持相当强大,可以说是二次开发的必备之物,美工尤甚。
9, 项目管理(版本控制):这里的项目管理,更多的是指的对微型项目,也就是一个程序员加一个美工,甚至说一个程序员就可以搞定的项目。主要的内容也就使版本的控制和项目资料的整理。经验问题,需要多实践。
10,文档的书写:不要说你做一个项目一个文档也不写,这样你永远做不了好的项目,所以文档是一个程序的必须的组成部分。学会写一个格式良好、叙述清晰的文档,势必学的技能。
11,Google & VeryCD:我们的资源库,要找东西去这两个网站就对了。没有去VeryCD看看也很好,上面有你一辈子都看不完的教材和资料,也有你或许听都没听说过的软件,更重要的是,全部都可以下。
参考文献:程序员指北——如何成为一名合格的程序员 参考技术A switch case是个不错的选择。
因为你的方法是写死在代码中的,所以用switch就可以。或者用反射获取到这个类中所有关于ashow,bshow这样的方法体以备调用亦可。
如果要用委托实现,那么就必须先定义委托。委托的定义这里就不着重介绍了,既然你想用委托,就一定知道委托是做什么用的。
首先,在定义委托,并在类中声明这个委托
定义:
public delegate void FooDelegate();
声明:
private FooDelegate fooDelegate;
然后,在判断你的配置
switch
case "a":
fooDelegate = a.show;
break;
......//依次类推
fooDelegate();本回答被提问者采纳
浅谈 C#委托
看了《CLR via C#》的17章委托后,为自己做一点浅显的总结,也分享给需要的人。
.NET通过委托来提供一种回调函数机制,.NET委托提供了很多功能,例如确保回调方法是类型安全的(CLR重要目标)。委托好允许顺序调用多个方法(委托链),并且支持调用静态方法和实例方法。
委托的基本语法就不多说了。
internal delegate void Feedback(int value);
public sealed class Program{
publick static void Main(){
}
private static void DelegateDemo(){
Counter(1,2,new Feedback(WriteToConsole));
Program p=new Program p();
Counter(1,2,new Feedback(WriteToMsgBox));
}
private static void Counter(int from, int to, Feedback fb){
for(int i=from;i<to;i++){
if(fb!=null)
fb(i);
}
}
private static void WriteToConsole(int val){
Console.WriteLine(val);
}
private void WriteToMsgBox(int val){
MessageBox.Show(val)
}
}
和普通调用静态方法实例方法没区别,如果需要回调静态方法,那么className.FuncName(); 如果需要回调实例方法,那么Class_object.FuncName();
由于委托是类型安全的,它可以调用私用方法。
协变性和逆变性。
将一个方法绑定到委托的时候,C#和CLR都允许引用类型的协变性和逆变性,注意是引用类型哦。
delegate Object MyCallback(FileStream s);
string SomeMethod(Stream s); //引用类型允许协变性,Stream是符合逆变性
int SomeOtherMethod(Stream s); //值类型不允许协变性
协变性是指方法能返回从委托的返回类型派生的一个类型,不能用于void。逆变性是指方法获取的参数是委托的参数类型的基类。
委托链
Delegate.Combine(FirstDelegateObj,SecondDelegateObj);
FirstDelegateObj+=SecondDelegateObj; //语法糖效果,等同于上一行
上面代码就是在构造委托链。
委托链的原理大概就是:维护MulticastDelegate类中的三个重要的非公共字段中的_invocationList.这个字段维护了委托数组。
另外两个字段就是_target.当委托包装了一个静态方法时,这个字段为null.当委托对象包装了一个实例方法时,这个字段引用的是回调方法要操作的对象。
_methodPtr 一个内部的整数值,CLR用它标识要回调的方法。
在很多时候,执行委托链的过程中可能遭遇其中某个方法的阻塞和异常影响接下来的方法的执行。这个时候,我们的解决办法是使用MulticastDelegate为我们提供的GetInvocationList方法,获取由委托引用组成的数组,
每个委托引用只想链中的一个委托对象。我们可以通过遍历来执行每一个委托。
委托链执行后只会返回最后一个回调方法所返回的值、
下面给出MulticastDelegate中Invoke方法的伪代码实现,这个方法解释了委托的执行过程和原理。
public int Invoke(int value)
{
int result;
Delegate[] delegateSet= _invoctionList as Delegate[];
if(delegateSet !=null)
{
//委托链
foreach(Feedback d in delegateSet)
{
result=d(value);
}
}
else
{
//在执行对象上调用这个回调方法
result= _methodPtr.Invoke(_target,value);
//以上代码接近实际代码,但实际上C#表示不出来。
}
return result;
}
以上是关于关于C#委托 有个显示样式的功能,用委托怎么做的主要内容,如果未能解决你的问题,请参考以下文章