四、集合与泛型、委托与事件-----《大话设计模式》

一、集合与泛型

  数组 集合(ArrayList) 泛型
优点 连续存储、快速从头到尾遍历和修改元素 使用大小可按需动态增加 类型安全;省去拆箱和装箱操作
缺点 创建时必须制定数组变量的大小;
两个元素之间添加元素比较困难
类型不安全,接受所有类型的数据;
导致一直进行拆箱和装箱操作,带来很大的性能消耗
 
public partial class Form1 : Form
{
    IList arrayAnimal_list = new ArrayList();                    //声明并初始化集合
    IList<Animal> arrayAnimal;                                   //声明泛型

private void button3_Click(object sender, EventArgs e)
{
    foreach (Animal item in arrayAnimal_list)                   //遍历集合
    {
        MessageBox.Show(item.Shout());
    }
}
private void button7_Click(object sender, EventArgs e)
{
    arrayAnimal_list.RemoveAt(1);                              //初始计数为0,当1号位数据被删掉后,2号位数据的计数会变为1
    arrayAnimal_list.RemoveAt(1);                              //这样才能删除其后数据,它始终都保证元素的连续性
}

private void button4_Click(object sender, EventArgs e)
{
    arrayAnimal = new List<Animal>();                              //初始化泛型
     arrayAnimal.Add(AnimalFactory.CreateAnimal("猫", "小花", 1));  //其添加指定类型数据
     arrayAnimal.Add(AnimalFactory.CreateAnimal("狗", "阿毛", 2));
    MessageBox.Show(arrayAnimal.Count.ToString());                //获得元素个数
}
}

二、委托与事件

委托是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有安全相同的行为;事件是在发生其他类或对象关注的事情时,类或对象可通过事件通知它们。

个人理解是为了让一个类能在内部执行其他类的方法,与观察者模式结合会有更好的效果。

class Program                            //委托和事件都在Cat类中定义,是为了由Cat类去触发Mouse类;当Cat发出叫声时,Mouse就会跑
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat("Tom");
            Mouse mouse1 = new Mouse("Jerry");
            Mouse mouse2 = new Mouse("Jack");
            cat.CatShout += new Cat.CatShoutEventHandler(mouse1.Run);    //这两行表示将Mouse的Run方法通过实例化委托
              cat.CatShout += new Cat.CatShoutEventHandler(mouse2.Run);    //Cat.CatShoutEventHandler登记到Cat的事件CatShout当中

              cat.Shout();                                                //实现猫一叫,老鼠就跑的需求
              Console.Read();
        }
    }

    //无参数委托事件
    class Cat
    {
        private string name;
        public Cat(string name)
        {
            this.name = name;
        }

        public delegate void CatShoutEventHandler();         //声明委托CatShoutEventHandler
        public event CatShoutEventHandler CatShout;         //声明事件CatShout,它的事件类型是委托CatShoutEventHandler     

        public void Shout()
        {
            Console.WriteLine("喵,我是{0}.", name);

            if (CatShout != null)
            {
                CatShout();                              //当执行Shout()方法时,如果Catshout中有对象登记事件,则执行CatShout();
            }
        }
    }

    class Mouse
    {
        private string name;
        public Mouse(string name)
        {
            this.name = name;
        }

        public void Run()
        {
            Console.WriteLine("老猫来了,{0}快跑!", name);
        }
    }
 
//有参数委托事件,增加了一个CatShoutEventArgs,用来传递Cat的名字
    class Cat
    {
        private string name;
        public Cat(string name)
        {
            this.name = name;
        }

        public delegate void CatShoutEventHandler(object sender, CatShoutEventArgs args);     //声明委托时有两个参数
         public event CatShoutEventHandler CatShout;                        //sender用来指向发送通知的对象,args用来传递数据

        public void Shout()
        {
            Console.WriteLine("喵,我是{0}.", name);

            if (CatShout != null)
            {
                CatShoutEventArgs e = new CatShoutEventArgs();                 //实例化参数
                   e.Name = this.name;
                CatShout(this, e);                                             //当事件触发时,将这两个参数传递给委托
            }
        }
    }
class Mouse
    {
        private string name;
        public Mouse(string name)
        {
            this.name = name;
        }

        public void Run(object sender, CatShoutEventArgs args)               //由于委托增加了两个参数,这里也增加了两个参数
        {
            Console.WriteLine("老猫{0}来了,{1}快跑!", args.Name, name);
        }
    }

public class CatShoutEventArgs : EventArgs                                   //继承EventArgs,用来传递数据 
{ 
  private string name; 
  public string Name 
  { 
get { return name; } 
set { name = value; } 
  } 
} 
时间: 2024-10-01 04:49:07

四、集合与泛型、委托与事件-----《大话设计模式》的相关文章

C#编程(四十二)----------委托和事件

委托和事件 委托是C#总比较重要的概念,学习C#爱这里最容易产生迷惑. 有些时候,犹豫我们在开发程序时对后续可能出现的要求及变化考虑不足而导致麻烦,这些新变化可能导致程序的重新编写,那能不能改变这种情况?后面的需要变化了,后续对应功能的编写对前面的程序不造成影响? 可以的,在C#中可以使用委托来解决这个问题. delegate 怎么理解委托呢,形象一点就是你的名字叫张三,别人一叫张三,你就答应.就像程序调用一样,一个叫(调用)一个回答(执行).但是不久你因为给老板舔的好,给你升职了,你成了经理了

五分钟重温C#委托,匿名方法,Lambda,泛型委托,表达式树

五分钟重温C#委托,匿名方法,Lambda,泛型委托,表达式树 https://masuit.com/81 曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托,表达式树这些应用.今天我尝试用简单的方法叙述一下,让大家在五分钟内看完这篇博客 第一分钟:委托 有些教材,博客说到委托都会提到事件,虽然事件是委托的一个实例,但是为了理解起来更简单,今天只谈委托不谈事件.先上一段代码: 下边的代码,完成了一个委托应用的演示.一个委托分三个步骤: 1 2 3 4 5 6 7 8 9 10 11 12

C#规范整理&#183;泛型委托事件

基于泛型,我们得以将类型参数化,以便更大范围地进行代码复用.同时,它减少了泛型类及泛型方法中的转型,确保了类型安全.委托本身是一种引用类型,它保存的也是托管堆中对象的引用,只不过这个引用比较特殊,它是对方法的引用.事件本身也是委托,它是委托组,C#中提供了关键字event来对事件进行特别区分.   一旦我们开始编写稍微复杂的C#代码,就肯定离不开泛型.委托和事件. 1.总是优先考虑泛型 泛型的优点是多方面的,无论是泛型类还是泛型方法都同时具备可重用性.类型安全和高效率等特性,这都是非泛型类和非泛

委托 ,事件,泛型学习总结

委托 ,事件,泛型学习总结 C# 委托 一图流: 委托.png 如果这些内容帮助到你了,希望您给予支持 o(^ ▽ ^)o

委托-异步调用-泛型委托-匿名方法-Lambda表达式-事件

1. 委托 From: http://www.cnblogs.com/daxnet/archive/2008/11/08/1687014.html 类是对象的抽象,而委托则可以看成是函数的抽象.一个委托代表了具有相同参数列表和返回值的所有函数. [csharp] view plaincopy class Program { delegate int CalculateDelegate(int a, int b); int add(int a, int b) { return a + b; } s

C#编程之委托与事件四(二)【转】

C#编程之委托与事件(二) 我在上一篇文章(C#编程之委托与事件(一) )中通过示例结合的方法介绍了委托,在本文中,我同样以代码示例的方式来介绍C#里的事件机制. 二.事件   1.了解概念      事件就是当对象或类状态发生改变时,对象或类发出的信息或通知.发出信息的对象或类称为"事件源",对事件进行处理的方法称为"接收者",通常事件源在发出状态改变信息时,它并不知道由哪个事件接收者来处理.这就需要一种管理机制来协调事件源和接收者,C++中通过函数指针来完成的.

泛型委托事件详解示例

使用委托时要先实例化,和类一样,使用new关键字产生委托的新实例,然后将一个或者多个与委托签名匹配的方法与委托实例关联.随后调用委托时,就会调用所有与委托实例关联的方法. 与委托关联可以是任何类或者结构中的方法,可以是静态方法,只要是可以访问的方法都可以.创建一个委托类型使用关键字delegate(委托) 一个委托实例,关联三个方法 移除一个委托实例中的方法  使用“-” 将方法作为参数传递 委托可以让方法作为参数传递给其它方法. 事件自身就是委托类型,由于委托可以绑定和调用多个方法,所以会为事

C#编程之委托与事件四(一)【转】

C#编程之委托与事件(一) 本文试图在.net Framework环境下,使用C#语言来描述委托.事件的概貌.希望本文能有助于大家理解委托.事件的概念,理解委托.事件的用途,理解它的C#实现方法,理解委托与事件为我们带来的好处.C#是一种新的语言,希望大家能通过本文清楚地看到这些,从而可以对委托.事件等技术进行更深入的理解和探索. 一. 委托 委托的本质   --在C#中,委托是一个特殊的类:   --在某种程度上,相当于C++的函数指针:   --在某种程度上,相当于接口(Interface)

[转载]C#深入分析委托与事件

原文出处: 作者:风尘浪子 原文链接:http://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html 同类链接:http://www.cnblogs.com/SkySoot/archive/2012/04/05/2433639.html 引言 本篇文章将为你介绍一下 Delegate 的使用方式,逐渐揭开 C# 当中事件(Event)的由来,它能使处理委托类型的过程变得更加简单.还将为您解释委托的协变与逆变,以及如何使用 Deleg