Что MVC3 делает с необязательными параметрами C #? - PullRequest
2 голосов
/ 30 августа 2011

Установите следующий контроллер

public class HomeController : Controller
{
    // GET: /Home/Read    
    public string Read(Sample sample = null)
    {
        if (sample != null)
            Console.WriteLine("Not null");
        else
            Console.WriteLine("null");

        return "";
    }

}
public class Sample
{

}

Образец не ноль .Это ошибка или особенность?

Ответы [ 2 ]

5 голосов
/ 30 августа 2011

Дополнительные параметры реализуются через переписывание call-сайта . Поскольку контроллер будет вызываться с использованием полного списка параметров механизмом MVC, необязательный параметр просто не имеет значения.

Например, с учетом следующей функции:

public void Foo(int bar = 1, int baz = 2)
{
}

Называя это так:

Foo();

Заставляет компилятор интерпретировать его как:

Foo(1, 2);

Не происходит никакого волшебства, при котором вызов остается как Foo(), и тогда сам метод подчиняется параметрам во время выполнения. Параметры добавляются во время компиляции, и больше ничего не нужно делать.

Обновление : чтобы указать MVC, что данный параметр маршрута является необязательным, вы можете установить его на UrlParameter.Optional при определении маршрута. В этот момент должно появиться значение параметра по умолчанию для метода действия.

1 голос
/ 30 августа 2011

Это особенность, а не ошибка.Связыватель видит, что сигнатура метода является единственной, которая имеет смысл (если вы определите ее без параметра, я бы предположил, что он будет вызван вместо этого, или вы получите ошибку «неоднозначный вызов»), и создаст пустой экземпляр, так как нетдоступны параметры строки запроса.Поскольку связующее звено модели делает магию создания вашего экземпляра, а не компилятор здесь, это делает MVC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...