Присвойте значение переменной - PullRequest
0 голосов
/ 02 мая 2011

У меня есть эта переменная, это экземпляр интерфейса класса на бизнес-уровне. Мне нужно отправлять сообщения начиная с уровня доступа к данным, до бизнес-уровня и, наконец, до уровня представления. Я мой класс "LogBinaryWriter" в доступе к данным у меня это:

public class LogBinaryWriter : ILogBinaryWriter
{
   private readonly IImageLogBuilder _imageLogBuilder;

   public void WriteFrameCodes(string filePath, int logSelected)
   {
     var fileExists = FileExists(binaryFilePath);
     if (fileExists == true)
     {
        _imageLogBuilder.displayMessage("The file " + binaryFileName + " exist.             Dou you want overwrite it? (Y/N)");
     }
   }
}

У меня есть сообщение: «значение _imageLogBuilder никогда не назначается и всегда будет нулевым»

Как я могу это исправить?

Ответы [ 4 ]

3 голосов
/ 02 мая 2011

Создайте экземпляр IImageLogBuilder в конструкторе для LogBinaryWriter и присвойте его _imageLogBuilder.Вы должны будете сделать это в конструкторе, так как _imageLogBuilder помечен как readonly.

Например, если у вас есть класс с именем MyImageLogBuilder, который реализует IImageLogBuilder:

public LogBinaryWriter()
{
    _imageLogBuilder = new MyImageLogBuilder();
}

Вы также можете перегрузить конструктор, чтобы вы могли передать IImageLogBuilder, который вы хотите использовать (поиск в конструкторе поиска для получения дополнительной информации об этом шаблоне):

public LogBinaryWriter(IImageLogBuilder imageLogBuilder)
{
    _imageLogBuilder = imageLogBuilder;
}

Помните, вам понадобитсякласс, который реализует интерфейс IImageLogBuilder, чтобы иметь возможность создавать новый экземпляр и назначать его переменной _imageLogBuilder.Например:

public interface IImageLogBuilder
{
    void Log(string message);
}

//The class below IMPLEMENTS the IImageLogBuilder interface
public class MyImageLogBuilder : IImageLogBuilder
{
   //Implement IImageLogBuilder methods here
   public void Log(string message)
   {
      //Log message
   }
}

Если у вас есть что-то похожее на классы, определенные выше, вы можете выполнить следующее в конструкторе LogBinaryWriter, и вы больше не получите ошибку нулевой ссылки.

public LogBinaryWriter()
{
    _imageLogBuilder = new MyImageLogBuilder();
}
1 голос
/ 02 мая 2011

Вы никогда не устанавливаете значение переменной _imageLogBuilder.И поскольку вы пометили его как readonly, единственное место, которое можно установить, - это инициализатор поля или конструктор.

Возможно, вы хотели что-то подобное сделать?

private readonly IImageLogBuilder _imageLogBuilder = // get the value from somewhere else, or make a new one
1 голос
/ 02 мая 2011

возможно инициализировать _imageLogBuilder в конструкторе?

public class LogBinaryWriter : ILogBinaryWriter
{
   private readonly IImageLogBuilder _imageLogBuilder;

   public LogBinaryWriter(IImageLogBuilder imageLogBuilder)
   {
      _imageLogBuilder = imageLogBuilder;
   }
....


}
1 голос
/ 02 мая 2011

Вам необходимо назначить экземпляр класса, который реализует интерфейс IImageLogBuilder, для поля _imageLogBuilder.

Прямо сейчас ваше поле всегда будет иметь значение null.

Например:

private readonly IImageLogBuilder _imageLogBuilder = new ImageLogBuilder();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...