Поле никогда не назначается и всегда будет иметь значение по умолчанию null

У меня есть следующий класс HandleErrorModule:

public sealed class HandleErrorModule : IHttpModule {
    private static ILogger _logger;
    private static CustomErrorsSection _section;
    private static Dictionary<HttpStatusCode, String> _views;

    private static CustomErrorsSection CustomErrorsSection { 
      get { 
        if (_section != null) 
          return _section;
        else 
          return WebConfigurationManager.GetWebApplicationSection("system.web/customErrors") as CustomErrorsSection; 
      } 
    }

    private static ILogger Logger { 
      get { return (_logger != null) ? _logger : ObjectFactory.GetInstance<ILogger>(); }
    }

    private static Dictionary<HttpStatusCode, String> Views { 
      get { 
        if (_views != null) 
          return _views;
        else
          return new Dictionary<HttpStatusCode, String> { { HttpStatusCode.NotFound, "NotFound_" }, { HttpStatusCode.InternalServerError, "Internal_" } }; 
       } 
    }

    public void Init(HttpApplication application) {

       // Handle error code.
       // Here I access CustomErrorsSection, Logger and Views properties

    }

В получить предупреждение в:

Поле HandleErrorModule._views никогда не назначается и всегда будет иметь значение по умолчанию null Поле HandleErrorModule._section никогда не назначается и всегда будет иметь значение по умолчанию null Поле HandleErrorModule._logger никогда не назначается, и всегда будет иметь значение по умолчанию null

Что я делаю неправильно?


c#
person Miguel Moura    schedule 09.03.2014    source источник
comment
Предупреждения довольно ясны. Вы никогда не присваиваете значения этим переменным, поэтому они всегда будут нулевыми. Это можно исправить, либо присвоив значения переменным, либо полностью удалив их, поскольку они никогда не используются.   -  person David    schedule 09.03.2014
comment
Например, _views — это private, и ни один из ваших private методов или свойств никогда не присваивает ему значение. Поскольку это private, компилятор знает, что никакой другой код также не имеет возможности установить его значение. Таким образом, предупреждения.   -  person Yuck    schedule 09.03.2014


Ответы (2)


Я думаю, вы хотели, чтобы эти статические свойства лениво инициализировали объекты. Однако, как вы это сделали, они никогда не устанавливают частные поля, а продолжают создавать новые объекты. Итак, вы, вероятно, хотели сделать это так:

private static Dictionary<HttpStatusCode, String> Views
{
    get
    {
        // when the private field is null, initialize the value
        if (_views == null)
        {
            _views = new Dictionary<HttpStatusCode, String> {
                    { HttpStatusCode.NotFound, "NotFound_" },
                    { HttpStatusCode.InternalServerError, "Internal_" } };
        }

        // and always return the private field
        return _views;
    } 
}
person poke    schedule 09.03.2014

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

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

person danish    schedule 09.03.2014