C# 使用匿名方法避免创建单一用途对象?

C# 使用匿名方法避免创建单一用途对象?,c#,delegates,anonymous-function,anonymous-methods,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_unde

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

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

var obj = new MyClass(filenameToParse);

var result = obj.Parse();

// Never use 'obj' instance again after this.
出于某种原因,这让我很烦。我可以将MyClass构造函数设置为私有,将Parse更改为静态方法,并使Parse方法新创建一个Parse实例,其作用域为该方法。这将产生如下使用模式:

var result = MyClass.Parse(filenameToParse);
但是MyClass不是一个静态类;我仍然需要在Parse方法中创建一个本地实例

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

当然,我可以通过使ReadNextChunk成为一个静态方法,然后传入所有上下文来完成类似的事情,但我记得,没有一个方法可以访问外部范围


这是一种奇怪而丑陋的方法,还是一种合理的方法?

这可能更适合于代码审查

但是,以下是我对您的设计的评论:

我认为obj实例只使用一次并没有多大关系。如果您对它进行了窃听,有两种方法可以欺骗它:

使用其他方法,例如:

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

我认为最好让MyClass在Parse to Parsestring fileNameToParse中接受参数。它将使MyClass成为一个服务类,使其无状态、可重用和可注入

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


这可能更适合于代码审查

但是,以下是我对您的设计的评论:

我认为obj实例只使用一次并没有多大关系。如果您对它进行了窃听,有两种方法可以欺骗它:

使用其他方法,例如:

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

我认为最好让MyClass在Parse to Parsestring fileNameToParse中接受参数。它将使MyClass成为一个服务类,使其无状态、可重用和可注入

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


您只需要一个创建实例的静态解析方法,就像您在问题中建议的那样

public class MyClass
{
     // your existing code.... but make the members and constructor private.


     public static int Parse(string filenameToParse)
     {
         return new MyClass(filenameToParse).Parse();
     }
}
然后

就像你建议的那样使用它

var result = MyClass.Parse(filenameToParse);

您只需要一个创建实例的静态解析方法,就像您在问题中建议的那样

public class MyClass
{
     // your existing code.... but make the members and constructor private.


     public static int Parse(string filenameToParse)
     {
         return new MyClass(filenameToParse).Parse();
     }
}
然后

就像你建议的那样使用它

var result = MyClass.Parse(filenameToParse);
但是MyClass不是一个静态类;我仍然需要创建一个本地 解析方法中的实例

您不需要静态类就能利用静态方法。例如,这很好:

public class MyClass
{
    public static string DoStuff(string input)
    {
        Console.WriteLine("Did stuff: " + input);
        return "Did stuff";
    }
}

public class Host
{
    public void Main()
    {
        MyClass.DoStuff("something");
    }
}
但是MyClass不是一个静态类;我仍然需要创建一个本地 解析方法中的实例

您不需要静态类就能利用静态方法。例如,这很好:

public class MyClass
{
    public static string DoStuff(string input)
    {
        Console.WriteLine("Did stuff: " + input);
        return "Did stuff";
    }
}

public class Host
{
    public void Main()
    {
        MyClass.DoStuff("something");
    }
}

为什么不是匿名类型?如果方法是静态的,那么您将如何为它编写单元测试?您正在将文件系统与解析器紧密耦合。@Romoku,就像您为任何其他方法编写单元测试一样。静态方法更难的只是模仿它,如果没有理由模仿它,那也不是问题。我想说,创建一个实际上不包含任何有用状态的实例将是设计缺陷;如果方法不需要任何状态,那么它应该是静态的。而且,这个标题有误导性。问题的主体中没有关于匿名的任何内容,这只是一个静态与实例的问题。@Servy他说他可以将ReadNextChunk转换为匿名方法。下面是一个脚本,我认为与您的问题类似。为什么不使用匿名类型?如果该方法是静态的,那么您将如何为其编写单元测试?您正在将文件系统与解析器紧密耦合。@Romoku与编写uni的方式相同
t测试任何其他方法。静态方法更难的只是模仿它,如果没有理由模仿它,那也不是问题。我想说,创建一个实际上不包含任何有用状态的实例将是设计缺陷;如果方法不需要任何状态,那么它应该是静态的。而且,这个标题有误导性。问题的主体中没有关于匿名的任何东西,这只是一个静态与实例的问题。@Servy他说他可以将ReadNextChunk转化为匿名方法。这里有一个来自ScriptCS的例子,我认为与您的问题类似。我理解静态方法。我的观点是,我仍然在使用静态方法中的类实例来跟踪状态。我的问题是,是否有一种优雅的方式来调用静态方法中的代码块,其中该代码可以访问调用方法中的局部变量。为什么不同时使用一个私有静态方法,将您想要访问的变量作为附加参数,让公共方法调用私有方法?我了解静态方法。我的观点是,我仍然在使用静态方法中的类实例来跟踪状态。我的问题是,是否有一种优雅的方式来调用静态方法中的代码块,其中该代码可以访问调用方法中的局部变量。为什么不同时拥有一个私有静态方法,将您想要访问的变量作为附加参数,并让公共方法调用私有方法?