c# - "null this"是可以接受的扩展方法使用吗?

标签 c# .net null extension-methods guid

<分区>

所以,我真的很喜欢使用扩展方法……也许有点太多了。所以,我要问一下我最近的享受,以确保我不会走得太远。

场景是我们有一个传入的 Guid? 变量。如果变量为 null 或 Guid.Empty,那么我们想使用不同的 Guid。所以,我写了一个扩展方法让它读起来像英文:

    internal static Guid OrIfEmpty(this Guid? guid, Guid other)
    {
        if (!guid.HasValue || guid.Value == Guid.Empty)
        {
            return other;
        }
        return guid.Value;
    }

这自动意味着“null this”不会抛出异常。例如,这将起作用:

((Guid?)null).OrIfEmpty(other);

如果不使用扩展方法,这是不可能的,在我看来,这可能会产生误导。但是,它就是那么简洁干净!所以你怎么看?这是一件可以接受的事情,还是会让其他程序员感到困惑?

此外,我确信在其他情况下我会做这样的事情并检查 this 是否为 null,但这是我现在拥有的最好的例子。

注意:我并不是真的要问这个 Guid? 业务。我想问更多关于实现的整体模式(有一个扩展方法,其中 this 可以是 null)

最佳答案

This is not possible without using extension methods

当然可以,只是 make 是一个常规的静态方法调用(所有扩展方法都是):

in my opinion can be quite misleading

我同意,因为它看起来您是在 null 实例上调用实例方法。情况可能更糟:

string s = null;
string n = s.OrIfEmpty("empty");

乍一看,这看起来像是一个明显的等待发生的 NullReferenceException,但它会按设计进行编译和工作。

由于你的问题真的只是征求意见,没有一个正确答案,但我当然会谨慎并记录扩展方法以表明 this 参数可以是 null。或者(正如@quezalcoatl 暗示的那样)将其重命名为更明确地支持 null 值:

internal static Guid OrIfNullOrEmpty(this Guid? guid, Guid other)

关于c# - "null this"是可以接受的扩展方法使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14565881/

相关文章:

c# - 将未知值传递到 switch 语句时,我应该抛出什么类型的异常

java - 应用层

c# - FileSystemWatcher 更改事件(对于 "LastWrite")是不可靠的

c# - 非 System.Web 替代 HttpPostedFileBase?

lua - 如何使用 redis-scripto 和 redis DB 在 LUA 中执行 null\nil 检查?

c# - SOAP 响应大小

c# - 如何避免循环多线程任务中 JSON 序列化期间集合修改?

C# 浮点精度

android - Textview 在 Android 上返回 null

c - C NULL 是否等于 C++11 nullptr