首页 / 示例教程 / 正文

C#编程进阶视频教程--静态扩展方法与高级用法(基于静态扩展方法的链式编程)

2857 发布于: 2018-01-25 读完约需14分钟

前言

大家好,
我是Rector,一位专注.NET开发以及国内.NET开发者社区的探索者和实践者。
我推出了一个名为[.NET微讲堂]的视频讲堂。目前录制了一个关于《C#编程进阶视频教程—静态扩展方法与高级用法》的视频教程,希望这些.NET社区贡献的小小力量,对愿意了解或者学习C#静态扩展方法的童鞋会有所帮助。

C#编程进阶视频教程--静态扩展方法与高级用法

本文我将把这个视频所涉及的部分概念,知识点以及核心源代码分享给大家。

概念及知识点

适用人群

具有一定C#程序设计基础(熟悉C#中什么是类,什么是类的方法和属性)

基本概念

什么是静态扩展方法;
静态扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用;
静态扩展方法让你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。

静态扩展方法主要特征

  • 1.静态扩展方法位于静态类,并且以static修饰符修饰的静态方法;
  • 2.静态扩展方法的第一个参数以this修饰符为前缀,后跟要扩展的目标类型及参数;
  • 3.静态扩展方法只能针对实例调用,即:静态类不能作为目标类;
  • 4.如果扩展方法和被扩展类中某个签名相同,则扩展方法永远不会被调用

案例实战

1.静态扩展方法的初级用法
基于一个简易计算器的静态扩展方法及实现

2.静态扩展方法高级用法—链式编程
以生活中的实例,结合C#静态扩展方法来实现链式编程

视频中的部分源代码

MyCalculator.cs:

using Calculator;

namespace StaticMethodDemo
{
    public class MyCalculator
    {
        public DotNetCalculator Calculator = new DotNetCalculator();

        public int Substract(int x, int y)
        {
            return x - y;
        }
    }
}

DotNetCalculatorExtension.cs

using Calculator;

namespace StaticMethodDemo
{
    /// <summary>
    /// 计算器静态扩展类
    /// </summary>
    public static class DotNetCalculatorExtension
    {
        /// <summary>
        /// 减法
        /// </summary>
        /// <param name="dotNetCalculator"></param>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        public static int Subtract(this DotNetCalculator dotNetCalculator, int x, int y)
        {
            return x - y;
        }
    }
}

JuiceCup.cs:

using System.Collections.Generic;

namespace StaticMethodDemo
{
    /// <summary>
    /// 果汁杯
    /// </summary>
    public class JuiceCup
    {
        public JuiceCup()
        {
            Items = new List<string>();
        }
        /// <summary>
        /// 我们当前向果汁加的料剂
        /// </summary>
        public List<string> Items { get; set; }
        /// <summary>
        /// 当前这个果汁杯的盖子是否被盖上
        /// </summary>
        public bool IsLidCovered { get; set; }

        /// <summary>
        /// 向果汁杯中加入料剂
        /// </summary>
        /// <param name="item"></param>
        public void AddJuice(string item)
        {
            Items.Add(item);
        }
    }
}

JuiceCupExtension.cs:

namespace StaticMethodDemo
{
    /// <summary>
    /// 果汁杯的扩展类
    /// </summary>
    public static class JuiceCupExtension
    {
        /// <summary>
        /// 果汁杯初始化(加入白开水)
        /// </summary>
        /// <param name="juiceCup">果汁杯</param>
        /// <returns></returns>
        public static JuiceCup Initialize(this JuiceCup juiceCup)
        {
            juiceCup.AddJuice("加入了白开水");
            return juiceCup;
        }

        /// <summary>
        /// 向果汁杯加入橙汁
        /// </summary>
        /// <param name="juiceCup">果汁杯</param>
        /// <returns></returns>
        public static JuiceCup AddOrangeJuice(this JuiceCup juiceCup)
        {
            juiceCup.AddJuice("加入了橙汁");
            return juiceCup;
        }

        /// <summary>
        /// 向果汁杯加入香精
        /// </summary>
        /// <param name="juiceCup">果汁杯</param>
        /// <returns></returns>
        public static JuiceCup AddEssence(this JuiceCup juiceCup)
        {
            juiceCup.AddJuice("加入了香精");
            return juiceCup;
        }

        /// <summary>
        /// 向果汁杯加入冰块
        /// </summary>
        /// <param name="juiceCup">果汁杯</param>
        /// <returns></returns>
        public static JuiceCup AddIceCube(this JuiceCup juiceCup)
        {
            juiceCup.AddJuice("加入了冰块");
            return juiceCup;
        }

        /// <summary>
        /// 盖上盖子
        /// </summary>
        /// <param name="juiceCup">果汁杯</param>
        /// <returns></returns>
        public static void CoverLid(this JuiceCup juiceCup)
        {
            juiceCup.IsLidCovered = true;
        }
    }
}

Bartender.cs:

using System;

namespace StaticMethodDemo
{
    /// <summary>
    /// 调酒师
    /// </summary>
    public class Bartender
    {
        /// <summary>
        /// 调果汁
        /// </summary>
        public void MixJuice()
        {
            var juiceCup = new JuiceCup();
            juiceCup
                .Initialize()
                .AddOrangeJuice()
                .AddEssence()
                .AddIceCube()
                .CoverLid();

            //juiceCup.Items.ForEach(x =>
            //{
            //    Console.WriteLine(x);
            //});

            Console.WriteLine(string.Join(Environment.NewLine, juiceCup.Items));

            Console.WriteLine($"盖子是否已盖上:{juiceCup.IsLidCovered}");
        }
    }
}

希望对大家有所帮助,谢谢。
如果有学习过程中遇到任何问题,请加我们的.NET开发者社区学习交流群:483350228

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

上一篇: [javascript]Javascript中如何从数组中删除指定的元素?

下一篇: [javascript]Javascript中如何从一个对象中删除某个或者某些属性?

本文永久链接码友网 » C#编程进阶视频教程--静态扩展方法与高级用法(基于静态扩展方法的链式编程)

分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册