写作技巧其编程方法

点赞:12334 浏览:54997 近期更新时间:2024-02-10 作者:网友分享原创网站原创

摘 要:在C#语言中,可以用写作技巧(Delegate)来动态地调用不同的函数.本文针对写作技巧的基本概念、用写作技巧编程的基本结构及多重写作技巧进行讨论,并通过实例程序进行必要的说明.

关 键 词:函数指针;写作技巧;多重写作技巧

中图分类号:TP312文献标识码:A

1写作技巧的基本概念

在C/C++中,函数调用有两种方式:一种是通过函数名直接调用;另一种是利用指向函数的指针进行调用.指向函数的指针又简称为函数指针.采用函数指针调用函数,可以达到通过一个函数指针调用多个功能不同、但函数的参数及返值类型一致的函数.

1.1函数指针

在C/C++中,函数名表示函数在存储区域的首地址,即是函数执行的入口地址.在程序中调用一个函数时,程序控制流程将转移到以该函数名为入口地址的地方执行该函数.

函数指针定义的一般形式是:

数据类型(*函数指针名)(参数表);

其中数据类型是函数指针所指向的函数所具有的返值类型,参数表是被调函数所具有的参数表.

一般来讲,函数指针得到某个函数名的赋值,程序将调用该函数;在函数指针作为函数的形参时,需要进行取内容的运算才能调用对应的函数.例如:

exe(intx,inty,int(*func)())

{return((*func)(x,y));}

在上述exe函数中,int(*func)()是函数指针,而“((*func)(x,y));”程序将转向由func所指向的函数去执行,其参数是x和y.

使用函数指针编程方法一般为:定义相应的函数;定义函数指针;通过某种操作使函数指针得到函数名的赋值;最后连同参数调用相应的函数.

1.2写作技巧及其相关概念

在C#中,写作技巧(delegate)的作用类似于C/C++中的函数指针.C#中的方法类似于C/C++中的函数,其方法名也是一个物理地址.方法的入口地址可以赋给“写作技巧”,进而通过“写作技巧”调用该方法;且同一个写作技巧可以调用多个不同的方法.使用写作技巧可以在程序的运行期间动态地调用所需的函数.

写作技巧定义的一般格式为:

[访问控制修饰符]delegate返值类型写作技巧名([形式参数表]);

其中:访问控制修饰符可以是new、public、protected、internal和private.new修饰符表明当前定义的写作技巧将隐藏继承来的同名写作技巧;public修饰符表明所有对象都可以访问该定义的写作技巧;protected修饰符表明定义该写作技巧的类及其子类可以访问该写作技巧;internal修饰符只有写作技巧所属的工程项目的成员可以访问该写作技巧;private修饰符表明只有定义该写作技巧的类才能访问该写作技巧.

delegate是定义写作技巧的关键字.写作技巧名是符合C#的任意合法的标识符.返值类型是指该写作技巧所调用方法的返值类型.形式参数表用于指出写作技巧所调用方法的参数表.

例如,在一个类中定义一个写作技巧MyDel_egate:

classMyClass

{等

publicdelegatevoidMyDelegate(strings);

}

在上述写作技巧定义中的void表示该写作技巧指向的方法不返回任何值,strings表示该写作技巧所指向的方法将接受一个字符串参数.

在C#中,定义一个写作技巧MyDelegate,C#编译器将根据写作技巧的定义语句自动生成一个从System.MulticastDelegate类派生的子类MyDelegate.

2使用写作技巧的编程结构

写作技巧类似于C/C++的指向函数的指针,但是写作技巧的使用范围比函数指针更加广泛.在C中,函数只有外部和静态函数两种,它们都属于静态函数的范畴;在C++中,函数指针只能引用静态方法,而写作技巧不仅可以引用静态方法,还可以引用对象的实例方法.

2.1使用写作技巧的编程结构

使用写作技巧编程和在C/C++中使用函数指针类似,一般有:定义将要由写作技巧调用的方法;声明一个写作技巧;定义delegate处理的函数;创建实例并调用相应方法.

(1)定义拟调用的方法

该类方法的函数返值类型,函数形参的参数类型、个数及参数的顺序,决定了定义delegate类型写作技巧时的相应参数.例如:

publicstaticstringFunctionA

(stringname){等}

publicstaticstringFunctionB

(stringname){等}

(2)声明一个写作技巧

该写作技巧的返值类型,参数的类型、个数及参数的顺序都必须与拟调用的方法的返值类型,形参类型、个数及参数的顺序完全相同.例如:

publicdelegatestringMyDelegate(stringname);

(3)定义delegate类型处理的函数

定义delegate类型处理的函数,并在此函数中通过delegate类型调用定义的方法.

publicstaticvoidMethodA(MyDelegateMe)

{Console.WriteLine(Me(“张三”));}

(4)创建实例并调用方法

由于声明一个delegate类型的写作技巧在编译时将被转换成一个MulticastDelegate类的派生类,因此在使用写作技巧时,必须要先创建该类的实例,并把它与一个方法关联.

MyDelegatea=newMyDelegate(FunctionA)

本语句的含义是:a引用指向方法FunctionA的程序代码段.

通过delegate处理函数调用相应的方法.MethodA(a);

2.2使用写作技巧编程实例

usingSystem;

namespaceConDelegatejl

