深入理解C#中的扩展方法

2020-06-01 18:01:12于海丽

public interface ILog
{
void Log(string message, LogLevel logLevel);
}
public static class ILogExtensions
{
/// <summary>
///记录调试信息
/// </summary>
/// <remarks>扩 展方法,方便记录调试信息</ remarks>
public static void LogDebug(this ILog logger, string message )
{
if (true) // 判断日志配置中是否允许输入Debug类型的日志
{
logger? .Log($" {message}", LogLevel.Debug);
}
}
}

3、重用代码,使代码更简洁;由于扩展方法封装了一段完整的逻辑,所以,使用扩展方法就避免了复制粘贴代码的情况。上例中扩展方法的内容也符合这种使用场景。

四、注意事项
以下是定义与使扩展方法时的一些注意事项和最佳实践:

1、扩展方法本质上是为原有类型提供辅助功能,因此,在创建时,要确保它具有实际意义,且遵循单一职责原则;也即,不能过度使用扩展方法并且它能够完成一个具体、完整的功能;

2、扩展方法本身具有通用性,因此,它里面应避免特定的业务数据类型及其相关逻辑;

3、如果为接口增加扩展方法,扩展方法的命名空间可以与接口的一致;否则,应尽量避免与原类型写在同一命名空间下,这样会“污染”原类型。建议的做法是为扩展方法所在的类设定一个单独的命名空间,如:<Company>.<Product>.Extentions。不过,这样做也有缺点:在操作原有类型的实例时,如果不引用扩展方法所在的命名空间,那么,它就不容易被发现,而解决这个问题的办法是,尽量将扩展方法文档化,并告诉项目组的其他开发人员;

4、为接口增加扩展方法后,则所有实现此接口的类都会包含该扩展方法;
5、在扩展方法中,要对第一个参数进行非空检查,如果为空,应抛出ArgumentNullException(参数为空)异常。