develop
bicijinlian 5 years ago
parent 88414745de
commit 4d42c5bd9f

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Study.DelegateSeries.Core
{
/// <summary>
/// 计算器:计算委托
/// </summary>
/// <param name="numberA">参数A</param>
/// <param name="numberB">参数B</param>
/// <returns>计算结果</returns>
public delegate decimal CalculatorDelegate(decimal numberA, decimal numberB);
}

@ -2,32 +2,26 @@
using System.Collections.Generic;
using System.Text;
//命名空间同级调用方只需要引用定义类库就能使用不需要使用Uing语句引入定义委托的命名空间。
public delegate string NamespaceLevelDelegate();
public delegate string ToLowerDelegate(string source);
namespace Study.DelegateSeries.Core
{
/// <summary>
/// 显示类型名 委托
/// </summary>
/// <returns>类型名</returns>
public delegate string ShowTypeNameDelegate();
//类同级:最常用和推荐的,可见范围与使用方法与类相同。
public delegate string ClassLevelDelegate();
/// <summary>
/// 显示人名 委托
/// </summary>
/// <returns>人名</returns>
public delegate string ShowPersonName();
public class DeclareDelegateDemo
{
//类内部方法同级:可见范围与使用方法与类中方法相似,调用方须先调用类,后再调用委托。
public delegate string MethodLevelDelegate();
/// <summary>
/// 计算器:计算委托
/// </summary>
/// <param name="numberA">参数A</param>
/// <param name="numberB">参数B</param>
/// <returns>计算结果</returns>
public delegate decimal CalculatorDelegate(decimal numberA,decimal numberB);
public string GetClassName()
{
//方法体内:不允许定义委托
/// <summary>
/// 返回整形无参 委托
/// </summary>
/// <returns>整形数字</returns>
public delegate int IntegerDelegate();
return "DeclareDelegateDemo";
}
}
}

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Study.DelegateSeries.Core
{
/// <summary>
/// 显示类型名 委托
/// </summary>
/// <returns>类型名</returns>
public delegate string ShowTypeNameDelegate();
/// <summary>
/// 显示人名 委托
/// </summary>
/// <returns>人名</returns>
public delegate string ShowPersonName();
}

@ -1,24 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Study.DelegateSeries.Core
{
public class Demo
{
public int Square(int number)
{
return number * number;
}
public int UseDelegate()
{
IntegerDelegate intDelegate = delegate () { return 5; };
var total = Square(intDelegate());
return total;
}
}
}

@ -1,33 +1,15 @@
using Study.DelegateSeries.Core.Calculator;
using System;
using System.Collections.Generic;
using System.Text;
namespace Study.DelegateSeries.Core
{
/// <summary>
/// 委托学习
/// 使用:定义委托、实例化委托、调用委托
/// 实例化委托
/// </summary>
public class StudyDelegate
public class InstanceDelegate
{
/*
*
* 1
* 2使
* 3
* 4使
* 5使Lamda
* 6使
* 7
* 8
* 9
* 10
*/
#region 定义委托,DeclareDelegate类
#endregion
#region 实例化委托
/// <summary>
/// 基础语法
/// (c#1.0 开始提供)
@ -55,7 +37,7 @@ namespace Study.DelegateSeries.Core
public CalculatorDelegate AnonymousInstance()
{
//c# 2.0基础语法
CalculatorDelegate operation = delegate (decimal a,decimal b) { return (a * b) * (a * b); };
CalculatorDelegate operation = delegate (decimal a, decimal b) { return (a * b) * (a * b); };
return operation;
}
@ -65,37 +47,14 @@ namespace Study.DelegateSeries.Core
/// </summary>
public CalculatorDelegate LambdaInstance()
{
CalculatorDelegate operation = (decimal a,decimal b)=> { return a * a + b * b + 2 * a * b; };
CalculatorDelegate operation = (decimal a, decimal b) => { return a * a + b * b + 2 * a * b; };
//自动推断
CalculatorDelegate operation2 = (a,b) => { return a * a + b * b + 2 * a * b; };
CalculatorDelegate operation2 = (a, b) => { return a * a + b * b + 2 * a * b; };
//{}只有一句时的简写
CalculatorDelegate operation3 = (a, b) => a * a + b * b + 2 * a * b ;
CalculatorDelegate operation3 = (a, b) => a * a + b * b + 2 * a * b;
return operation;
}
#endregion
#region 调用委托
#endregion
#region 闭包
#endregion
#region 多播委托
#endregion
#region 泛型委托
#endregion
#region 内置委托
#endregion
#region 委托与事件
#endregion
#region 委托与接口
#endregion
}
}

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Study.DelegateSeries.Core
{
/// <summary>
/// 调用委托
/// </summary>
public class InvokDelegate
{
}
}

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Study.DelegateSeries.Core
{
public static class StaticClass
{
public static string GetName()
{
return "StaticClass";
}
}
}

@ -0,0 +1,11 @@
using System;
using System.Collections.Generic;
using System.Text;
using Xunit;
namespace Study.DelegateSeries.Test
{
public class DeclareDelegateTest
{
}
}

@ -0,0 +1,18 @@
using System;
using Xunit;
namespace Study.DelegateSeries.Test
{
public class GlobalDelegateTest
{
[Fact]
public void Test1()
{
//不使用using引用名字空间添加对声明程序集的引用即可。
NamespaceLevelDelegate global = new NamespaceLevelDelegate(() => string.Empty);
Assert.NotNull(global.Target);
}
}
}

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

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Study.DelegateSeries.Test
{
/// <summary>
/// 调用委托测试
/// </summary>
public class InvokDelegateTest
{
}
}

@ -9,25 +9,17 @@ using Study.DelegateSeries.Core.Calculator;
namespace Study.DelegateSeries.Test
{
public class StudyDelegateTest : IDisposable, IClassFixture<StudyDelegate>
public class StudyDelegateTest : IDisposable, IClassFixture<InstanceDelegate>
{
#region 准备
private StudyDelegate studyDelegate;
private InstanceDelegate studyDelegate;
public StudyDelegateTest(StudyDelegate _studyDelegate)
public StudyDelegateTest(InstanceDelegate _studyDelegate)
{
this.studyDelegate = _studyDelegate;
}
#endregion
#region xUnit框架可能性测试
[Fact]
public void FixtureTest()
{
Assert.NotNull(studyDelegate);
}
#endregion
#region 实例化委托测试
[Fact]
public void BaseInstanceTest()

@ -1,14 +0,0 @@
using System;
using Xunit;
namespace Study.DelegateSeries.Test
{
public class UnitTest1
{
[Fact]
public void Test1()
{
}
}
}

@ -1,15 +0,0 @@
using System;
using System.Collections.Generic;
using Xunit;
namespace Study.DelegateSeries.Test
{
public class XUnitTest
{
[Fact]
public void UseXunit()
{
Assert.True(true, "框架通过");
}
}
}
Loading…
Cancel
Save