代码改变世界

C#拾遗系列(5):泛型委托

2008-06-14 17:25  敏捷的水  阅读(444)  评论(0编辑  收藏  举报

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace NetTest

{

    //泛型委托   

    class TestGenericDelegate

    {

        public delegate void StackEventHandler<T, U>(T sender, U eventArgs);

        class Stack<T>

        {

            /*

            在泛型类和泛型方法中产生的一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型 T:

            T 是引用类型还是值类型。

            如果 T 为值类型,则它是数值还是结构

            给定参数化类型 T 的一个变量 t,只有当 T 为引用类型时,语句 t = null 才有效;只有当 T 为数值类型而不是结构时,语句 t = 0 才能正常使用。

            解决方案是使用 default 关键字,此关键字对于引用类型会返回 null,对于数值类型会返回零。

            对于结构,此关键字将返回初始化为零或 null 的每个结构成员,具体取决于这些结构是值类型还是引用类型

            */

            public T getName()

            {

                T temp = default(T);

                return temp;

            }

            public class StackEventArgs : EventArgs

            {

                public string Name { get; set; }

                public string Message { get; set; }

            }

            public event StackEventHandler<Stack<T>, StackEventArgs> stackEvents;

 

            public void StackChange()

            {

                StackEventArgs s = new Stack<T>.StackEventArgs();

                s.Name = "jack";

                s.Message = "Better Man";

                OnStackChanged(s);

            }

 

            protected virtual void OnStackChanged(StackEventArgs e)

            {

                stackEvents(this, e);

            }

        }

        class SampleClass

        {

            public void HandleStackChange<T>(Stack<T> stack, Stack<T>.StackEventArgs args)

            {

                Console.Out.WriteLine(args.Message + "," + args.Name);

            }

        }

        public void Test()

        {

            Stack<double> s = new Stack<double>();

            SampleClass o = new SampleClass();

            s.stackEvents += o.HandleStackChange;

            s.StackChange();

            Console.Out.WriteLine(s.getName());

        }

    }

}