纪录片委托制作机制

发布时间:2022-05-03 00:00

纪录片制作公司用什么财务软件?

我们公司用的是(智点)财务软件,建议你也可以体验一下,操作比较简单,不会浪费很多时间在上面,而且数据精准,很实用。

纪录片委托制作机制

纪录片制作公司用什么财务软件?

我们公司用的是(智点)财务软件,建议你也可以体验一下,操作比较简单,不会浪费很多时间在上面,而且数据精准,很实用。

c#中委托的作用是什么?

其实很简单啦,就是用来传方法的。

平常我们的方法或者函数只能用来传参数,有的时候一个方法可能需要另一个方法的支持,所以我们可以定义个委托来传这个方法。

需要注意的是,委托和你所要传的方法的返回值类型要一致。c#用委托来实现事件通知机制。委托相当与c++函数指针。整个过程涉及一个呼叫者,一个被呼叫者,还有就是这个委托。

- 实现步骤

有以下几步: 1. 申明委托, 2.定义呼叫者和调用的函数, 3.定义被呼叫者和具体实现的函数(被调用的函数)

1.申明委托 ,在包里或者类里,public

public delegate void PlayGame(Object sender, EventArgs e);

2.定义呼叫者(类LetsGame)和调用委托的函数,在呼叫者里要有委托的实例(呼叫者扔出一个委托,被呼叫者给这个委托赋值)

