为变量赋值

时间:2011-05-02 14:37:30

标签: c# interface

我有这个变量,它是业务层中类的接口的实例。 我需要从数据访问层发送消息,到业务层,最后到表示层。我的数据访问类“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 个答案:

答案 0 :(得分:3)

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 :(得分:1)

您需要将实现IImageLogBuilder接口的类的实例分配给_imageLogBuilder字段。

现在,您的字段的值始终为null

例如:

private readonly IImageLogBuilder _imageLogBuilder = new ImageLogBuilder();

答案 2 :(得分:1)

或许在构造函数中初始化_imageLogBuilder

public class LogBinaryWriter : ILogBinaryWriter
{
   private readonly IImageLogBuilder _imageLogBuilder;

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


}

答案 3 :(得分:1)

您永远不会设置_imageLogBuilder变量的值。由于您将其标记为readonly,因此可以设置的唯一位置是字段初始值设定项或构造函数。

你是不是也想做这样的事情?

private readonly IImageLogBuilder _imageLogBuilder = // get the value from somewhere else, or make a new one