.net中的委托方法

Func 接受输入参数(可多个残数),并且返回指定的输出TResult

Action接受参数(只有一个),返回void

Predicate 有一个输入参数,如果输入参数符合指定的条件,返回true,否则fasle.

具体代码实现如下:

一,public delegate TResult Func<in T, out TResult>( T arg )
封装一个具有一个参数并返回 TResult 参数指定的类型值的方法。
实现一,显式声明自定义委托实现字符转换
using System;
delegate string ConvertMethod(string inString);  
public class DelegateExample
{
   public static void Main()
   {
      // 转成大写
      ConvertMethod convertMeth = UppercaseString;
      string name = "Dakota";
      // Use delegate instance to call UppercaseString method
      Console.WriteLine(convertMeth(name));
   }
 
   private static string UppercaseString(string inputString)
   {
      return inputString.ToUpper();
   }
}

使用匿名方法:
 using System;
public class DelegateExample
{
   public static void Main()
   {
      // 转成大写
      Func<string,string> convertMeth = delegate(string inputstr)
      {
           return inputstr.ToUpper();
      }
      string name = "Dakota";
      Console.WriteLine(convertMeth(name));
   }
 
}

使用lambda表达式
 using System;
public class lambdaExample
{
   public static void Main()
   {
      // 转成大写
      Func<string,string> convert = inputstr=>inputstr.ToUpper();

string name = "Dakota";
      Console.WriteLine(convert(name));
   }
 
}

示例again
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
 
static class Func
{
   static void Main(string[] args)
   {
      Func<string, string> selector = str => str.ToUpper();
 
      // 建立一个字符串数组
      string[] words = { "orange", "apple", "Article", "elephant" };
      IEnumerable<String> aWords = words.Select(selector);
 
      //输出
      foreach (String word in aWords)
         Console.WriteLine(word);
   }
}

二,public delegate void Action<in T>( T obj )
该方法只有一个参数并且不返回值,
T为此委托封装的方法的参数类型。此类型参数是逆变。
using System;
using System.Windows.Forms;
public class TestAnonMethod
{
   public static void Main()
   {
      Action<string> messageTarget;  
 
      if (Environment.GetCommandLineArgs().Length > 1)
         messageTarget = delegate(string s) { MessageBox.Show(s); };
      else
         messageTarget = delegate(string s) { Console.WriteLine(s); };
 
    //lambda表达式
      if (Environment.GetCommandLineArgs().Length > 1)
         messageTarget = s => MessageBox.Show(s);  
      else
         messageTarget = s => Console.WriteLine(s);

messageTarget("Hello, World!");
   }
 
}

//打印list<string>
using System;
using System.Collections.Generic;
 
class Program
{
    static void Main()
    {
        List<String> names = new List<String>();
        names.Add("Bruce");
        names.Add("Alfred");
        names.Add("Tim");
        names.Add("Richard");
 
        // 使用print答应list的值
        names.ForEach(Print);
 
        // 同上,使用匿名方法
        names.ForEach(delegate(String name)
        {
            Console.WriteLine(name);
        });

//同上, lambda表达式
      names.ForEach(name=>console.WriteLine(name));
    }
 
    private static void Print(string s)
    {
        Console.WriteLine(s);
    }
}

Predicate 声明:public delegate bool Predicate<in T>(T obj)
表示定义一组条件并确定指定对象是否符合这些条件的方法。
public class HockeyTeam
    {
        private string _name;
        private int _founded;
        public HockeyTeam(string name, int year)
        {
            _name = name;
            _founded = year;
        }
        public string Name
        {
            get { return _name; }
        }
        public int Founded
        {
            get { return _founded; }
        }
    }

public class Example
    {
        
        public static void Main()
        {            
        List<HockeyTeam> teams = new List<HockeyTeam>{
                                         new HockeyTeam("Detroit Red Wings", 1926),
                                         new HockeyTeam("Chicago Blackhawks", 1926),
                                         new HockeyTeam("San Jose Sharks", 1991),
                                         new HockeyTeam("Montreal Canadiens", 1909),
                                         new HockeyTeam("St. Louis Blues", 1967) };            
            //1 >>1,2,3三种方式都可实现,选择其中一种就行。
            Random rnd = new Random();
            int[] years = { 1920, 1930, 1980, 2000 };
            int foundedBeforeYear = years[rnd.Next(0, years.Length)];
            Console.WriteLine("Teams founded before {0}:", foundedBeforeYear);
            foreach (var team in teams.FindAll(x => x.Founded <= foundedBeforeYear))
                Console.WriteLine("{0}: {1}", team.Name, team.Founded);
            //2 //如果找到与指定谓词定义的条件匹配的第一个元素Array.Find(HockeyTeam,Predicate<HockeyTema>)
            Predicate<HockeyTeam> find = FindTeam;
            HockeyTeam ht = Array.Find(teams.ToArray(), find);
            Console.WriteLine("{0}: {1}", ht.Name, ht.Founded);

//3

     //Random rnd = new Random();
            //int[] years = { 1920, 1930, 1980, 2000 };
            //int foundedBeforeYear = years[rnd.Next(0, years.Length)];
            //HockeyTeam ht4 = teams.Find(t => t.Founded < foundedBeforeYear);
            //Console.WriteLine("{0}: {1}", ht4.Name, ht4.Founded);
        }

private static bool FindTeam(HockeyTeam ht)
        {
            Random rnd = new Random();
            int[] years = { 1920, 1930, 1980, 2000 };
            int foundedBeforeYear = years[rnd.Next(0, years.Length)];
            return ht.Founded <= foundedBeforeYear;
        }

}

