|
|
|
@ -0,0 +1,165 @@
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
|
|
|
|
using Xunit;
|
|
|
|
|
|
|
|
|
|
using Study.DelegateSeries.Core;
|
|
|
|
|
|
|
|
|
|
namespace Study.DelegateSeries.Test
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 实例化委托
|
|
|
|
|
/// 委托使用:声明 -> 实例化 ->调用
|
|
|
|
|
/// 类在实例化之后叫对象或实例,但委托在实例化后仍叫委托。
|
|
|
|
|
/// </summary>
|
|
|
|
|
public class InstanceDelagateTest
|
|
|
|
|
{
|
|
|
|
|
#region 单实例委托
|
|
|
|
|
#region 命名委托
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 实例化命名委托语法:委托名 委托对象名 = new 委托名 (方法名);
|
|
|
|
|
/// 参数:1、方法签名与委托完全匹配(返回值、参数:个数、顺序、类型)
|
|
|
|
|
/// 2、方法名既可以是静态方法的名称,也可以是实例方法的名称
|
|
|
|
|
/// </summary>
|
|
|
|
|
[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("<AnonymousMethods", demo.Method.Name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 省略new 委托名()
|
|
|
|
|
/// </summary>
|
|
|
|
|
[Fact]
|
|
|
|
|
public void AnonymousMethodsDelegate_EllipsisNewKeyword_Test()
|
|
|
|
|
{
|
|
|
|
|
ToLowerDelegate demo = delegate (string source) { return source.ToLower(); };
|
|
|
|
|
|
|
|
|
|
Assert.StartsWith("<AnonymousMethods", demo.Method.Name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 省略new 委托名(),再省略参数
|
|
|
|
|
/// </summary>
|
|
|
|
|
[Fact]
|
|
|
|
|
public void AnonymousMethodsDelegate_EllipsisParameter_Test()
|
|
|
|
|
{
|
|
|
|
|
//再次省略了参数(当然,这样在方法体内也没法使用参数):编译器会自动推断
|
|
|
|
|
ToLowerDelegate demo = delegate { return "anonymousmethods"; };
|
|
|
|
|
|
|
|
|
|
Assert.StartsWith("<AnonymousMethods", demo.Method.Name);
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 拉姆达表达式
|
|
|
|
|
[Fact]
|
|
|
|
|
public void LambdaDelegate_Test()
|
|
|
|
|
{
|
|
|
|
|
ToLowerDelegate demo = (string source) => { return source.ToLower(); };
|
|
|
|
|
|
|
|
|
|
Assert.StartsWith("<Lambda", demo.Method.Name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public void LambdaDelegate_Ellipsis_Test()
|
|
|
|
|
{
|
|
|
|
|
ToLowerDelegate demo = source => source.ToLower();
|
|
|
|
|
|
|
|
|
|
Assert.StartsWith("<Lambda", demo.Method.Name);
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 内置委托支持泛型
|
|
|
|
|
[Fact]
|
|
|
|
|
public void Action_Test()
|
|
|
|
|
{
|
|
|
|
|
Action action = () => { };
|
|
|
|
|
|
|
|
|
|
Assert.NotNull(action.Method);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public void ActionT_Test()
|
|
|
|
|
{
|
|
|
|
|
Action<int> action = (a) => { };
|
|
|
|
|
|
|
|
|
|
Assert.NotNull(action.Method);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public void Test()
|
|
|
|
|
{
|
|
|
|
|
List<string> aa = new List<string>();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 多播委托
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 辅助方法
|
|
|
|
|
private string GetClassName()
|
|
|
|
|
{
|
|
|
|
|
return this.GetType().FullName;
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
}
|