You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

166 lines
5.0 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
}
}