时间: 2024-08-01 20:28:43

.net中的委托方法的相关文章

appDelegate中的委托协议方法以及使用观察者模式获取其触发方法

//当应用程序将要进入非活动状态执行,在此期间,应用程序不接受消息或事件,比如来电 - (void)applicationWillResignActive:(UIApplication *)application { NSLog(@"应用程序将要进入非活动状态,即将进入后台"); } //应用程序已经进入后台运行 - (void)applicationDidEnterBackground:(UIApplication *)application { NSLog(@"如果应用程

C# 中的委托和事件

http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/903360.html 文中代码在VS2005下通过,由于VS2003(.Net Framework 1.1)不支持隐式的委托变量,所以如果在一个接受委托类型的位置直接赋予方法名,在VS2003下会报错,解决办法是显式的创建一个委托类型的实例(委 托变量).例如:委托类型 委托实例 = new 委托类型(方法名); 欢迎浏览本文的后续文章: C#中的委托和事件(续) 引言 委托 和 事件在

C#中的委托和事件(续)

C#中的委托和事件(续) 引言 如果你看过了 C#中的委托和事件 一文,我想你对委托和事件已经有了一个基本的认识.但那些远不是委托和事件的全部内容,还有很多的地方没有涉及.本文将讨论委托和事件一些更为细节的问题,包括一些大家常问到的问题,以及事件访问器.异常处理.超时处理和异步方法调用等内容. 为什么要使用事件而不是委托变量? 在 C#中的委托和事件 中,我提出了两个为什么在类型中使用事件向外部提供方法注册,而不是直接使用委托变量的原因.主要是从封装性和易用性上去考虑,但是还漏掉了一点,事件应该

(转)C# 中的委托和事件

C# 中的委托和事件 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在.本文中,我将通过两个范例由浅入深地讲述什么是委托.为什么要使用委托.事件的由来..Net Framework中的委托和事件.委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论. 将方法作为方法的参

C#中的委托与事件并存的理由

问题 有了委托为什么还要有事件? 理论上,事件能完成的事情委托完全可以胜任,但是我们思考的这一方面是功能性,我们必须从他们各自的特点分析. 委托链的特点让事件能够被多个订阅方订阅,事件是带上了event关键字的委托,在用reflector反编译事件源码时,我 们看到事件成员的可访问性被始终设置为private,其订阅和移除事件靠方法来完成. 所以,他们的区别出现了: 委托可被任意调用者修改,甚至抹去所有的委托连,而对于事件,只能由订阅者自己决定订阅或者移除事件. 事件的密封性较好,他从本质层面上

C#中的委托(转)

C# 中的委托和事件 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在.本文中,我将通过两个范例由浅入深地讲述什么是委托.为什么要使用委托.事件的由来..Net Framework中的委托和事件.委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论. 将方法作为方法的参

C# 中的委托和事件详解

C# 中的委托和事件 文中代码在VS2005下通过,由于VS2003(.Net Framework 1.1)不支持隐式的委托变量,所以如果在一个接受委托类型的位置直接赋予方法名,在VS2003下会报错,解决办法是显式的创建一个委托类型的实例(委托变量).例如:委托类型 委托实例 = new 委托类型(方法名); 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易

Objective-C中的委托(代理)模式

我个人更喜欢把委托(Delegate)模式称为代理(Proxy)模式.还是那句话,第一次接触代理模式是在Java中接触的,在Java中实现代理模式和接口是少不了的.当时学习Spring的时候用到了接口回调,其实就是实现的委托代理模式.简单的说代理就是把相应的功能交给实现接口的相应的类中来解决.在OC中没有接口该如何实现代理呢?前面的博客中笔者说提了一句,在OC中的协议和Java中的接口极为相似,都是只声明方法而不去实现,方法的实现在OC中交个遵循协议的类,而在Java中方法的实现交给实现接口的类

[程序示例]Objective-C中的委托设计模式(牛仔与姑娘)

今天整理电脑翻到以前自学Objective-C时写的一个练习委托设计模式的一个小程序,就po上来和大家分享,顺便自己也复习一下OC中的委托. Objective-C中的委托设计模式是和协议分不开的. 协议呢,就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现.(在Objective-C2.0中可以在协议里选择是否必须实现某种方法,用关键字@optional和@required) 委托的话,顾名思义就是自己处理不了的事情,委托他人按照协议里写好的条款来办理这件事. 具体实现