如何学好C# 开篇浅论<三>
至于后面三点我也就不再累述了。上面的一些方法也只是我一己之见,你可以在以上的基础上进行改良和创新,找到适合自己的,不是有句话说得好:发明=改良+创新吗?呵呵,在这一张我们谈谈C#语言对于初学者容易搞混淆的几个地方!
1.委托与事件。委托不是C#独有的什么东西。只是在不同种语言称呼有些不同罢了。在C++里面委托其实就是函数指针。定义委托需要用到关键字delegate,先让我们来看一下优快云里面对委托的定义: delegate 声明定义一种引用类型,该类型可用于将方法用特定的签名封装。委托实例封装静态方法或实例方法。委托大致类似于 C++ 中的函数指针;但是,委托是类型安全和可靠的。中文有点不符合我们的习惯,不过还好。这里指的方法签名就是指方法声明的类型,返回值,参量(参数),以及名称。你大致可以这样理解它:委托声明定义了一种类型,它用一组特定的参数以及返回类型来封装方法。对于静态方法,委托对象封装要调用静态方法。对于实例方法,委托对象要调用该实例上的一个方法。好的,让我们看一个实例:
//*************************************************************************
using
System;
using
System.Threading;
namespace
ConsoleApplication6
{
class Test
{
delegate void TestDelegate();//
声明一个委托
,
对应签名函数的类型
public static void Main()
{
TestDelegate tDelegate = new TestDelegate(TestFunction);//
像使用类一样使用它
tDelegate(); //
调用委托
,
即执行
TestFunction
函数体内的实现
}
public static void TestFunction() //
静态函数
,
请注意和声明一个很委托的签明一样
,
在此是静态函数的原因是因为
Main
函数的声明是静态的
.
{
Console.WriteLine("This is a delegate function");
}
}
}
//*************************************************************************
你会发现原来委托不过如此,没有什么神秘的啊!有人会问,我直接用一个函数调用不就行了吗?为什么要用委托了。呵呵,搞得这么麻烦,如果你是这样想的话,我想你应该忍住性子看完下面这个例子:
//*************************************************************************
using
System;
namespace
ConsoleApplication6
{
class Test
{
delegate void TestDelegate();//
声明一个委托
,
对应签名函数的类型
public static void Main()
{
TestDelegate tDelegate = new TestDelegate(TestFunction);//
像使用类一样使用它
tDelegate += TestFunction1;//vs2005
可以直接这样书写
.
tDelegate(); //
调用委托
}
public static void TestFunction() //
静态函数
,
请注意签名和声明一个很委托的签明一样
{
Console.WriteLine("This is a delegate function");
}
public static void TestFunction1()//
另外的静态函数
,
请注意签名和声明一个很委托的签明一样
{
Console.WriteLine("This is a delegate function too!");
}
}
}
程序运行结果
:
This is a delegate function
This is a delegate function too!
由于程序里面使用
tDelegate += TestFunction1
(多点委托)所以运行
tDelegate
会现直接调用两个函数。当然只要你愿意
,
你也可以这样写
:tDelegate -= TestFunction1;
你也可以使用
tDelegate
.combine和tDelegate.remove,来实现“+=“和“==”的效果。也许你还是会非常固执的说,那我也可以接在主函数里面换上这两句话啊!
TestFunction();
TestFunction1();
还是可以运行,为什么要用委托呢?好的请看下面的代码:
using
System;
namespace
ConsoleApplication6
{
delegate void TestDelegate();
class Test
{
//
声明一个委托
,
对应签名函数的类型
public static void Main()
{
A a = new A();
a.testDelegate();//
调用委托
,
知道厉害了吧
.
}
}
class A
{
public TestDelegate testDelegate;
public A()
{
testDelegate = new TestDelegate (TestFunction) + TestFunction1;//
关联委托函数
.
//
你也可以这么写
//testDelegate = new TestDelegate (TestFunction);
//testDelegate += TestFunction1;
}
private void TestFunction() //
实例函数的签名
,
请注意签名和声明一个很委托的签明一样
{
Console.WriteLine("This is a delegate function");
}
private void TestFunction1()//
另外的一个实例函数的签名
,
请注意签名和声明一个很委托的签明一样
{
Console.WriteLine("This is a delegate function too!");
}
}
}
还没有发现其中的好处吗?呵呵。他把实例类即
A
,函数有机的封装在一起了,使类的暴露性更小了。更加具有可读性,把
TestFunction
,
TestFunction1
前面的修辞符加上
static
看一下,照样可以运行。封装性在团队合作大型的项目中显得更加尤为重要,但是这只是委托的其中一个优点,其使用委托还可以节省很多开销
,
也就是使代码效率更高
.
当然,还有一个委托非常重要的一点,那就是下一章的主角
--
事件(你可以把事件看做特殊的委托
,
一种特殊的表现)。它将会装委托的特质更加发挥出来。在下一章里面,你将看到委托结合事件的强大威力。