版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课前准备给大家一个建议:有问题多问,同样的时间,问的多就学的多。本课程目的:让大家都具有最基本的编程水平,保证能正常进行后续的课程。基础不好的同学抓紧复
次很好的机会)基础好的同学(复习,看参考书籍,继续提升,有问题可以问)》、语法参考:《CSharp
LanguageSpecification.doc》【C:\ProgramVisual
Studio
10.0\VC#\Specifications\2052\CSharp
Language
《C#图解Files\Specidoc】在vs的安装
下。
可以一章一章的看,也可以讲到哪里看到哪里。编程到底怎么学?那么多语言该学哪门?
多做练习,就像游泳。
反复练习,就像打铁。反复捶打,去除杂质,保留精华。书要越看越薄。温故而知新。
把代码敲到吐…..
书要越看越薄。温故而知新。
做课堂笔记(听课优先,然后做笔记,养成自己记笔记的
)
欢迎来到
----课前说明课程内容中大部分是所有同学都需要掌握的,但是对于部分技术水平比较好的同学为了让其就业会有更高的薪资,所以课程中有一部分内容是相对比较难的,对于这部分内容ppt上会加*,加*的内容不要求所有同学都掌握。为了保证毕业后都能找到一份更好的工作,所以建议大家应该把必须掌握的知识都掌握了以后再考虑加*的内容。ppt中的内容是根据企业的需求制定的,大约一个季度会有一次大的变动,所以,有些内容将根据各方面的建议而进行增加和删减笔记每天都要交自己整理老师不发笔记,共分7部分第一部分:面
象第二部分:值类型、 类型、字符串操作第三部分:集合文件操作第四部分:正则表达式第五部分:XML操作第六部分:委托、事件第七部分:反射。课前说明本课程中除xml、委托、事件、反射外,所有内容均要求各位同学入学前已经掌握,所以在本门课程中除
xml、委托、事件、反射会作为新知识点详细讲解外所有其他知识点均以复习的方式呈献给大家。委托、事件要求先将上课讲的内容全部掌握。在基础加强的课程中会有一部分委托、事件的使用案例。在大家后续的学些过程中比如、项目中还会不断遇到委托的各种新用法,所以在基础加强中要求大家只要把老师讲的内容都掌握就可以了。本课程中对于大家入学前必须掌握的知识点,均以练解的形式进行,所以每个人必须认真敲代码,保证代码量、代码规范度。C#代码编写、编译过程参考以前基础加强讲课方式或者其他老师上课公开课的内容。但注意:这里不再详细讲解很多为什么,大家先知道C#代码从编写到最终执行是一个什么流程即可。知道c#代码也是需要
csc编译的,jit编译。(CLR、CTS、CLS)强调代码规范规则(法律,必须遵守否则报错)
语法规范(道德,大家都喜欢有道德的人。)
注释//,/**/,///
骆驼命名:第一个单词首字母小写,之后的单词首字母大写userName、userPassword、realName…(普通变量(局部变量)、字段)
帕斯卡命名:第一个单词首字母大写,之后的单词首字母大写GetMax()、ChangeName()…(方法名、类名、属性名)
定义的变量或者方法名字要有意义。
方法名:动词。Write()、Open()、Close()、Dispose()、GetUserId()、…(方法都是要做一件事情)
变量名:按功能命名、按方法的返回值内容命名(userName=GetUserName();)象(OO-Object第一部分:面Oriented
)练
:磁盘上有不同的文件,比如:.txt文 文件、.a
文件、.x
s电子表格。要求:编写一个控制台程序,用户输入一个带后缀名的文件,将该文件名传递到一个方法中,该方法中根据用户输入的文件名后缀,返回一个对应的文件对象。提示:编写不同的类模拟不同的文件、为不同的文件类创建 的父类、使用简单工厂实现。效果如图:(参考答案见备注)要求:面
象的方式来做下面的题话说小强有很多车,有奔驰,有奥迪,有宝马,还有兰博基尼家里安装了一个自动提示存放车子的只要小强在程序上输入:奔驰,则提示:您的车应该放在一号车库.并显示该车为:奔驰s6奥迪,则提示:您的车应该放在二号车库.并显示该车为:奥迪A8宝马,则提示:您的车应该放在三号车库.并显示该车为:宝马5系兰博基尼,则提示:您的车应放在
车库.并显示该车为:
兰博基尼Aventador练习图解案例(案例都可替换)动物类继承(动物类,猫类,狗类。)猜拳外部设备(抽象方法)面
象计算器(Calculator)登记案例(接口)文件类和对象面面
象?一种分析问题的方式(增强了程序的可扩展性)。象三大特性:封装、继承、多态。类?
对象?类和对象的区别?类:类是模子,确定对象将会拥有的特征(属性)和行为(方法)对象是一个你能够看得到、摸得着的具体实体—万物皆对象
类是模具,创建对象的模具,抽象的。
类是一种数据类型,用户自定义的数据类型
类组成:字段、属性、方法、构造函数等
对象是具体的,是类的具体实例。对象具有属性(特征)和方法(行为)
类中包含了数据(用字段表示)与行为(用方法(函数、功能)表示,方法为一块具有名称的代码)this,当前对象,base知识点总结面 象?对象?类和对象的区别?封装?的 接口。(面 象三大特性:封装、继承、多态。类?提问:大家觉得类和对象本身就是封装的体现。1.属性封装了字段、2.方法的多个参数封装成了一个对象、3.将一堆代码封装到了一个方法中、4.将一些功能封装到了几个类中、5.将一些具有相同功能的代码封装到了一个程序集中(dll、exe),并且对外提供属性名、方法名等。)继承(是指类与类之间的关系。)为什么要继承?继承带给 的好处?代码重用LSP里氏替换原则(通过代码说明一下, 父类类型变量,指向子类类型对象,以及调用方法时的一些问题)、多态。类的单根继承性、传递性、继承时构造函数的问题(:this(),:base()) 构造函数不能被继承知识点总结virtual、 、接口区别与联系,总结。举例。接口存在的意义:多态。多态的意义:程序可扩展性。最终→节省成本,提高效率。接口解决了类的多继承的问题以后体积庞大的问题。接口之间可以实现多继承不同子类对象之间的差异,写出通用的代码,做出通用的显示实现接口多态的作用:把不同的子类对象都当作父类来看,可以编程,以适应需求的不断变化。虚方法,抽象方法关于虚方法需要注意的几点:1.父类中如果有方法需要让子类重写,则可以将该方法标记为virtual2.虚方法在父类中必须有实现,哪怕是空实现。3.虚方法子类可以重写(override),也可以不重写关于抽象方法注意的几点:1.需要用 关键字标记2.抽象方法不能有任何方法实现。3.抽象成员必须包含在抽象类中。4.由于抽象成员没有任何实现,所以子类必须将抽象成员重写。5.抽象类不能实例化,抽象类的作用:抽象类的作用就是为了让子类继承。6.抽象类中可以包括抽象成员,可以包括有具体代码的成员。7.还有抽象方法不能用static修饰接口1.接口中只能包含方法(属性、事件、索引器也都是方法)2.接口中的成员都不能有任何实现。3.接口不能被实例化。4.接口中的成员不能有任何
修饰符。(默认为public)5.实现接口的子类必须将接口中的所有成员全都实现。6.子类实现接口的方法时,不需要任何关键字,直接实现即可。7.接口存在的意义就是为了多态。小总结封装,继承,多态.五个
修饰符,字段和属性及索引器,里氏替换添加
和导入命名空间静态类练
:Console,Convert,Math使用时是否需要实例化一个静态字段都能在哪里使练习2:用静态类的细节的问题见备注,如果后面遇到则后面再提静态类为什么不能实例化不能继承?留作业作业:定义父亲类Father(姓lastName,property,血型bloodType),儿子Son类(玩PlayGame方法),女儿Daughter类(跳舞Dance方法),调用父类构造函数(:base())给子类字段赋值作业:定义汽车类Vehicle属性(brand(品牌),color(颜色))方法run,子类卡车(Truck)属性weight载重方法拉货,轿车(Car)
属性passenger载客数量方法载客器都属于电子设备,他们都有计算的功能,但是 还有打输入
,根据 显示对应职位的工资,面
象
和计算的功能作业:计算形状Shape(圆Circle,矩形Square
,正方形Rectangle)的面积、周长作业:橡皮rubber鸭子、木wood鸭子、真实的鸭子realduck。三个鸭子都会游泳,而橡皮鸭子和真实的鸭子都会叫,只是
不一样,橡皮鸭子“唧唧”叫,鸭子“嘎嘎”叫,木鸭子不会叫.第二部分:值类型、类型、字符串值类型、类型。类型有哪些
值类型有哪些、值类型均隐式派生自System.ValueType
数值类型、bool、结构、枚举
查看IL,隐式继承自ValueType类型派生自System.Object
字符串、数组、类、接口等
查看IL隐式继承自Object类型变量的赋值只对对象的。值类型变量赋值会拷贝一个副本。值类型、类型作为参数传递值传递,刚才 的参数传递方式都是值传递。传递,ref,传递的是变量的地址。值传递(普通的参数传递)传递(ref)(*)类型传递值类型、值传递、值传递:类型、值类型传递(ref):类型、值类型。常用类库String1.说明字符串的不可变性2.字符串常量的“暂存池”特性。String
字符串,字符串可以看成字符数组,不可变特性(通过for循环,修改string中的元素,失败!)。
属性IsNullOrEmpty()
静态方法,判断为null或者为””(静态方法)ToCharArray()将string转换为char[]ToLower()小写,必须接收返回值。(因为:字符串的不可变);ToUpper()Equals()大写。比较两个字符串是否相同。
忽略大小写的比较,
paration.
Length//获得字符串中字符的个数。”aA我你他”→5
方法”出现的次IndexOf()如果没有找到对应的数据,返回-1.//面试题:统计一个字符串中,”数。如果没有找到对应的数据,返回-1//2个重载,截取字符串。
LastIndexOf()
Substring()
Split()//分割字符串。
Join()静态方法静态方法Format
()Replace()字符串的处理练课上练
:接收用户输入的字符串,将其中的字符以与输入相反的顺序输出。"abc"→"cba“.课上练习2:接收用户输入的一句英文,将其中的单词以反序输出。
“I
love
you"→“I
evol
uoy"课上练习3:”
”从日期字符串中把年月日分别取出来,打印到控制台课上练习4:把csv文件中的联系人
和
显示出来。简单模拟csv文件,csv文件就是使用,分割数据的文本,输出::张三
:
string[]
lines
=File.ReadAllLines(“1.csv”,Encoding.Default);//文件中的所有行,到数组中。字符串的处理练习2练习5:123-456---7---89-----123----2把类似的字符串中重复符号”-”去掉,既得到123-456-7-89-123-2.
split()、StringSplitOptions.RemoveEmptyEntries
Join()练习6:从文件路径中提取出文件名(包含后缀)
。比如从c:\a\b.txt中提取出b.txt这个文件名出来。以后还会学更简单的方式:“正则表达式”,项目中 用微软提供的:Path.GetFileName();(更简单。)练习7:“[port=21,type=ftp]”,这个字符串表示IP地址为的服务器的21端口提供的是ftp服务,其中如果“,type=ftp”部分被省略,则默认为http服务。请用程序解析此字符串,然后打印出“IP地址为***的服务器的***端口提供的服务为***”line.Contains(“type=”)。[port=21]练习8:求员工工资文件中,员工的最高工资、最低工资、平均工资常用类库StringBuilderStringBuilder高效的字符串操作
当大量进行字符串操作的时候,比如,很多次的字符串的拼接操作。
String
对象是不可变的。每次使用System.String
类中的一个方法时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的String
对象相关的系统开销可能会非常大。如果要修改字符串而不创建新的对象,则可以使用System.Text.StringBuilder
类。例如,当在一个循环中将许多字符串连接在一起时,使用StringBuilder
类可以提升性能。StringBuilder!=String//将StringBuilder转换为String.用ToString();StringBuilder仅仅是拼接字符串的工具,大多数情况下还需要把StringBuilder转换为String.
StringBuilder
sb
=
new
StringBuilder();
sb.Append();//追加字符串
sb.ToString();//把StringBuilder转换为字符串。
sb.Insert();
sb.Replace();案例:使用程序拼html中的tableString大量拼接演示。留作业1.判断用户输入的是否是邮箱.2.{"马龙","迈克尔乔丹","雷吉米勒","蒂姆邓肯","科比布莱恩特"},请输出最长的字符串。3.请将字符串数组{
"中国",
" ",
"巴西",
"澳大利亚",
"
"}中的内容反转。然后输出反转后的数组作业:
在传智播客.net部门有个讲师叫小杨,小杨很帅,很纯洁,小杨是智慧和 的化身.第一次听人这么说我不相信,于是我怀着试试看的心情来到了传智播客,见到了
中的小杨。哇塞,小杨岂止是帅,简直就是帅的无法用言语来形容.回收(*)参考以前讲回收的内容,说明:回收回收什么?
什么样的对象会被
回收?
何时回收?ref与out1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。2、使用ref和out时,在方法的参数和执行方法时,都要加ref或out关键字。以满足匹配。3、out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。第三部分:集合、文件操作List<T>与Dictionary<K,V>List<T>集合3个左右案例,Dictionary<K,V>集合3个左右案例每个集合的基本操作方式。案例:两个(List)集合{“a”,“b”,“c”,“d”,“e”}和{“d”,“e”,“f”,“g”,“h”},把这两个集合去除重复项合并成一个。案例:随机生成10个1-100之间的数放到List中,要求这10个数不能重复,并且都是偶数(添加10次,可能循环很多次。)案例:把分拣奇偶数的程序用泛型实现。List<int>把123转换为:壹贰叁。Dictionary<char,char>计算字符串中每种字母出现的次数(面试题)。
“
e
,to
Chinaworld”,不区分大小写,打印“W2”“e
2”“o
3”……
提示:Dictionary<char,int>,char的很多静态方法。char.IsLetter()课下练习:英汉翻译。WinForm做。发英汉词典txt。案例:编写一个函数进行日期转换,将输入的中文日期转换为 数字日期,比如:二零一二年十二月月二十一日要转换为2012-12-21。(处理“十”的问题:1.*月十日;2.*月十三日;3.*月二十三日;4.*月三十日;)4中情况对“十”的不同翻译。1→10;2→1;3→不翻译;4→0【年部分不可能出现’十’,都出现在了月与日部分。】
测试数据:二零一二年十二月二十一日( )、二零零九年七月九日、二零一零年十月二十四日、二零一零年十月二十日装箱拆箱举例说明装箱拆箱的性能损耗分析若干面试题中关于给一段代码,说出装箱、拆箱次数的问题。文件操作重点讲解FileStream、StreamReader、StreamWriter、File、Directory、Path这几个类。FileStream,通过大文件拷贝的案例。案例:使用StreamReader、StreamWriter。。File、Directory、PathPath,比如:GetFileName()、GetDirectoryName()、GetExtension()、Combine()等。课上做练习:请用户输入一个文件路径字符串:把这个路径的每一部分分别输出。例如:文件名、后缀、所在等。说明Path只是对字符串的操作,并不考虑实际文件是否存在。Directory类重点说明GetFiles()、GetDirectoies()方法。案例:做一个
递归到TreeView的案例。Direcotory类的其他方法,做简要说明。File类重点说明ReadAllBytes()、ReadAllText()、ReadAllLines()、WriteAllBytes()、WriteAllText()、WriteAllLines()。并通过Reflector查看
实现,很多其实是调用了StreamReader、StreamWriter。第四部分:正则表达式复习基本元字符案例:
匹配
号码
提取整个页面所有邮箱
提取职位招聘信息页面处理面试题面试题:抓取招聘信息。的href、标题,找职位超
的/job/46629381,c.html,找规只抓取职位的超
“模式”http:律。使用开发 工具,可能看到的源代码 确。第五部分:XML(可扩展标记语言)XML:eXtensible
Markup
Language标记语言?
标记?
标记(markup):文档中任何不想被打印输出的部分(不是真正的文档的内容,联想读书时做的“读书笔记”,在旁边写的注解等。)注解是注解,实际内容是实际内容。
标记的作用:传递了关于文档本身以外的额外信息。比如:标记文档的某部分该如何显示,某部分是什么意思等。重在数据,标记只是为了说明数据的含义而已。常见的标记语言:SGML、HTML、XMLHTML与XML的区别与联系?
Xml作用与应用场合:xml数据
,html数据展示。
语法、是否有预定义 、各自的作用与意义
相关术语:
、节点、根节点、元素、子元素、后代元素、属性、嵌套、命名空间、字符数据(CDATA)Xml语法特点严格区分大小写有且只能有一个根节点有开始 必须有结束 (不严谨)属性必须使没有预定义引号与html不一样中文档 :<?xml
version="1.0"
encoding="utf-8"?>注释:<!---->CDATA区:即原意文本-<![CDATA[…]]>注意编码问题,文本文件实际编码要与文档的编码一致。XML基础(extensible
markuplanguage)XML,学它有什么用。优点:容易读懂;格式标准任何语言都内置了XML分析引擎,不用单独进行文件分析引擎的编写。Xml就是用一种格式化的方式来
数据,并且是文本文件任何时候我们都能很容易的用记事本打开。与Excel、Word不一样。举例:分析出一个xml格式的文件、分析出一个Excel文件。.net程序中的一些配置文件app.config、web.config文件都是xml文件。Office2007的文件格式docx、xlsx、pptx都是xml.先改成rar文件然后解压。性值要用""包围,XML语
范:
(Tag)、嵌套(Nest)、属性。
要闭合,属可以互相嵌套XML树,父节点、子节点、兄弟节点(siblings)XML和HTML的区别:
1.有且只能有一个根元素。
2..XML中元素必须关闭;
3.XML中元素的属性值必须用引号;
4.XML大小写敏感(CaseSensitive)符合XML规范的HTML叫做“符合XHTML标准”。开发的W3C验证。必须通过xml编写完成以后可以用浏览器来查看,如果写错了浏览器会提示。如Linq
To
XML:写读写XML有很多技术,1.Dom[Xml、X](文档对象模型,将整个xml加载到内存中,然后操作)、2.
(事件驱动,.net中使用XmlReader(XmlTextReader)、XmlWriter(XmlTextWriter)来替代)等,还有高级的读写技术3.XmlSerializer(xml序列化,需要先定义类)、
4.Linq
To
XML(System.Xml.Linq),用到的就是X
,Xelement等等,
XmlSerializer要求对每种不同的文件都定义一套类,很麻烦,而Linq
ToXML则不需要单独创建类,当然更底层一些,代码比XmlSerializer多,灵活性更高。System.Xml下的类是2.0及之前操作xml
的,现在很多人也仍然在用这个namespace下的类,这个namespace下的类和Linq
To
XML非常相似,因此不用单独学。类XElement,一个XElement表示一个元素,new,调用Add增加子元XElement(“Order”),创建一个名字为Order的素,也是XElement
对象,和TreeView一样。想得到字符串怎么办?ToString调用XElement的Save方法将xml内容保存在Writer中创建xml的时候可以用X
也可以不用。(直接用XElement)<!--fffff-->是注释(Comment),<connectionStrings>是元素(Element),他们都是节点(Node)。因为Nodes返回的即可能是注释,也可能是元素,所以只能返回Node类型。xdoc.Elements()//只返回元素xdoc.Nodes()返回所有节点(包括注释等。)//Descendants()在子孙后代中找
名为DefaultTask的元素//慎用,容易取错结点//var
task
=Xml的约束:Xml没有任何预定义
,可以任意定义想要的
。查看App.config或者Web.config中的元素,并不是可以随意定义的。通过应用程序操作XML三种方式:
1>Dom(
Object
Model)方式,把Xml看做树,每个元素是节点(联想TreeView)
Xml
X→.net2.0→net3.x(Linq
to
Xml)
2>SAX(Simple
API
for
XML)方式,事件模型。在.net中则使用:
(XmlReader、XmlWriter)。SAX是push,XmlReader则是pull.
3>Xml序列化:XmlSerializer若干练习与案例:
先介绍xpath
写xml
List集合数据导出到xml
读xml到TreeView递归显示
后面的案例
Xml增删查改+登录Linq
To
XML:读X doc
=
X象.Load(reader),加载XML文件,X就是加载的对解析订单号:doc.Roo
ement("OrderNumber").Value遍历订单项:foreach
(XElemen ement
in
doc.Root.Descendants("Items").Descendants("OrderItem")){ement("ItemName").Value,Console.Wri
ine("商品名:{0},数量:{1}",elemenelemen
ement("Count").Value);}属性,Attribute(""),
带属性的订单foreach
(XElemen ement
in
doc.Root.Descendants("Items").Descendants("OrderItem")){Console.Wri
ine("商品名:{0},数量:{1}",element.Attribute("Name").Value,element.Attribute("Count").Value);}使用Linq来进行XML的操作(*),代码见备注手写XML来读,这样锻炼手写XML的能力。案例:银行交易数据读写<CFX><MSG><交易码
val="1000"/><流水号
val=""/><金额
val="1234567890.12"/><付款机构
val="1234"/><付款单位账号
val="90"/><收款机构
val="1234"/><收款单位账号
val="90"/></MSG><MSG>...................</MSG></CFX>上述文件.在控制台输出。详细xml和代码见:ytbank.xml易错:“交易码”是节点Element,value才是属性是Attribute。输出RSS中就会用到
数据库写XML。XML扩展(*)Schema、DTD:在App.Config中“转到定义”会看到文件的定义约束文件,DTD约束能有哪些属性、能有哪些元素。第六部分:委托事件为什么有委托delegate委托是一种数据类型,像类一样(可以变量)。方法参数可以是int、string、类类型
void
M1(int
n){
}
√
void
M2(string
s){
}√
void
M3( p){
}
√那么能不能把方法也作为参数进行传递?委托类型
void
M4(M1
method){
method();
}
??能把方法作为参数吗??,如果能,那么把方法作为参数的意义何在?
使用普通变量的时候是直接取值,或赋值。而使用委托变量的时候,
还可以直接调用。学习委托的过程的效果(好处)1.委托带给2.委托的语法3.委托的微观描述4.项目中什么时候用委托。5.委托的本质。案例案例1:建一个类库项目,再建两个测试项目。在指定的位置记录当前时间,(1.输出到控制台2.写入文件。)委托就是一种数据类型,用来存放方法的数据类型。委托的使用委托的方式:delegate
返回值类型委托类型名(参数)比如delegate
void
StringProcess(string
s);注意这里的除了前面的delegate,剩下部分和 一个函数一样,但是StringProcess不是函数名,而是委托类型名什么样的方法就 什么类型(方法参数与返回值)的委托。的委托是一种类型,就像int、
一样,如果要用的话还要的变量, 委托类型变量的方式:StringProcess
f1;委托类型将委托类型变量指向函数StringProcess
sp=new
StringProcess(Say
o),这样就可以像调用普通函数一样把sp当成函数用了。委托可以看做是函数的指针。整数可以用整数变量指向它,对象可以用对象变量指向它,函数也可以用委托变量指向它。和直接调用函数的区别:用委托就可以指向任意的函数,哪怕是之前没定义的都可以,而不使用受限于那几种。将委托类型变量指向函数还可以简化成StringProcess
sp=Say
o,编译器帮进行了new。但是不能sp=PrintIt(),因为这样就成了函数调用。案例2:(还是单独建一个类库)有一个方法ChangeString(string[]srtArr);传入一个字符串数组,在每个元素两边加一个’=’。//当 让元素全部大写,怎么办?(也可以把委托作为‘参数’)。//将用户的代码“注入”到了你的程序中。委托使用案例:字符串数组处理delegate
stringProcessDelegate(string
s);
static
void
ProcessIntArray(ProcessDelegate
p){string[]
values
=
new
string[]
{"aB","Cd"};for
(int
i
=
0;i
<
values.Length;
i++){values[i]
=
p(values[i]);}Console.Wri
ine("处理后");foreach
(string
s
in
values){Console.Wri
ine(s);}}编写函数,大写、小写、加引号进一步体会:和直接调用函数的区别:用委托就可以指向任意的函数,哪怕是之前没定义的都可以,而不使用受限于那几种。方法(*,知道即可)使用Delegate的时候很多时候没必要使用一个普通的方法,因为这个方法只有这个Delegate会用,并且只用一次,这时候使用 方法最合适。方法就是没有名字的方法。3就是没有名字的int对象。3+5就是两个
int对象的相加,允许 对象,就允许方法。ProcessWordDelegate
p
=
delegate(string
s){Console.Wri
ine(s);};知道C#中有 方法,看到这种写法知道是函数即可。方法与lambda表达式最终编译为一个方法。多播委托*(委托链,委托的组合)delegate
void
ProcessWordDelegate(string
s)ProcessWordDelegate
d
=
newProcessWordDelegate(Say
o)+newProcessWordDelegate(ToLower)多播委托如何处理返回值?
委托绑定多个方法后,其中一个方法执行发生异常后面的方法还会继续执行吗?不会!
一个重要的方法GetInvocationList();//返回一个Delegate[]类型。Delegate类是一个抽象类,是所有委托的父类。组合的委托必须是同一个类型相当于创建了一个按照组合的顺序依次调用的新委托对象。委托的组合一般是给事件用的,用普通的委托的时候很少用为委托的增减方法d+=Say
o,为委托增加一个方法,不要感觉奇怪,因为它就是d=d+
Say
od-=Sayo,将方法从委托中移除。bine();委托的不可变性委托具有类似于string一样的不可变性。即时窗口中查看地址。
==============================================================建议使用的时候尽量少定义自己的委托,使用系统中已经有的委托。减少程序集中定义的类型的个数.无参数,无返回值的委托可以用:Action。委托的本质1(*)其实就是一个类把方法包装了一下,委托都继承自System.MulticastDelegate,而System.MulticastDelegate又继承自System.Delegate多播委托就是有一个委托数组,依次调用。查看自己写的委托的IL代码:看不到Invoke()方法的代码,该代码由CLR在运行时自动生成。参考备注1.事件(通过委托实现的,委托才是事件能正常执行的
内容)事件语法:event
ProcessWordDelegate
例子OnInt加了event关键字实现事件机制的好处:用了event事件,不可以修改事件已经的值;不可以冒充进行事件通知了。在IntUC类外部就不能通过OnInt(3)的方式调用的委托了。只能+=、-=!课上练习:实现连续点击三次触发TriClick事件的按钮(用UserControl),用EventHandler这个委托就行。注意不要了封把判断次数的代码写到用控件的窗口上,否则就装的原则。动态设置控件事件事件本质论event会自动生成一个privatedelegate变量和两个函数:add和remove,C#编译器用这两个方法支持+=和-=操作符(*)。C#<>.Net。public
event
MyDelegate
OnEvent;实现是(示例性)private
MyDelegate
OnEvent;public
void
Add(MyDelegate
d){OnEvent+=d;}public
void
Remove(yDelegate
d){OnEvent-=d;}因为OnEvent是private的,所以在类外部不能OnEvent(1)触发事件,但是在类内部可以。public的方法只有Add和Remove,所以只能+=、-=,其他的操作都是不可以的。用普通Delegate实现事件(不用记)不进行控制的缺点:可以用Click=null来清除所有 的事件,可以用Click()来“ ”事件的触发。为什么要判断if(MyClick!=null)?什么时候为null?解决方案,把委托成员做成private的,然后增加
AddClickEventHandler、RemoveClickEventHandler两个
public的方法。实现判断用户名、
是否正确的控件委托和事件的区别(常考)委托和事件没有可比性,因为委托是数据类型,事件是对象(可以理解为对委托变量的封装。),下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别。事件的
是用委托实现的。(举例子:三种实现事件方式的区别(直接用委托实现、用私有委托+公有方法模拟事件,直接用event事件实现))因为对于事件来讲,外部只能“
自己+=、注销自己-=”,外界不可以注销其他的者,外界不可以主动触发事件,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这种语法。add、remove。事件是用来委托实例的。事件只能add、remove自己,不能赋值。事件只能+=、-=,不能=、不能外部触发事件。委托与事件总结委托的作用:
占位,在不知道将来要执行的方法的具体代码时,可以先用一个委托变量来代替方法调用(委托的返回值,参数列表要确定)。在实际调用之前,需要为委托赋值,否则为null。事件的作用:
事件的作用与委托变量一样,只是功能上比委托变量有的限制。(比如:1.只能通过+=或-=来绑定方法(事件处理程序)2.只能在类调用(触发)事件。)在自定义控件(自己编写控件的时候,会大量用到.编写控件的时候,会写一些事件。但是当这些事件被触发以后,具体执行的那些事件处理程序是编写控件的人没法确定的。这个时候只能通过事件来占位(调用),具体调用的是哪个方法,由使用控件的人来决定(Click+=new
委托(方法名);))第七部分:反射程序集程序集?
程序集是.net中的概念。
.net中的dll与exe文件都是程序集。(exe与dll的区别?)
程序集(Assembly),可以看做是一堆相关类打一个包,相当于java中的jar包(*)。程序集包含:类型元数据(描述在代码中定义的每一类型和成员,二进制形式)、程序集元数据(程序集 、版本号、名称等)、IL代码(这些都被装在exe或dll中)、资源文件。每个程序集都有自己的名称、版本等信息。这些信息可以通过AssemblyInfo.cs文件来自己定义。使用程序集的好处?
程序中只 必须的程序集,减小程序的尺寸。
程序集可以封装一些代码,只提供必要的 接口。?、GAC(全局程序集缓存)如何添加程序集的
添加路径、项目
不能循环添加
在c#中添加其他语言编写的dll文件的 。(参考P/Invoke,在.net中调用非程序集的dll)extern反射反射无处不在,
天天在使用。Vs的智能提示,就是通过反射获取到类的属性、方法等。还有反编译工具也是通过反射实现反射就是动态获取程序集的元数据(提供程序集的类型信息)的功能反射:就是动态获取程序集中的元数据来操作类型的。Type类实现反射的一个重要的类,通过它
可以获取类中的所有信息包括方法、属性等。可以动态调用类的属性、方法。Type是对类的描述。如何获取
类中的所有属性?反射就是直接通过.dll来创建对象,调用成员。先通过一个普通类介绍Type.(
)通过类型元数据来获取对象的一些相关信息,并且还可以实例化对象调用方法等,这个就叫做“反射”。反射让创建对象的方式发生了改变。编译器的智能提示就是反射的一个应用。Type类Type类的使用
通过类获得Type:Type
t
=
typeof(
)
通过对象获得类的Type:Type
t=p.GetType()
“c:\abc.dll”
Assembly
asm=Assembly.LoadFile(“c:\abc.dll”);
调用Assembly的GetExportedTypes方法可以得到Assembly中定义的所有的public类型。
调用Assembly的GetTypes()方法可以得到Assembly中定义的所有的类型。
调用Assembly的GetType(name)方法可以得到Assembly中定义的全名为name的类型信息。
插件:扩展主程序功能的dll.动态创建对象Activator.CreateInstance(Type
t)会动态调用类的无参构造函数创建一个对象,返回值就是创建的对象,如果类没有无参构造函数就会报错。GetConstructor(参数列表);//这个是找到带参数的构造函数。Type类的方法:在编写调用插件的程序时,需要做一系列验证。
boolIsAssignableFrom(Type
c):(直译:是否可以从c赋值)判断当前的类型的变量是不是可以接受c类型变量的赋值。
typeof(IPlugin).IsAssignableFrom(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度虚拟现实技术研发与应用合同:某科技公司3篇
- 2024年度汽车美容店特许经营权授权合同3篇
- 2024年度饭店装修工程招租合同
- 二零二四年市场营销策划合同
- 2024年度农业机械的购买使用合同
- 2024年度企业销售代理合同
- 餐厅整修合同范本
- 2024年度电气设备安装工程环保合同3篇
- 2024年度融资合同标的为新能源项目
- 二零二四年度环保设备采购合同(含安装与调试)
- 第三单元 雪域天音 -热巴舞曲 课件 2023-2024学年人音版初中音乐八年级上册
- 读书感悟《活在课堂里》第四辑
- 2024年服务行业技能考试-福彩投注站销售员笔试历年真题荟萃含答案
- 《勾股定理逆定理》观评课报告
- 社区电动车棚新(扩)建及修建充电车棚施工方案(纯方案-)
- 生物科学师范生生涯发展报告
- 职业生涯规划生物学科教师
- 监理办公室岗位责任制度牌
- 小学美术四年级上册 第11课 门 窗 墙(全国一等奖)
- 介绍方志敏(修订版)
- 国家非物质文化遗产竹编
评论
0/150
提交评论