Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#扩展方法-多远是太远?_C#_Ruby On Rails_Extension Methods - Fatal编程技术网

C#扩展方法-多远是太远?

C#扩展方法-多远是太远?,c#,ruby-on-rails,extension-methods,C#,Ruby On Rails,Extension Methods,Rails向Ruby引入了一些核心扩展,比如3.days.from\u now,它会返回,正如您预期的未来三天的日期一样。使用C#中的扩展方法,我们现在可以做类似的事情: static class Extensions { public static TimeSpan Days(this int i) { return new TimeSpan(i, 0, 0, 0, 0); } public static DateTime FromNow(th

Rails向Ruby引入了一些核心扩展,比如
3.days.from\u 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);
        }
    }
}
静态类扩展
{
公共静态IEnumerable To(此int-from,int-To)
{
返回可枚举的范围(从,到-from+1);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
foreach(10至(20)中的var i)
{
控制台写入线(i);
}
}
}

这从根本上说是错误的,还是有时候这是个好主意,比如在Rails这样的框架中?

我个人喜欢int.To,我对int.Days有矛盾,我不喜欢TimeSpan.FromNow

我不喜欢我认为有点流行的“流畅”接口,它允许你编写伪英语代码,但通过实现名称可能令人困惑的方法来实现

例如,这对我来说不太好:

TimeSpan.FromSeconds(4).FromNow()

显然,这是一件主观的事情。

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

3.Days().FromNow()
为例。这是非常有表现力的,任何人都可以阅读这段代码并准确地告诉您它的功能。这真是一件美好的事情。作为程序员,我们很乐意编写自我描述和表达的代码,这样就几乎不需要任何注释,阅读起来也很愉快。这一准则在这方面至关重要

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


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

我站在保守的一边,至少目前是这样,我反对扩展方法。对我来说,语法上的糖分并不是那么重要。我认为,如果初级开发人员是C#新手,那么这对他们来说也可能是一场噩梦。我宁愿将扩展封装在我自己的对象或静态方法中


如果您打算使用它们,请不要过度使用它们,因为这样做是为了方便您自己,但会干扰任何接触您的代码的人。:-)

每种语言都有自己对语言应该是什么的看法。Rails和Ruby的设计都有自己独特的见解。PHP和C(+/#)有着明显不同的观点,VisualBasic也是如此(尽管我们显然不喜欢他们的风格)

平衡点是拥有许多易于阅读的内置功能,而不是对一切的本质控制。我不想要太多的函数,以至于每次你想做任何事情时都必须去查找(而且对于臃肿的框架来说,一定会有性能开销),但我个人喜欢Rails,因为它为我节省了大量的开发时间


我想我在这里要说的是,如果你在设计一种语言,采取一种立场,从那里开始,并构建你(或你的目标开发人员)最常使用的功能。首先,我的直觉是:
3分钟。从现在开始
看起来很酷,但没有说明扩展方法为什么好。这也反映了我的总体观点:很酷,但我从未真正错过过它们


问题:
3.分钟是时间跨度还是角度?

通过using语句“正常”引用的名称空间只影响类型,现在它们突然决定了
3.Minutes
的含义

所以最好的办法是“不要让他们逃跑”。

一个可能被引用的命名空间中的所有公共扩展方法最终都是“某种全局的”——所有潜在的问题都与此相关。将它们保留在程序集内部,或将它们放入单独的命名空间中,该命名空间将分别添加到每个文件中

在这个问题上,我同意siz和lean的观点。Rails已经加入了这类东西,所以它从来没有那么令人困惑。当您编写“days”和“fromnow”方法时,无法保证您的代码没有bug。此外,您正在向代码中添加依赖项。如果将扩展方法放在它们自己的文件中,则每个项目都需要该文件。在项目中,您需要在需要时包含该项目


综上所述,对于存在于其他框架/世界中的真正简单的扩展方法(如Jeff使用的或thatismatt使用的days.fromnow),我认为是可以的。任何熟悉日期的人都应该理解“3.Days().FromNow()”的含义

我个人的偏好是,现在尽量少用它们,等着看微软和其他大公司如何使用它们。如果我们开始看到很多代码,教程和书籍都会使用像3.Days()这样的代码。FromNow()会让我们经常使用它。如果只有一小部分人使用它,那么您就有可能因为没有足够多的人熟悉扩展的工作方式而使代码过于难以维护


另一方面,我想知道普通for循环和foreach循环之间的性能比较如何?第二种方法似乎需要计算机做很多额外的工作,但我对这个概念还不太熟悉,无法确定。Thatismatt没有指定int.Days,他举的例子是TimeSpan.Days。请您更正一下好吗?@Neil-Days扩展方法扩展int以返回TimeSpan。我想同样的逻辑会把我们带回到汇编,但您是对的:封装,特别是当做得不好时,确实是有成本的。@slowplay-exte的要点