在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");
}
答案 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();