object x = null和object x =(object)null之间有什么区别?

时间:2016-02-12 23:24:27

标签: c# .net

C#中的object x = nullobject x = (object) null之间有什么区别?

修改 - 我个人没有使用过此代码。我想知道MVC路由处理是如何工作的,因此打开DataFrame.plot来理解它并找到它中使用的(object) null。所以想知道区别。

3 个答案:

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