{publicclassTest

{//第一步:声明委托

publicstaticstringFunctionA(stringname)

{return“AsayHelloto”+name;}

publicstaticstringFunctionB(stringname)

{return“BsayHelloto”+name;}

//第二步:定义被调用的方法

publicdelegatestringMyDelegate(stringname);

//第三步:定义delegate类型处理函数

publicstaticvoidMethodA(MyDelegateMe)

{Console.WriteLine(Me(“张三”));}

publicstaticvoidMain()

{//第四步:创建实例,

//准备调用的方法名

MyDelegatea等于newMyDelegate(FunctionA);

MyDelegateb等于newMyDelegate(FunctionB);

MethodA(a);MethodA(b);Console.Read();

}

}

上述程序的运行结果如下图所示.

3多重写作技巧及其实现

在C#语言中,每一个写作技巧实例(对象)都含有一个调用链表,该链表可以包含多个该写作技巧要调用的方法,此种机制用于一个写作技巧实例可以调用多个方法,也就是多重写作技巧(多播).多播要创建方法链表,当调用写作技巧时,所有被链接的方法都会被自动地调用.

3.1Delegate类和MulticastDelegate类

所有的写作技巧类都是由MulticastDelegate类派生的,而MulticastDelegate类又是由Delegate类派生的,它们都位于System命名空间下.

Delegate类有两个公用的只读属性:

Method属性:本属性用于获得写作技巧实例要调用的静态方法.可以用如下代码获得写作技巧对象所调用的方法名.

stringMethodName等于写作技巧名.Method;

Target属性:该属性可以获得写作技巧对象所在的类;如果写作技巧调用的是静态方法,其返值为null,否则将返回写作技巧实例所调用方法所在类名.如下代码可以获得写作技巧调用方法所在类的名称.

stringObjType等于写作技巧名.Target;

如果写作技巧调用多个方法,则该属性将返回调用列表中最后一个实例方法所在的类名.

3.2MulticastDelegate类实现多重写作技巧的机制

从MulticastDelegate类派生的用户写作技巧实例中含有一个调用链表,该链表将由多个写作技巧实例组成,其中每个写作技巧实例都封装一个相应的方法,也就是一个写作技巧实例可以同时调用多个方法.写作技巧实例通过_prev私有指针来连接多个写作技巧构成的链表,私有指针_target和_methodPtr用于指向写作技巧实例调用的实例和方法.

写作技巧其编程方法参考属性评定
有关论文范文主题研究: 关于函数的论文范例 大学生适用: 函授毕业论文、研究生毕业论文
相关参考文献下载数量: 63 写作解决问题: 写作资料
毕业论文开题报告: 文献综述、论文小结 职称论文适用: 核心期刊、高级职称
所属大学生专业类别: 写作资料 论文题目推荐度: 最新题目

每创建一个新的写作技巧实例时,指针_prev将被设置为null,表示链表中没有其它的写作技巧实例.而当用户使用Combine方法(或+等于运算符)把另一个写作技巧实例合并到该调用链表中时,则将先创建一个含有_target和_methodPtr值的新实例,然后把该实例的_prev设置为调用链表的头实例,即从调用链表的头插入新的实例.可以使用Remove方法(或-等于运算符)从一个调用链表中删除一个写作技巧实例.


3.3多重写作技巧编程的实现

多重写作技巧(或多播)具有创建方法链表的能力,当调用写作技巧时,所有被链接的方法都会被自动调用,也就是多播可以在一次写作技巧调用中调用方法链表上的所有方法.创建多播调用链表的方法是:先实例化一个写作技巧,然后使用“+等于”运算符把方法添加到调用链表中;也可以使用“-等于”运算符从调用链表中删除一个方法.

下面程序说明了多重写作技巧编程的实现方法.

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;namespaceConDelegatej2

{

delegatevoidStringDelegate(

refstringstr);//定义一个写作技巧

classstringops//字符串操作类

{//定义三个字符串操作方法

staticvoidReplaceSpaces(refstrings)

{Console.WriteLine("用连字符替换

空格操作:");

s等于s.Replace('','_');

}

staticvoidRemoveSpaces(refstrings)

{stringtemp等于"";inti;

Console.WriteLine("删除空格操作:");

for(i等于0;i

if(s[i]!等于'')temp+等于s[i];

s等于temp;

}

staticvoidReverse(refstrings)

{stringtemp等于"";intj;

Console.WriteLine("字符串反转操作:");

for(j等于s.Length-1;j>等于0;j--)

temp+等于s[j];

s等于temp;

}

staticvoidMain(string[]args)

{//创建一个写作技巧

StringDelegatestrdelegate;

StringDelegatereplacesp等于new

StringDelegate(ReplaceSpaces);

StringDelegateremoves等于new

StringDelegate(RemoveSpaces);

StringDelegatereversestr等于newStringDelegate(Reverse);

stringstr等于"Iamastudent.";

//写作技巧指向一个函数

strdelegate等于replacesp;

strdelegate+等于reversestr;//多播关联

strdelegate(refstr);//调用多播

Console.WriteLine("操作字符串的结果为:"+str);

Console.WriteLine();

strdelegate-等于replacesp;//去除replacesp

strdelegate+等于RemoveSpaces;

str等于"你是一个计算机教师.";

strdelegate(refstr);

Console.WriteLine("字符串操作结果是:"+str);

Console.WriteLine();Console.Read();

}

}

}

上述程序的运行结果如下所示.

4结束语

写作技巧是C#语言提供动态调用函数的一种方法;多重写作技巧解决了用一个写作技巧一次调用多个方法的技术.不过写作技巧的多播有一个限制:方法链表中的方法必须具有相同的参数,而且这些方法的返回值类型要是void类型.

写作技巧也为用户程序利用属性驱动事件程序的编程提供了有力的方法.