《2022年C#语言学习笔记 .pdf》由会员分享,可在线阅读,更多相关《2022年C#语言学习笔记 .pdf(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C学习笔记1 C#语言学习笔记C#完全手册 .pdf1. 面向对象 = 对象 + 类 + 继承 + 通信 。如果一个软件系统是使用这样四个概念来设计的,我们认为这个软件系统是面向对象的。2. 静态成员是属于类所有的, 非静态成员则属于类的实例- 对象。3. 在一个类的实例对象的生命周期中,最先执行的代码就是类的构造函数。 构造函数是用来 初始化 对象的特殊类型的函数。可以使用带参数的构造函数,向它传递参数来对类的不同实例进行不同的初始化。4. 非静态方法可以访问类中的任何成员,而静态方法只能访问类中的静态成员。5. 方法的重载:类中两个以上的方法(包括隐藏的继承而来的方法),取得名字相同,只要
2、使用的参数类型或者参数个数不同, 编译器便知道在何种情况下应该调用那个方法,这就叫方法的重载*也就是说,可以在一个类中定义两个名字相同的方法,只要参数或者返回值有一点不一样就可以。调用的时候,编译器会根据情况自动调用正确的方法。6. 在 C#中,所有数据要么属于某个类, 要么属于某个类的实例,从份体现面向对象的思想。7. 域const 型 表 达 式 的 值 在 编 译 时 形 成 , 而static readonly 表达式的值直到程序运行时才形成。8. 事件(event )就是类或对象用来“发出通知”的成员。通过提供事件的句柄, 客户能够把事件和可执行代码联系起来。9. 事件的预定是通过为
3、事件加上左操作符“+=” 来实现的。10.如果每个事件的存储开销太大,我们就可以在类中包含事件访问声明, 按私有成员的规则存放事件句柄列名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 19 页 - - - - - - - - - C学习笔记2 表。11.多态性:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。多态性通过派生类重载基类中的虚函数型方法来实现。12.多态性:同一操作作用于不同的类的实例,不同的类将进行不同的解释,最后产生不同的执行结果。C支持两
4、种类型的多态性:编译时的多态性:通过重载实现。对于非虚成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。运行时的多态性:通过虚成员实现。13.派生类中重新定义此虚函数时,要求的是方法名称、返回值类型、参数表中的参数个数、类型、顺序都必须于基类中的虚函数完全一致。在派生类中声明对虚方法的重载,要求在声明中加上override关键字,而且不能有 new ,static,virtual修饰符。14.非虚的派生类要求通过重载为继承的虚方法提供自己的实现,而抽象方法则不包含具体的实现内容,所以方法声明的执行体中只有一个分号“; ” 。15.密封方法必须对基类的虚方法进行重载,提供
5、具体的实现方法。 所以,在方法的声明中, sealed 修饰符总是和 orerride修饰符同使用。属性声明时如果有sealed修饰符,同时也必须要有orerride修饰符。16.构造函数实例构造函数和静态构造函数。 前者在每个实例或对象创建时被调用,后者在类的第一个对象被创建 之前被调用(而且只调用一次) 。17.析构函数尽量不用18.装配有两种类型:应用程序和库。应用程序都有一个入口,通常扩展名为“.Exe” 。库则不包含入口,通常扩展名为“ .dll”名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - -
6、 - - - - 第 2 页,共 19 页 - - - - - - - - - C学习笔记3 薄弱环节:1事件和索引指示器2属性访问器3接口名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 19 页 - - - - - - - - - C学习笔记4 21 天学通 C# 1由于 sizeof运算符直接操纵内存,因此应尽可能避免使用它。2Switch 语句每一个分支中的语句,必须以break 结束。3随机数int nbr = 0; System.Random rnd = new
7、 System.Randow(); Nbr = (int) rnd.Next(1,11); 4类的说明格式class_name object_identifier = new class_name() ; 关键字 new 用来预留内存。5类中包含:数据成员和函数成员。 (数据成员甚至可以是其他类)数据成员如果不加public限定符,将无法在类的外面访问。访问静态数据成员时, 必须使用类名,而不是对象名。6属性为访问类中的私有变量提供了手段。 重新声明一个 public变量,通过它,利用属性存储器get 和set 中的程序语句赋值或取值,访问私有变量。例:class point int my_X
8、; public int x get return my_X; set 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 19 页 - - - - - - - - - C学习笔记5 my_X = value; 7名称空间是一组被命名的类。 将类集中在一起, 形成名称空间。8通过使用关键字using实现使用类和方法的简捷方式 , 无 需 总 是 指 定 全 限 定 名 称 。 比 如Sytem.Console.WriteLine 是全限定名称,假如使用了 using Syst
9、em ;就可以用Console.WriteLine来使用 Console 类中的例程了。9在 C中例程被称为方法或函数,两者没有区别。10 类的方法要使用所属类的数据成员,可以用 this.数据成员的方法引用。11 给类的方法传递参数时, 要按引用传递, 需要在方法头中的数据类型前面加上关键字 “ref ” 。若要返回参数,需要将其属性设臵为关键字out。调用方法时,参数前也要加上“ out ” 。12 声明数组 decimal balances;然后还要实例化 balances = new decimal 例如:声明一个二维数组,同时实例化,并赋初值char, letters = new c
10、har2,3a,b ,c,x,y ,z 在二维数组中声明长度不同的数组char myname = new char3 myname0=new chara,b ,c; myname1=new chart,k ,i,b ,c; myname2=new chara,b ,o ,c; 引 用 数 组 要 素 时 必 须 用 两 个 方 括 号, 如 ,myname21 数组的长度被存储在一个名为Length 的成员中。myname2. Length 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - -
11、 第 5 页,共 19 页 - - - - - - - - - C学习笔记6 可用 foreach 遍历数组。13方法重载:指的是创建多个 名称相同 的方法。其中每个方法都在某些方面具备唯一性, 以便编译器能够区别它们。每个方法都有其特征标(signature ) ,方法的参数个数及类型决定哪个方法是合适的。但,返回类型不能作为特征标。其实就是 c将名称一样, 参数不同的方法视为不同的方法,并自动匹配。构造函数也可以重载。14 方 法 要接受 未 知数目 的 参数 ,可以 使用 关键 字params,该关键字用于参数列表中, 声明参数列表最后面的值。 params 关键字与数组一起使用。例:
12、public static long add(params int args)Main 方法也可以接受不同数目的参数,但不需要在Main 方法中使用params 关键字。标准做法如下:public static int |void Main(string args) 15 如果类变量是标准的、 非静态变量,可以使用关键字this 。例如,要访问类的数据成员x,使用 this.x。避免与其他局部变量冲突。16 给构造函数加上限定符private实际上可以禁止创建对象。这个类就变成不能创建对象的类了。17 创建名称空间可以使用关键字namespace 后面给标识该名称空间的名称。 然后使用花括号将
13、该名称空间包含的类型括起来。例如:namespace Consts 使用 using 关键字来使用名称空间以后,不必使用全限定名称了。using 还可以为名称空间提供别名。如:using doit = System.Console; doit.WriteLine(blah ); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 19 页 - - - - - - - - - C学习笔记7 18 try 和 catch try 命令给代码块加上包装(用花括号) ,帮助发送(ro
14、ute )任何可能发生的异常。catch 让您捕获 try 命令发送的异常。例如: catch(System.Exception e) Console.WriteLine(The following exception was caught:n0,e); *可有多个 catch 语句, 应该在前面捕获较具体的异常,后面捕获较通用的异常。19 finally 语句不管try 语句是否执行成功,都会执行。20 throw 关键字引发异常 , 并终止程序 . 可以用来作合法性检查 . throw(exception); 21 引发自己的异常前要先声明它. 格式: class ExceptionNam
15、e:Exception 其中, ExceptionName 以 Exception 结尾. 用 throw 引发: throw(new MyThreeException(); /MyThreeException是自己声明的异常22 checked 将过大或过小的值赋给变量将引发异常;unchecked 将过大或过小的值赋给变量时, 直接进行裁剪 . *在编译器中最好设臵 , checked 23 类的继承class derived_class:base_class 例如: class Employee : Person 24 派生类的构造函数后加上冒号和base 关键字 , 就可以调用基类的
16、构造函数 . 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 19 页 - - - - - - - - - C学习笔记8 base() 的括号中填入基类的构造函数的参数 . 当基类的构造函数执行完毕后, 将执行派生类的构造函数中的语句。关键字 base 也可以用于直接调用基类的方法。public new void displayFullName() Console.Write(Emlooyee:); Base.displayFullName(); /displayFull
17、Name()是基类的方法 / 派生类中的新方法displayFullName先显示一行信息,然后调用基类的displayFullName方法。这样就可以扩展基类的功能而不用重写所有代码。派生类中的方法与基类的一个成员方法同名,而且使用了关键字new 。那么该方法将覆盖基类中同名的方法。25虚方法能够调用 实际被赋给的对象 所属类中的方法,而不是基类的方法。 (以便实现多态性)在基类的方法声明中使用关键字virtual。如果这种方法在派生类中被覆盖 (overriddren) ,则在运行阶段,调用的将是变量实际所属类的方法,而不是其被声明的类的方法。这意味着可以使用基类来指向多个派生类,而调用相
18、应的方法。 在 派 生 类 中 同 名 的 方 法 声 明 中 使 用 关 键 字override 。26假如将派生类的对象赋给基类对象变量,基类对象变量也只能访问 基类的数据成员和方法。但是使用了虚拟方法和覆盖方法后。调用的则是它们被实际赋给的值 所属类 中相应的方法。27 强制派生类覆盖基类的方法:使用关键字 abstract ,将基类的方法声明为抽象的。没有方法体(没有花括号,并以分号结束),由派生名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 19 页 - - -
19、 - - - - - - C学习笔记9 类来提供。*基类的声明以及方法声明都要使用abstract ,派生类的同名方法要使用override 。28 密封类(禁止类被继承)使用关键字 sealed 。例:sealed public class number *其数据成员应声明为私有。29 在 C中所有的东西都是Object 类的派生类,都包含 GetType和 ToString 方法。30 装箱(boxing )指的是将值类型转换为引用类型(对象) ;拆箱指的是显示地引用类型转换为值类型,被拆箱的值必须存储到相应的数据类型变量中。31 关键字 is 用于确定变量是否为指定的类型。格式: (ex
20、pression is type ) ,返回 true 或 false 。*主要在程序运行时检查类型32 as 运算符的功能与强制转换类似,将对象强制转换为另一类型。(目标类型必须与源类型兼容)格式: expression as DataType 强制转换格式:(DataType) expression 二者的区别:强制转换出现问题将引发异常;as 关键字,源类型无法转换为目标类型时,首先将其臵为null ,然后再转换为目标类型,因此不会引发异常。33 is 和 as能够让同一个数组中存储数据类型不同的对象,只要这些对象的基类相同即可。*as 转换时不会引发异常, is 用来确定对象类型。34
21、 强 制 向 上 转 换 ( upcasting ) 和 强 制 向 下 转 换(downcasting )强制向下转换是指将对象强制转换为其派生类对象;强制向上转换指的是强制将对象转换为其基类对象。在C中,强制向上转换是安全的,是一种名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 19 页 - - - - - - - - - C学习笔记10 隐式操作;而强制向下转换是不安全的,必须显示进行转换。35 抽象类指的是至少包含一个抽象方法的类。而抽象方法指的是被继承时,必须覆
22、盖的方法。36 接口是另一种类似于类的引用类型。 用途是定义要声明的类中将包含什么, 但不定义实际的功能。 接口类似于抽象方法。接口是关于类需要实现的功能的指南。接口只包含方法、属性、事件和索引器(indexer ) ,而不包含数据成员、 构造函数和析构函数, 也不能包含静态成员。C#通过允许实现多个接口提供了多重继承的功能和好处。37 使用接口的好处:首先, 可以将接口作为一种给结构提供继承特性的途径。另外,可以在一个类中实现多个接口, 从而获得抽象类无法获得的功能。最大的价值,可以给类添加通过其他方法无法实现的特征。另一个好处,强制新的类实现接口定义的所有特征。而继承带虚拟成员的基类, 则
23、可能不为虚拟成员提供实现代码。这使得新类和使用新类的程序可能出错。38 应该说:类实现了接口。而不是:某个类继承了接口。39 假如类包含多个接口, 就必须实现这些接口的所有成员。假如多个接口中有名称相同的成员,则只需实现一次。如果要分别为这两个同名的接口成员实现方法,那么在实现时,在成员名前加上接口名用来区分就行了。使用时通过使用显示定义和强制转换,可以确保正确的方法被调用。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 19 页 - - - - - - - - - C
24、学习笔记11 40 索引器能够将索引用于对象来获得该对象中存储的值。这实际上使得能够像对待数组那样对待对象。创建索引器后,便可以对对象使用方括号()来设臵或取得对象中的值。如:对象名. 类似于属性,比属性还方便。41 代表(delegate )代表是一种引用类型, 定义了方法调用的特征。这样代表便可以接受并执行具有这种特征标格式的方法。声明格式: public delegate void Sort (ref int a,ref int b)代表经常和接口进行类别。 接口是一种引用类型,它定义了类的设计方案 (layout ) ,但本身并没有如何功能;而代表定义了方法的设计方案,但本身并不定义方
25、法,而是接受并使用其设计方案 (特征标)匹配的方法。 (引用一个代表, 可以自动调用合适的方法)*特征标包含方法返回的数据类型(returntype)以及方法将接受的参数类型和个数(parameters )*通过实例化代表,将方法与代表关联起来。例如: Sort up new Sort (Ascending) ;其中, Sort是代表, up 是对象( Sort的实例),Ascending 是方法。*使被委托的方法执行:创建一个方法,接受代表对象为参数。那么该通用方法便可以执行被委托给代表的方法。在 C和 C中的函数指针, 其功能与代表相同。42 事件是类发出的通知, 指出发生了某种事情。 这
26、样其他的类可以根据通知执行某种操作。*创建并使用事件的步骤包括:为事件建立代表、创建一个类来给事件处理程序传递参数、 声明事件对应的代码、创建事件发生时将执行的代码(处理程序)以及使事件发生。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 19 页 - - - - - - - - - C学习笔记12 要使用事件, 首先需要为它创建一个代表。 格式如下:delegate void EventHandlerName(object source,xxxEventArgs e)
27、; 其中, EventHandlerName 是事件处理程序对应的代表名称。事件的代表总是接受两个参数,object source 是引发事件的源, xxxEventArgs e 是一个类,它包含事件处理程序可以使用的数据。这个类从EventArgs 类派生而来,后者位于名称空间System中。下面的代码为事件创建一个代表。 该事件检查赋给的字符,如果是特定的字符,则事件发生:delegate void CharEventHandler(object source,CharEventArgs e); EvertArgs 类,用于将数据传递给事件处理程序,它可以派生出这样的新类, 即包含用于存储
28、所需值的数据成员。派生类的格式:public class xxxEventArgs:EventArgs /Data members public xxxEventArgs(type name) /Set up values 然后,便可以在派生类中加入数据成员,并在构造函数中加入初始化数据成员值的逻辑。 这个类将被传递给事件处理程序,其中应该包含事件处理程序需要的所有数据。(3)事件类的代码创建一个引发事件的类, 它包含事件的声明。 事件声名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第
29、 12 页,共 19 页 - - - - - - - - - C学习笔记13 明的格式如下:public event xxxEventHandler EventName; 其中, xxxEventHandler是为事件创建的代表。EventName是要声明的事件的名称。 概括的说, 这行代码使用关键字 event 创建一个名为 EventName 的事件实例,其类型为xxxEventHandler 。EventName将被用于给代表指定方法以及执行方法。(4)创建事件处理程序事件处理程序是一个代码片段, 在事件发生时将被通知。 是使用代表的格式创建一个方法, 其格式如下:void hander
30、name (object source,xxxEventArge argName) /Event Handler code 其中 handername是事件发生时将被调用的方法的名称。(5)还要将事件处理程序和事件关联起来,这应该在主程序中进行。先要声明一个包含事件的对象, 然后就可以使用事件了。每当对象的 set 逻辑被调用时, 便将按其中的逻辑运行,包括创建事件对象和引发事件。然后用 +=运算符将事件处理程序和该对象关联起来。格式如下:ObjectWithEventName.EventObj += new EventDelegateName(EventName); 其中,ObjectWit
31、hEventName 是使用 事件类 声明的对象,EventObj 是在事件类中声明的事件对象,运算符+=是一个指示器,指出接下来要将一个事件处理程序加入到事件中。关键字 new指出应创建接下来的事件处理程序。最后事件处理程序的名称被传递给代表EventDelegateName。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 19 页 - - - - - - - - - C学习笔记14 完整的例子:程序清单14.3 使用事件和事件处理程序1:/events.cs Usi
32、ng events 2:/- 3: 4: using System; 5: 6:delegate void CharEventHandler(object source ,CharEventArgs e); 7: 8:public class CharEventArgs : EventArgs 9: 10: public char CurrChar; 11: public CharEventArgs(char CurrChar) 12: 13:this.CurrChar = CurrChar; 14: 15: 16:17:class CharChecker 18: 19:char curr_c
33、har; 20:public event CharEventHandler TestChar; 21:public char Curr_Char 22: 23:get return curr_char; 24:set 25: 26:if(TestChar !=null) 27: 28:CharEventArgs args = new CharEventArgs(); 29:TestChar(this,args); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 19 页
34、 - - - - - - - - - C学习笔记15 30: curr_char = args.CurrChar; 31: 32: 33: 34: 35:36:class myApp 37: 38:static void Main() 39: 40:CharChecker tester = new CharChecker(); 41:42:tester.TestChar += new CharEventHandler(Dorp_A); 43:44:tester.Curr_Char = B; 45:Console.Writeline(0 , tester.Curr Char); 46:47:te
35、ster.Curr_Char=r; 48:Console.WriteLine(0 , tester.Curr_Char); 49:50:tester.Curr_Char = a; 51:Console.WriteLine(0 , tester.Curr_Char); 52:53:tester.Curr_Char = d; 54:Console.WriteLine(0 , tester.Curr_Char) 55:56: 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 1
36、9 页 - - - - - - - - - C学习笔记16 57:58:static void Drop_A(object source, CharEventArgs e) 59: 60:if(e.CurrChar = a|e.CurrChar = A) 61: 62:Console.WriteLine(Dont like a!); 63:e.CurrChar = X; 64: 65: 66: 43 多个事件处理程序可以通过多点传送 (multicasting)为同一个事件声明多个事件处理程序。新加入的处理程序必须有同样的格式,即接受一个object对象和一个从 EventArgs 派生的对象
37、,并且返回值void 。要加入其他的事件处理程序,要使用运算符+=。事件发生时,多个事件处理程序都将运行。删除事件处理程序,应使用运算符-=。44 前两周总结程序清单 WR2.1 21点游戏45 通用语言规范 .NET框架中的类遵循了通用语言规范(Common Language Specification, 或称 CLS ) . CLS是一套规则,运行在 .NET平台上的所有语言都必须遵守。其优点在于,使用一种语言编写的代码可以被另一种语言调用。46 使用 File 类的方法时,一定要加入异常处理。47 简 单 对 象 访 问 协 议 ( Simple Object Access Protoc
38、ol ,或称 SOAP )在程序和 Web服务之间进行通信。 SOAP是一种用于格式化有关方法调用和数据等信息的标准方式,这种格式化是基于XML 标准的。使用 SOAP ,程序和 Web服务之间能够进行交互。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 19 页 - - - - - - - - - C学习笔记17 48 建立并使用 Web服务包括三步:(1)创建 Web服务;(2)创建使用 Web服务的程序;(3)创建一个帮助程序调用Web服务的文件,这种助手程序被称
39、为Web代理。49 创建代理可以用 .wsdl.exe ,微软的 .NET 框架中提供了该工具。 (详见本书 p412)50 重载双目运算符格式与创建方法类似。 其通用格式如下:public static return_type operator op(type x,type y) return return_type; 重载加法运算符public static Achar operater+ (Achar orig, int val) Achar result = new Achar(); result.ch = (char)(orig.ch + val); return result; 5
40、1 重 载 逻 辑 运 算 符 比 重 载 关 系运 算 符 大 。 如= 和 != ,首先,不能只重载其中一个, 要重载其中一个,必须对两个都进行重载。 另外,要重载这些运算符,还必须重载两个方法: Equals()和 GetHashCode() 。因为逻辑运算符在幕后使用了他们。52 反射通过反射可以了解程序中哪些方法、属性、事件和其他成员是可用的。反射的第一步是获知类型, 获知类 (或其他数据类型)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 19 页 - -
41、- - - - - - - C学习笔记18 所属类型的方法是使用静态方法Type.GetType 。该方法的返回值是一个类型,可被赋给Type 对象。例:Type MyTypeObject = Type.GetType(testclass); 这样 MyTypeObject 将包含 testclass所属的类型,并可以通过它使用 GetMembers 方法来获取 testclass的成员。 GetMembers方法返回一个由MemberInfo 组成的数组。调用 MyTypeObject(它包含 testclass所属的类型)的 GetMembers方法的代码如下:MemberInfo Mym
42、emberarray = MyTypeObject.GetMembers(); 这样 Mymemberarray将包含该类型中的成员,可以遍历该数据,查看每一个成员。如:Mymemberarraycounter.Name; Mymemberarraycounter.MemberType.ToString(); *MemberInfor 类位于名称空间Reflection中,为避免使用全限定名, 需要 System.Reflection包含进来。还可以使用许多其他的类型来限制获取的信息。例如,可以声明一个 FieldInfo类型,并获取关于类型中字段(数据成员)的信息。更多的类型参表 21.1
43、用于发现具体信息的类型53 属性 C# 通过使用属性来实现扩展自身。使用属性将额外的信息与C程序中的代码联系起来,这样便可以在运行阶段获得这些信息。使用属性通常包括三步:第一步是定义属性。要使用属性,必须先创建它(虽然NET框架中包含一些预定义的属性)。第二步是将属性与代码元素关联起来。第三步是在运行阶段查询属性。如果不通过查询来使用属性,则拥有它们便毫无意义。*属性放在要关联的代码运算的前面,使用方括号括起来指示。*可与属性关联起来的代码元素有: 组合体,事件方法,名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理
44、- - - - - - - 第 18 页,共 19 页 - - - - - - - - - C学习笔记19 字段,方法,程序模块,参数,属性,返回值,类或结构。*可以将多个属性与同一个代码元素关联起来。分别列出每一个属性就可以了。*属性可以带参数, 在属性中包含参数旨在提供额外的信息。用于属性的参数有两类:位臵(positional)参数和命名( named )参数,其中位臵参数也被称为非命名( unnamed )参数。位臵参数的位臵非常重要,必须被放在指定的位臵,因此其名称变得不那么重要了。名称参数的位臵则不重要。名称“名称参数”是基于这样的事实的,即参数规范中必须包含参数的名称。通过包含名称,便知道参数是什么。*属性是一种有特殊用途的类。*通过反射来访问属性信息*完整的例子:程序清单 21.6 complete.cs;使用自定义属性薄弱环节:1事件2属性名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 19 页,共 19 页 - - - - - - - - -