2016-02-12 3 views
0

В чем разница между object x = null и object x = (object) null в C#?В чем разница между объектом x = null и объектом x = (object) null?

Редактировать - Я лично не использовал этот код. Я хотел знать, как работает обработка маршрута MVC, так что он открыл this, чтобы понять его и нашел в нем (object) null. так что хотите знать разницу.

+0

Вы заметили разницу при запуске и код? – Eser

+0

Eser Я отредактировал вопрос, чтобы добавить более подробную информацию. – RAM

+0

Я не знаю, почему кто-то проголосовал за этот вопрос. Я не знаю разницы, если нет никакой разницы, почему MVC-инфраструктура отличает null от объекта? – RAM

ответ

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) 
2

Ничего.

Visual Studio, вероятно, даже скажет вам, что явный листинг является избыточным.

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

При отливке нулевого объекта в объект может быть незначительное накладные расходы, а не просто устанавливать его на нуль.

https://dotnetfiddle.net/elilu7

Для дальнейшего подтверждения, что нет никакой разницы, и использование ФОС ссылка на Microsofts собственного кода в System.Web.Mvc.RouteCollectionExtensions.cs, который бы добавить валидность OPS вопрос:

//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); 
}