扩展静态方法和非扩展静态方法之间的区别是什么

时间:2014-01-09 00:03:57

标签: c# extension-methods

class A我有一个方法:

  public static String GetTimestamp(this DateTime value) {
            return value.ToString("yyyyMMddHHmmssffff");
        }

我叫它:

        String timeStamp = GetTimestamp(new DateTime());

如果该方法看起来有什么区别:

  public static String GetTimestamp( DateTime value) {
                return value.ToString("yyyyMMddHHmmssffff");
            }

4 个答案:

答案 0 :(得分:4)

扩展方法的关键在于您可以将其称为:

String timeStamp = new DateTime().GetTimestamp();

达到同样的效果。这是唯一的改变。

答案 1 :(得分:2)

扩展方法旨在用作"如果它们是"目标类型的常规实例方法:

var timeStamp = new DateTime().GetTimestamp();
除此之外,没有区别。


它们是在C#3.0中引入的,用于创建我们通常在LINQ中看到的漂亮语法,例如:

  var soldProducts = customers.Where(x => x.IsActive)
                              .SelectMany(x => x.Orders)
                              .Where(x => x.Status == OrderStatus.Completed)
                              .Select(x => x.Product)
                              .ToList;

没有扩展方法,这种语法是不可能的,并且需要许多常规方法调用:

var activecustomers = Enumerable.Where(customers, x => x.IsActive);
var orders = Enumerable.SelectMany(activecustomers, x => x.Orders);
var completed = Enumerable.Where(orders, x => x.Status == OrderStatus.Completed);
var products = Enumerable.Select(completed, x => x.Product);
var soldProducts = Enumerable.ToList(products);

更不用说type inference在这里也发挥了重要作用,因为System.Linq.Enumerable中的大多数方法实际上是具有一个或多个类型参数的泛型方法,但C#编译器足够智能推断泛型类型参数,并删除明确指定它们的需要。

答案 2 :(得分:2)

使用扩展方法版本,您也可以使用

调用它
dateTime.GetTimeStamp()

如果你已经包含它声明的命名空间。

答案 3 :(得分:2)

扩展方法允许您将它们视为所讨论类型的 in 方法。因此,在您的第一个示例中,可以将该方法视为DateTime中的方法。所以你可以这样做:

var foo = new DateTime();
var timestamp = foo.GetTimestamp();