From 4d42c5bd9f8bed707f4173d1c15830ca01136398 Mon Sep 17 00:00:00 2001 From: bicijinlian Date: Tue, 30 Jul 2019 20:53:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DeclareCalculatroDelegate.cs | 14 ++ Study.DelegateSeries.Core/DeclareDelegate.cs | 40 ++--- .../DeclarePersonDelegate.cs | 18 ++ Study.DelegateSeries.Core/Demo.cs | 24 --- .../{StudyDelegate.cs => InstanceDelegate.cs} | 57 +----- Study.DelegateSeries.Core/InvokDelegate.cs | 14 ++ Study.DelegateSeries.Core/StaticClass.cs | 14 ++ .../DeclareDelegateTest.cs | 11 ++ .../GlobalDelegateTest.cs | 18 ++ .../InstanceDelagateTest.cs | 165 ++++++++++++++++++ .../InvokDelegateTest.cs | 13 ++ ...yDelegateTest.cs => PersonDelegateTest.cs} | 14 +- Study.DelegateSeries.Test/UnitTest1.cs | 14 -- Study.DelegateSeries.Test/XUnitTest.cs | 15 -- 14 files changed, 295 insertions(+), 136 deletions(-) create mode 100644 Study.DelegateSeries.Core/DeclareCalculatroDelegate.cs create mode 100644 Study.DelegateSeries.Core/DeclarePersonDelegate.cs delete mode 100644 Study.DelegateSeries.Core/Demo.cs rename Study.DelegateSeries.Core/{StudyDelegate.cs => InstanceDelegate.cs} (52%) create mode 100644 Study.DelegateSeries.Core/InvokDelegate.cs create mode 100644 Study.DelegateSeries.Core/StaticClass.cs create mode 100644 Study.DelegateSeries.Test/DeclareDelegateTest.cs create mode 100644 Study.DelegateSeries.Test/GlobalDelegateTest.cs create mode 100644 Study.DelegateSeries.Test/InstanceDelagateTest.cs create mode 100644 Study.DelegateSeries.Test/InvokDelegateTest.cs rename Study.DelegateSeries.Test/{StudyDelegateTest.cs => PersonDelegateTest.cs} (83%) delete mode 100644 Study.DelegateSeries.Test/UnitTest1.cs delete mode 100644 Study.DelegateSeries.Test/XUnitTest.cs diff --git a/Study.DelegateSeries.Core/DeclareCalculatroDelegate.cs b/Study.DelegateSeries.Core/DeclareCalculatroDelegate.cs new file mode 100644 index 0000000..8839b5a --- /dev/null +++ b/Study.DelegateSeries.Core/DeclareCalculatroDelegate.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Study.DelegateSeries.Core +{ + /// + /// 计算器:计算委托 + /// + /// 参数A + /// 参数B + /// 计算结果 + public delegate decimal CalculatorDelegate(decimal numberA, decimal numberB); +} diff --git a/Study.DelegateSeries.Core/DeclareDelegate.cs b/Study.DelegateSeries.Core/DeclareDelegate.cs index 2ab73d7..3a7e7c1 100644 --- a/Study.DelegateSeries.Core/DeclareDelegate.cs +++ b/Study.DelegateSeries.Core/DeclareDelegate.cs @@ -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 { - - /// - /// 显示类型名 委托 - /// - /// 类型名 - public delegate string ShowTypeNameDelegate(); + //类同级:最常用和推荐的,可见范围与使用方法与类相同。 + public delegate string ClassLevelDelegate(); - /// - /// 显示人名 委托 - /// - /// 人名 - public delegate string ShowPersonName(); + public class DeclareDelegateDemo + { + //类内部方法同级:可见范围与使用方法与类中方法相似,调用方须先调用类,后再调用委托。 + public delegate string MethodLevelDelegate(); - /// - /// 计算器:计算委托 - /// - /// 参数A - /// 参数B - /// 计算结果 - public delegate decimal CalculatorDelegate(decimal numberA,decimal numberB); + public string GetClassName() + { + //方法体内:不允许定义委托 - /// - /// 返回整形无参 委托 - /// - /// 整形数字 - public delegate int IntegerDelegate(); + return "DeclareDelegateDemo"; + } + } } diff --git a/Study.DelegateSeries.Core/DeclarePersonDelegate.cs b/Study.DelegateSeries.Core/DeclarePersonDelegate.cs new file mode 100644 index 0000000..41e96d0 --- /dev/null +++ b/Study.DelegateSeries.Core/DeclarePersonDelegate.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Study.DelegateSeries.Core +{ + /// + /// 显示类型名 委托 + /// + /// 类型名 + public delegate string ShowTypeNameDelegate(); + + /// + /// 显示人名 委托 + /// + /// 人名 + public delegate string ShowPersonName(); +} diff --git a/Study.DelegateSeries.Core/Demo.cs b/Study.DelegateSeries.Core/Demo.cs deleted file mode 100644 index 42d18c0..0000000 --- a/Study.DelegateSeries.Core/Demo.cs +++ /dev/null @@ -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; - } - } -} diff --git a/Study.DelegateSeries.Core/StudyDelegate.cs b/Study.DelegateSeries.Core/InstanceDelegate.cs similarity index 52% rename from Study.DelegateSeries.Core/StudyDelegate.cs rename to Study.DelegateSeries.Core/InstanceDelegate.cs index 4a1fef3..b548c55 100644 --- a/Study.DelegateSeries.Core/StudyDelegate.cs +++ b/Study.DelegateSeries.Core/InstanceDelegate.cs @@ -1,33 +1,15 @@ using Study.DelegateSeries.Core.Calculator; using System; +using System.Collections.Generic; +using System.Text; namespace Study.DelegateSeries.Core { /// - /// 委托学习 - /// 使用:定义委托、实例化委托、调用委托 + /// 实例化委托 /// - public class StudyDelegate + public class InstanceDelegate { - /* - * 委托系列学习 - * 1、委托概念 - * 2、定义与使用委托 - * 3、多播委托 - * 4、使用匿名方法 - * 5、使用Lamda表达式 - * 6、委托使用场景 - * 7、委托与事件 - * 8、委托与接口 - * 9、其它 - * 10、总结 - */ - - #region 定义委托,DeclareDelegate类 - #endregion - - #region 实例化委托 - /// /// 基础语法 /// (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 /// 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 } } diff --git a/Study.DelegateSeries.Core/InvokDelegate.cs b/Study.DelegateSeries.Core/InvokDelegate.cs new file mode 100644 index 0000000..cb60bb6 --- /dev/null +++ b/Study.DelegateSeries.Core/InvokDelegate.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Study.DelegateSeries.Core +{ + /// + /// 调用委托 + /// + public class InvokDelegate + { + + } +} diff --git a/Study.DelegateSeries.Core/StaticClass.cs b/Study.DelegateSeries.Core/StaticClass.cs new file mode 100644 index 0000000..d42ecd2 --- /dev/null +++ b/Study.DelegateSeries.Core/StaticClass.cs @@ -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"; + } + } +} diff --git a/Study.DelegateSeries.Test/DeclareDelegateTest.cs b/Study.DelegateSeries.Test/DeclareDelegateTest.cs new file mode 100644 index 0000000..d30c2d2 --- /dev/null +++ b/Study.DelegateSeries.Test/DeclareDelegateTest.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Xunit; + +namespace Study.DelegateSeries.Test +{ + public class DeclareDelegateTest + { + } +} diff --git a/Study.DelegateSeries.Test/GlobalDelegateTest.cs b/Study.DelegateSeries.Test/GlobalDelegateTest.cs new file mode 100644 index 0000000..0325f6d --- /dev/null +++ b/Study.DelegateSeries.Test/GlobalDelegateTest.cs @@ -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); + } + } +} diff --git a/Study.DelegateSeries.Test/InstanceDelagateTest.cs b/Study.DelegateSeries.Test/InstanceDelagateTest.cs new file mode 100644 index 0000000..7e1ef2f --- /dev/null +++ b/Study.DelegateSeries.Test/InstanceDelagateTest.cs @@ -0,0 +1,165 @@ +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 + } +} diff --git a/Study.DelegateSeries.Test/InvokDelegateTest.cs b/Study.DelegateSeries.Test/InvokDelegateTest.cs new file mode 100644 index 0000000..83c12cf --- /dev/null +++ b/Study.DelegateSeries.Test/InvokDelegateTest.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Study.DelegateSeries.Test +{ + /// + /// 调用委托测试 + /// + public class InvokDelegateTest + { + } +} diff --git a/Study.DelegateSeries.Test/StudyDelegateTest.cs b/Study.DelegateSeries.Test/PersonDelegateTest.cs similarity index 83% rename from Study.DelegateSeries.Test/StudyDelegateTest.cs rename to Study.DelegateSeries.Test/PersonDelegateTest.cs index 600aea9..2a59642 100644 --- a/Study.DelegateSeries.Test/StudyDelegateTest.cs +++ b/Study.DelegateSeries.Test/PersonDelegateTest.cs @@ -9,25 +9,17 @@ using Study.DelegateSeries.Core.Calculator; namespace Study.DelegateSeries.Test { - public class StudyDelegateTest : IDisposable, IClassFixture + public class StudyDelegateTest : IDisposable, IClassFixture { #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() diff --git a/Study.DelegateSeries.Test/UnitTest1.cs b/Study.DelegateSeries.Test/UnitTest1.cs deleted file mode 100644 index 253f536..0000000 --- a/Study.DelegateSeries.Test/UnitTest1.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using Xunit; - -namespace Study.DelegateSeries.Test -{ - public class UnitTest1 - { - [Fact] - public void Test1() - { - - } - } -} diff --git a/Study.DelegateSeries.Test/XUnitTest.cs b/Study.DelegateSeries.Test/XUnitTest.cs deleted file mode 100644 index 0e6623d..0000000 --- a/Study.DelegateSeries.Test/XUnitTest.cs +++ /dev/null @@ -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, "ͨ"); - } - } -}