C# 扩展方法 - 多远才算太远?

2023-12-23

Rails 为 Ruby 引入了一些核心扩展,例如3.days.from_now它会返回,正如您期望的三天后的日期一样。使用 C# 中的扩展方法,我们现在可以执行类似的操作:

static class Extensions
{
    public static TimeSpan Days(this int i)
    {
        return new TimeSpan(i, 0, 0, 0, 0);
    }

    public static DateTime FromNow(this TimeSpan ts)
    {
        return DateTime.Now.Add(ts);
    }
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(
            3.Days().FromNow()
        );
    }
}

或者怎么样:

static class Extensions
{
    public static IEnumerable<int> To(this int from, int to)
    {
        return Enumerable.Range(from, to - from + 1);
    }
}

class Program
{
    static void Main(string[] args)
    {
        foreach (var i in 10.To(20))
        {
            Console.WriteLine(i);
        }
    }
}

这是从根本上错误的,还是有时这是一个好主意,就像在 Rails 这样的框架中?


我非常喜欢扩展方法,但我确实觉得当它们在 LINQ 之外使用时,它们会以牺牲可维护性为代价来提高可读性。

Take 3.Days().FromNow()举个例子。这非常具有表现力,任何人都可以阅读这段代码并准确地告诉您它的作用。这真是一件美丽的事情。作为编码员,我们很高兴编写具有自我描述性和表现力的代码,这样它几乎不需要注释并且阅读起来很愉快。这段代码在这方面至关重要。

然而,作为编码员,我们也对后代负责,而我们之后的人将花费大部分时间试图理解这段代码是如何工作的。我们必须小心,不要太具有表现力,以至于调试我们的代码需要在无数的扩展方法之间跳跃。

扩展方法掩盖了“如何”,以更好地表达“什么”。我想这使得它们成为一把双刃剑,最好适度使用(就像所有东西一样)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 扩展方法 - 多远才算太远? 的相关文章

随机推荐