class LetsGame{

public event PlayGame theGame;

public void startPlay(EventArgs e){

if(theGame != null){

theGame(this,e);

}

3. 定义被呼叫者(类MS)和具体实现的函数(被调用的函数),也就是concrete class的实现或者叫函数指针实例。打个比方,在一个叫MS的类中实现.MS中对呼叫者中委托的实例进行赋值.

class MS {

public MS(LetsGame lg) {

lg.theGame += new PlayGame(MSPlayGame);

}

public void MSPlayGame(Object sender, EventArgs e){

Console.WriteLine("Who laughs the last who wins");

}...c#用委托来实现事件通知机制。委托相当与c++函数指针。整个过程涉及一个呼叫者,一个被呼叫者,还有就是这个委托。

- 实现步骤

有以下几步: 1. 申明委托, 2.定义呼叫者和调用的函数, 3.定义被呼叫者和具体实现的函数(被调用的函数)

1.申明委托 ,在包里或者类里,public

public delegate void PlayGame(Object sender, EventArgs e);

2.定义呼叫者(类LetsGame)和调用委托的函数,在呼叫者里要有委托的实例(呼叫者扔出一个委托,被呼叫者给这个委托赋值)

class LetsGame{

public event PlayGame theGame;

public void startPlay(EventArgs e){

if(theGame != null){

theGame(this,e);

}

3. 定义被呼叫者(类MS)和具体实现的函数(被调用的函数),也就是concrete class的实现或者叫函数指针实例。打个比方,在一个叫MS的类中实现.MS中对呼叫者中委托的实例进行赋值.

class MS {

public MS(LetsGame lg) {

lg.theGame += new PlayGame(MSPlayGame);

}

public void MSPlayGame(Object sender, EventArgs e){

Console.WriteLine("Who laughs the last who wins");

}

这样当调用LetsGame.startPlay的时候就会调用MS.MSPlayGame.

- 实际应用

对照一下c#的GUI事件处理或者asp.net的web控件事件处理,能帮我们更好的理解委托和事件.大家一定很熟悉asp.net里下面的代码

private void InitializeComponent()

{

this.Button1.Click += new System.EventHandler(this.Button1_Click);

private void Button1_Click(object sender, System.EventArgs e)

//do sth

这就是用委托来实现事件.你可能发现我们并没有给它声明委托对象并通过event关键字来引用该委托对象,那是因为asp.net早就帮我们做好了该项工作,其委托对象是System.EventHandler. Button1相当于上面的LetsGame的实例,是呼叫者,Button1_Click是被呼叫方法.当你click Button1后,Button1就会调用Button1_Click.

我觉得这种机制和design pattern里的observer很类似,我们完全可以用observer来达到同样的效果,但是用委托更灵活,不需要定义一个interface然后所有的concrete class都实现某个方法,函数指针(委托)更灵活.

还有,委托不一定非要和事件一起用,单独用的时候就是函数指针.1.委托概述 委托是c#中新加入的一个类型,可以把它想作一个和class类似的一种类型,和使用类相似,使用一个委托时,需要两个步骤,首先你要定义一个委托,就像是定义一个类一样;然后,你可以创建一个或多个该委托的实例。 定义一个委托的语法是这样的: [public/protected/private] delegate returntype delegatename(paramtype param1,…) 这是我自己写的,看起来好像有点怪怪的,我来解释一下,private/protected/private是限定词,就不多说了,delegate是申明一个委托的关键词,returntype是一个返回类型,delegatename是一个你给委托起的名字,你可以写任何一个你喜欢的名字,paramtype param1…这个是参数列表。说了这么多可能看起来还是不是很好理解,我是这样认为的,实用点来讲,委托定义就是在一个函数定义中间加入一个delegate的关键词。它的作用类似于你申明一个类: public class classname {…} 创建一个委托的实例: [public/protected/private] delegatename deleinstancename = new delegatename(methodname) 这个类似于实例化一个类,public classname instancename = new classname(…),这里有个要注意的地方,即methodname方法要和delegatename的签名一致。什么是签名一致,就是说methodname的参数列表,返回值要分别和returntype、(paramtype param1,…)一致。举个例子来说明下: public delegate string delegatedemo(string name, int age); 比如我们如上定义了一个委托,就写法来说,其实就是在函数 string delegatedemo(string name, int age)前面加了一个delegate的关键字,下面我们来用创建一个函数: public string agentdemo(string name, int age) { string rev = “”; … return rev; } 这个函数是做参数传递给一个delegatedemo实例的,接下来创建一个delegatedemo的实例: delegatename instancedemo = new delegatename(agentdemo); 这时要说到一致了,即agentdemo和声明委托时的delegatedemo(我们姑且将delegate去掉)这两个函数的返回值,参数列表要相同。终于说完了,不知道看的人明不明白。 接下来,我们可以使用这个委托了(调用一个委托),如下: string name = “cshape”; int age = 20; instancedemo(name, age); 当instancedemo执行时,会执行agentdemo函数,instancedemo相当于c里的一个函数指针,现在这个指针指向agentdemo的函数入口地址。 2.多点委托 前面提到的委托都只包含对一个方法的调用,如果需要调用多个方法,需要多次显示的调用这个委托,我们还有另的选择,我们可以让一个委托中包含多个方法,这样我们一次显示调用委托,就可以按照顺序连续的调用多个方法。看下面的例子: public delegate void multidelegate(string name); public void agentdemo1(string str) { console.writeline(str + “this is agentdemo1 ”); } public void agentdemo2(string s) { console.writeline(s + “this is agentdemo2 ”); } multidelegate multidemo = new multidelegate(agentdemo1); multidemo += new multidelegate(agentdemo2); multidemo(“multidemo test :”); 输出的结果应该是: multidemo test :this is agentdemo1 mutlidemo test :this is agentdemo2 可以看到我们一次显示的调用一个委托,它顺序的(按照你添加方法的顺序)执行了方法agentdemo1和agentdemo2。这里要注意的有几点: ● 委托支持 +=,-=这样的运算符,对应为添加或去掉一个方法 ● 多点委托不可以定义有返回值,因为无法处理多个方法的返回值,所以如果要使用多点委托,应该用void,否则你的编译会返回一个错误 ● 多点委托不建议你的参数列表中有out的类型,这样只会out最后一个方法的值,其他的值会丢失。 3.委托的理解 首先申明,这只是我举的一个例子,目的是帮助理解委托的过程,其中很多地方都经不起推敲,望大家知悉。言归正传, 你想要吃饭, 但是自己又不会做(委托方不知道实现细节), 你计划找个饭店,叫个回锅肉饭(定义了一个委托) 你决定找常去的那家叫做a的饭店(实例化一个委托) 你打电话给a饭店(委托调用) a饭店给你做好了你的回锅肉饭(代理函数工作) 饭来了,真好。 4.委托的使用时机 当你需要把一个方法传送给其他方法时,可以考虑使用委托。好像不是很好理解,也可以这样说,当你确定要处理一件事,但又不能确定处理方法时,可以考虑用委托。其实单独的说委托的应用好像有点牵强,委托更多的是在事件中的应用。

纪录片委托制作机制

C#中的委托怎么理解呢

简单地理解委托就是用来动态代理与其签名相同的方法。

 class Program

{

// 声明委托类型CalcCallback,原型如下:

public delegate double CalcCallback(double x, double y);

static void Main(string[] args)

{

// 下面使用3种方式初始化一个委托对象,前提

// 就是方法的签名与委托类型声明时的签名一样即可

// 1、使用命名方法方式初始化一个委托对象

CalcCallback add = new CalcCallback(Sum);

// 2、使用拉姆达函数方式初始化一个委托对象

CalcCallback sub=(x,y)=>{

return x-y;

};

// 3、使用匿名函数方式初始化一个委托对象

CalcCallback mul = delegate(double x, double y)

{

return x * y;

};

Console.WriteLine(add(1,2));

Console.WriteLine(sub(2, 1));

Console.WriteLine(mul(2, 2));

Console.ReadKey(true);

}

static double Sum(double x, double y) {

return x + y;

}

}大体上理解对了。

一言以蔽之,委托就是一个【特殊的类】,它定义了方法的类型,可以将方法(或者说函数、过程,下同,不再重复)当作另一个方法的参数来进行传递,【实现了对方法的封装】。这种将方法动态地赋值给参数的做法,可以避免在程序中大量使用 if-else(switch) 语句,同时也使得程序具有更好的扩展性。

委托机制尤其适合在使用事件处理的编程模式或者类的静态方法中,以及在需要封装和灵活地组织方法的场合。

c# 中很多特性(比如跨线程回调等)都是建立在委托机制基础之上的。

单纯地文字叙述题主可能还是不大理解,那么我来举个例子。比如现在有这么一个方法,是出去旅行,在旅行过程中(也就是这个方法里)会做很多事情:

private void travel()

drivecar(); // 开车前往目的地

... // 游玩

... // 拍照留念

... // ...

}其中 drivecar() 为另一个方法,代表开车。但是现在情况有变了,不能开车去了,改为坐火车去,但是剩下的一切照旧,这个时候,如果我们想实现 travel() 这个方法,就不得不再写一遍:

private void travel()

taketrain(); // 坐火车前往目的地

... // 游玩

... // 拍照留念

... // ...

}除了交通方式变化了,其他的又原封不动的抄了一遍。这还不是麻烦的,如果我的交通方式又变了,比如改成坐飞机、坐船、骑自行车、骑摩托车等等等等,那么还需要写若干个 travel() 出来吗?

于是想到,为什么不能像把某一个对象当作参数传递给方法一样,也能【把方法(其实这里就不能叫做方法了,应该叫做方法应用)当作参数传递】呢?于是问题解决了:

private delegate void bywhat(); // 定义委托

private bywhat bywhat; // 声明委托  

private void travel(bywhat bw)

bw(); // 交通方式 

... // 游玩

... // 拍照留念

... // ...

}

private void drivecar()

// 开车

private void taketrain()

// 坐火车

...这样在使用的时候,如果要开车:

bywhat = new bywhat(drivecar); // 先实例化委托

travel(bywhat);  // 传递参数如果要坐火车:

bywhat = new bywhat(taketrain); // 先实例化委托

travel(bywhat);  // 传递参数 

以上。作为一点个人浅见,希望能对题主有所启发。(代码未经测试,仅供参考)