c# - 使用匿名方法来避免创建一次性对象?

标签 c# delegates anonymous-function anonymous-methods

我正在尝试重构一个解析文件的方法。为了支持任意大小的文件,该方法使用具有固定缓冲区的分块方法。

public int Parse()
{
    // Get the initial chunk of data
    ReadNextChunk();

    while (lengthOfDataInBuffer > 0)
    {
       [parse through contents of buffer]

       if (buffer_is_about_to_underflow)
          ReadNextChunk();
    }

    return result;
}

上面的伪代码是类中唯一公共(public)非静态方法的一部分(构造函数除外)。该类的存在只是为了封装在解析文件时必须跟踪的状态。此外,一旦在类上调用了此方法,就不能/不应该再次调用它。所以使用模式如下所示:

var obj = new MyClass(filenameToParse);

var result = obj.Parse();

// Never use 'obj' instance again after this.

出于某种原因,这让我很烦恼。我可以将 MyClass 构造函数设为私有(private),将 Parse 更改为静态方法,并让 Parse 方法新建一个作用域为该方法的 Parse 实例。这将产生如下的使用模式:

var result = MyClass.Parse(filenameToParse);

MyClass 不是一个静态类;我仍然需要在 Parse 方法中创建一个本地实例。

因为这个类只有两个方法; Parse 和(私有(private))ReadNextChunk,我想知道通过将 ReadNextChunk 逻辑作为匿名方法嵌入 Parse 中,将 Parse 编写为单个静态方法是否会更干净。状态的其余部分可以作为局部变量而不是成员变量进行跟踪。

当然,我可以通过将 ReadNextChunk 设置为静态方法,然后传入所有上下文来完成类似的操作,但我记得 anon 方法可以访问外部作用域。

这是奇怪和丑陋的,还是一个合理的方法?

最佳答案

这可能更适合代码审查。

但是,这些是我对您的设计的评论:

  1. 我认为 obj 实例只使用一次并不重要。如果你被它欺骗了,有两种方法可以欺骗它:

    • 使用另一种方法,例如:

      public int Parse()
      {
          var obj = new MyClass(filenameToParse);
          return obj.Parse();
      }
      
    • 使MyClass实现IDisposable并将其包装在using语句中。我不建议这样做,因为 IDisposable 通常在其 Dispose() 方法中具有逻辑

  2. 我认为最好让您的 MyClass 接受 Parse 中的参数到 Parse(string fileNameToParse)。它将把 MyClass 作为一个服务类,使其无状态、可重用和可注入(inject)。

  3. 关于对静态类的影响。首先,它在您的消费者和 MyClass 之间添加耦合。有时,如果您想在不使用 MyClass 解析器的情况下测试/单元测试 consumer,则很难/不可能将 MyClass 模拟成某种东西你想要的。

关于c# - 使用匿名方法来避免创建一次性对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17560852/

相关文章:

C# WebClient 返回损坏的非英语文本

c# - 重构方法调用具有不同参数签名的委托(delegate)

swift macOS - 自定义 NSCollectionViewDelegate 不会被调用

c# - 如何理解这个任务需要什么

javascript - "Self Invoking Anonymous Functions"的用途

javascript - 异步地理定位 API 和 jQuery 延迟对象

php - PHP preg_replace_callback()编译失败: missing )

c# - 多对多(自相关)特定订单 Entity Framework

c# - 最小 API - 如何在静态类中使用 ILogger

c# - JS 中 C# var 的 asp.net 值