C#高级编程学习笔记和代码(2)

2019-01-19 18:44

4.类转化is和关键字as

Is运算符来检查用户自定义的类类型的使用方法。

As运算符的功能与强制类型的转换类似,可以将一个对象强制转换为另一个类型。as格式如下: 变量 as 数据类型 示例代码和运行结果如下:

namespace InterfaceTest {

classTestisas { }

publicclassPerson {

publicstring name; public Person() { } public Person(string na) { this.name = na; }

publicvirtualvoid Showname() {

Console.Write(\, name); } }

publicclassEmployee : Person {

publicshort hireyear;

public Employee() : base() { }

public Employee(string i) : base(i) { } publicoverridevoid Showname() {

Console.Write(\, name); } }

publicclassManager : Person {

publicshort hireyear; public Manager() : base() { }

public Manager(string i) : base(i) { } publicoverridevoid Showname() {

Console.Write(\, name); } }

publicclassApp {

publicstaticvoid Main() {

Person[] pp = newPerson[3]; for (int i = 0; i != 3; ++i) {

Console.WriteLine(\); string ee=Console.ReadLine(); if (ee == \ || ee == \) {

Console.WriteLine(\); Manager mag = newManager(Console.ReadLine()); pp[i] = mag asPerson; } else

{

if (ee == \ || ee == \) {

Console.WriteLine(\); Employee emp = newEmployee(Console.ReadLine()); pp[i] = emp asPerson; }

else

{ --i; } }

}

for (int i = 0; i != 3; ++i) { if (pp[i] isManager) {

Console.WriteLine(\+pp[i].name); } if (pp[i] isEmployee) {

Console.WriteLine(\ + pp[i].name); } } //{

// pp[i].Showname(); // Console.WriteLine(\//}

Console.ReadLine(); } } }

5. 代理和多重代理

C#中的代理作用类似于C/C++中的函数指针,代理同接口一样,也是一种引用类型。用关键字delegate定义一个代理,格式如下:

[代码属性] [修饰符] delegate 返回类型 代理名 ([形式参数列表])

由于代理是封闭的,所以不可以派生出新的代理。代理的最大作用是它可以在运行期间决定调用哪个方法,并且不但可以调用对象的实例化方法,还可以调用类的静态方法。 代理与接口在使用上有所不同:当调用单一方法或要为指定的标识和返回类型实现一些方法的时候,通常使用代理;而接口用于声明多个带有不同的标识和返回类型的相关方法。 多重代理:首先创建将要调用的代理实例,并向该实例的调用链表中添加其他代理实例,最后显示代理实例的调用链表,并通过代理实例来调用方法。

使用多重代理的唯一限制是:方法链表中的方法必须具有相同的参数,并且这些方法的返回类型必须定义为void。 使用代理的步骤:

1)先定义代理名并指出调用的方法需要传递的参数

2)实例化此代理,并指出调用的方法 3)调用格式:实例化对象(需传参数)

实例代码和结果如下:

namespace InterfaceTest {

delegatevoidMyDelegate(); classDelegateTest {

publicstaticvoid StMethod1() {

Console.WriteLine(\调用第一个静态方法.\); }

publicstaticvoid StMethod2() {

Console.WriteLine(\调用第二个静态方法.\); }

publicvoid InsMethod1() {

Console.WriteLine(\调用第一个实例方法.\); }

publicvoid InsMethod2() {

Console.WriteLine(\调用第二个实例方法.\); } }

classApppp {

staticvoid PlayDelegate(MyDelegate d)

{

Console.WriteLine(\代理{0}的调用链表为:\, d); Delegate[] cc = d.GetInvocationList(); for (int i = 0; i != cc.Length; ++i) {

Console.WriteLine(\第{0}个元素的目标为:{1}\, i, cc[i].Target == null ? \ : cc[i].Target); Console.WriteLine(\调用方法为:{0}\, cc[i].Method); }

Console.WriteLine(\当前的目标为{0},调用方法为{1}\, d.Target == null ? \ : d.Target, d.Method); }

staticvoid Main() {

MyDelegate myde = newMyDelegate(DelegateTest.StMethod1); myde += newMyDelegate(DelegateTest.StMethod2); DelegateTest dt = newDelegateTest();

myde += newMyDelegate(dt.InsMethod1); myde += newMyDelegate(dt.InsMethod2);

PlayDelegate(myde); Console.WriteLine();

Console.WriteLine(\代理实例调用的方法有:\); myde(); Console.ReadLine();

} } }


C#高级编程学习笔记和代码(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:第10章 钻井取心 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: