using System; using System.Collections.Generic; using System.Text; using Xunit; using Study.DelegateSeries.Core; namespace Study.DelegateSeries.Test { /// /// 实例化委托 /// 委托使用:声明 -> 实例化 ->调用 /// 类在实例化之后叫对象或实例,但委托在实例化后仍叫委托。 /// public class InstanceDelagateTest { #region 单实例委托 #region 命名委托 /// /// 实例化命名委托语法:委托名 委托对象名 = new 委托名 (方法名); /// 参数:1、方法签名与委托完全匹配(返回值、参数:个数、顺序、类型) /// 2、方法名既可以是静态方法的名称,也可以是实例方法的名称 /// [Fact] public void NamedDelegate_UseNewKeyword_Test() { //使用New关键字:和实例化类相似 new 委托名(方法名),不同的是:参数为 匹配委托签名的方法名称 ClassLevelDelegate classDelegate = new ClassLevelDelegate(GetClassName); Assert.Equal("GetClassName", classDelegate.Method.Name); } [Fact] public void NamedDelegate_InstanceMethed_Test() { ClassLevelDelegate classDelegate = new ClassLevelDelegate(GetClassName); Assert.Equal("GetClassName", classDelegate.Method.Name); } [Fact] public void NamedDelegate_StaticMethed_Test() { ClassLevelDelegate classDelegate = new ClassLevelDelegate(StaticClass.GetName); Assert.Equal("GetName", classDelegate.Method.Name); } [Fact] public void NamedDelegate_EllipsisNewKeyword_Test() { ClassLevelDelegate classDelegate = this.GetClassName; Assert.Equal("GetClassName", classDelegate.Method.Name); } [Fact] public void NamedDelegate_ChangeInstanceMethed_Test() { ClassLevelDelegate classDelegate = this.GetClassName; Assert.Equal("GetClassName", classDelegate.Method.Name); //改变赋值:由于委托是引用类型,给它赋新值,则为改变包含在委托变量中的方法地址引用,旧的引用会被垃圾回收器回收。 classDelegate = StaticClass.GetName; Assert.Equal("GetName", classDelegate.Method.Name); } #endregion #region 匿名委托 //匿名方法(Anonymous Methods)是没有名称只有主体的方法,提供了一种传递代码块作为委托参数的技术。 //匿名方法不需要指定返回类型,返回类型是从方法主体内的 return 语句推断的 //语法:委托类型 委托实例名 = delegate(参数){ 方法体,可以带retun 语句}; [Fact] public void AnonymousMethodsDelegate_Test() { ToLowerDelegate demo = new ToLowerDelegate(delegate (string source) { return source.ToLower(); }); Assert.StartsWith(" /// 省略new 委托名() /// [Fact] public void AnonymousMethodsDelegate_EllipsisNewKeyword_Test() { ToLowerDelegate demo = delegate (string source) { return source.ToLower(); }; Assert.StartsWith(" /// 省略new 委托名(),再省略参数 /// [Fact] public void AnonymousMethodsDelegate_EllipsisParameter_Test() { //再次省略了参数(当然,这样在方法体内也没法使用参数):编译器会自动推断 ToLowerDelegate demo = delegate { return "anonymousmethods"; }; Assert.StartsWith(" { return source.ToLower(); }; Assert.StartsWith(" source.ToLower(); Assert.StartsWith(" { }; Assert.NotNull(action.Method); } [Fact] public void ActionT_Test() { Action action = (a) => { }; Assert.NotNull(action.Method); } [Fact] public void Test() { List aa = new List(); } #endregion #endregion #region 多播委托 #endregion #region 辅助方法 private string GetClassName() { return this.GetType().FullName; } #endregion } }