实现一个非常基本的 IDisposable

Implementing a very basic IDisposable

我想实现一个非常简单的IDisposable
整个想法是测量我的方法的执行时间,它们都是 return a MethodResult。例如

public class MethodResult : IDisposable
{
    private Stopwatch _StopWatch;
    public MethodResult()
    {
        _StopWatch = new Stopwatch();
        _StopWatch.Start();
    }
    public object Result { get; set; }
    public TimeSpan ExecutionTime { get; set; }

    public void Dispose()
    {
        _StopWatch.Stop();
        ExecutionTime = _StopWatch.Elapsed;
    }
}

用法:

static MethodResult TestMehodResult()
{
    using (var result = new MethodResult())
    {
        result.Result = 666;
        Thread.Sleep(1000);
        return result;
    }
}

我的问题很简单:只实现 Dispose() 方法就足够了,还是我应该在我的 class 中实现整个 Dispose pattern
我的 class.

中没有可释放的资源

奖金问题:是否有更好的模式来衡量方法的执行时间,而不是像我那样使用 IDisposable

抱歉,如果这个问题很愚蠢。我是 .net 的新手
提前致谢。

为了忠实于作用域的概念,您可以将结果注入 IDisposable 的构造函数中。使用接口来保持灵活性。我很惊讶没有人提到您的方法中类型安全的损失,我肯定会将泛型类型参数添加到基础 MethodResult class (正如您在评论中提到的那样)。

public interface ITimed
{
    TimeSpan ExecutionTime { get; set; }
}

public class MethodResult<T> : ITimed
{
    public T Result { get; set; }
    public TimeSpan ExecutionTime { get; set; }
}

public class MethodTimer : IDisposable
{
    private readonly Stopwatch _StopWatch;
    private ITimed _result;

    public MethodTimer(ITimed result)
    {
        _result = result;
        _StopWatch = new Stopwatch();
        _StopWatch.Start();
    }

    public void Dispose()
    {
        _StopWatch.Stop();
        _result.ExecutionTime = _StopWatch.Elapsed;
        _result = null;
    }
}

用法

static MethodResult<int> TestMehodResult()
{
    var timedResult = new MethodResult<int>();

    using (var timer = new MethodTimer(timedResult))
    {
        timedResult.Result = 666;
        Thread.Sleep(1000);
    }

    return timedResult;
}

是的,没关系,但我可能会建议 "sealing" class;毫无疑问它是否需要更复杂的 virtual Dispose(bool) API 终结器支持,如果您简单地将其声明为:

public sealed class MethodResult : IDisposable

因为现在:

  • 不能被子class编辑,所以你知道你不需要处理多态性
  • 没有终结器,而且你知道子class没有

所以:非常明确和明显。