前言
大家好,
我是Rector,一位专注.NET开发以及国内.NET开发者社区的探索者和实践者。
我推出了一个名为[.NET微讲堂]的视频讲堂。目前录制了一个关于《C#编程进阶视频教程—静态扩展方法与高级用法》的视频教程,希望这些.NET社区贡献的小小力量,对愿意了解或者学习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
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册