通过在 CodePlex 上查看 System.Web.Mvc.RouteCollectionExtensions.cs 的源代码 和在本地 GAC 上运行一些 ILSpy,我发现它们似乎没有区别,虽然它们似乎有完全独立的代码来执行相同的操作。
RouteCollection.IgnoreRoute
(通过CodePlex源)
public static void IgnoreRoute(this RouteCollection routes, string url, object constraints) {
if (routes == null) {
throw new ArgumentNullException("routes");
}
if (url == null) {
throw new ArgumentNullException("url");
}
IgnoreRouteInternal route = new IgnoreRouteInternal(url) {
Constraints = new RouteValueDictionary(constraints)
};
routes.Add(route);
}
RouteCollection.Ignore
(通过 ILSpy 反编译)
public void Ignore(string url, object constraints) {
if (url == null) {
throw new ArgumentNullException("url");
}
RouteCollection.IgnoreRouteInternal item = new RouteCollection.IgnoreRouteInternal(url) {
Constraints = new RouteValueDictionary(constraints)
};
base.Add(item);
}
区别
唯一真正的区别在于它们所在的位置不同,一个是位于RouteCollection
类本身的实例方法,另一个是该类的扩展方法。在考虑到由实例和扩展执行引起的代码差异(例如对扩展实例进行重要的空值检查)之后,它们看起来是相同的。
从本质上讲,两者都使用完全相同的StopRoutingHandler
类。它们都有自己版本的封闭IgnoreRouteInternal
类,但这些版本在代码上是相同的。
private sealed class IgnoreRouteInternal : Route {
public IgnoreRouteInternal(string url)
: base(url, new StopRoutingHandler()) {
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary routeValues) {
return null;
}
}