对象 x = null 和对象 x = (对象) null 有什么区别

本文关键字:对象 null 什么 区别 | 更新日期: 2023-09-27 18:34:28

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

编辑 - 我没有亲自使用过这段代码。我想知道 MVC 路由处理的工作原理,所以打开它来理解它并找到(object) null在其中使用。所以想知道区别。

对象 x = null 和对象 x = (对象) null 有什么区别

在您提供的特定示例中(为什么在 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)

什么都没有。

Visual Studio甚至可能会告诉你显式强制转换是多余的。

两者都将 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 强制转换为对象时,开销可能可以忽略不计,而不是仅将其设置为 null。

https://dotnetfiddle.net/elilu7

为了进一步确认没有区别,并在System.Web.Mvc.RouteCollectionExtensions.cs中使用对Microsoft自己的代码的OP引用,这将增加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);
}