C#中的object x = null
和object x = (object) null
之间有什么区别?
修改 - 我个人没有使用过此代码。我想知道MVC路由处理是如何工作的,因此打开DataFrame.plot
来理解它并找到它中使用的(object) null
。所以想知道区别。
答案 0 :(得分:3)
在您提供的具体示例中(为什么在ASP.NET源代码中使用它的原因)答案是:是的,它是否存在(object)
强制转换是否有所不同。
我们有这种方法:
public static Route MapRoute(this RouteCollection routes, string name, string url)
{
return MapRoute(routes, name, url, null /* defaults */, (object)null /* constraints */);
}
让我们假设我们这样称呼:
RouteCollection.MapRoute(routes, "SomeName", "SomeUrl");
由于(object)null
强制转换是在此方法中,因此将调用以下方法:
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints)
{
return MapRoute(routes, name, url, defaults, constraints, null /* namespaces */);
}
因为最后一个参数是显式的object
(我们将其转换为)。
如果没有强制转换,则会调用以下方法:
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, string[] namespaces)
{
return MapRoute(routes, name, url, defaults, null /* constraints */, namespaces);
}
所以基本上,演员阵容是为了帮助选择更具体的方法而非特定的方法。
您可以使用更简单的示例自行测试:
public static class TestClass
{
public static void TestMethod(object parameter)
{
}
public static void TestMethod(string[] parameter)
{
}
}
然后致电:
TestClass.TestMethod(null); // will call TestMethod(string[] parameter)
TestClass.TestMethod((object)null); // will call TestMethod(object parameter)
答案 1 :(得分:2)
没有
Visual Studio甚至可能会告诉您显式强制转换是多余的。
答案 2 :(得分:0)
将x设置为null没有区别。
public static void Main()
{
object a = (object)null; // casts null to object basically creating a null object and assigning it to a making it null
object b = null; // directly assigns b the value of null
Console.WriteLine(a == b);
}
将null转换为object时可能会产生可忽略不计的开销,而不是将其设置为null。
https://dotnetfiddle.net/elilu7
进一步确认没有区别,并在System.Web.Mvc.RouteCollectionExtensions.cs中使用OPs引用Microsofts自己的代码,这将增加OP问题的有效性:
//This method cast to object
public static Route MapRoute(this RouteCollection routes, string name, string url)
{
return MapRoute(routes, name, url, null /* defaults */, (object)null /* constraints */);
}
//This method does not
public static Route MapRoute(this RouteCollection routes, string name, string url, string[] namespaces)
{
return MapRoute(routes, name, url, null /* defaults */, null /* constraints */, namespaces);
}