实现一个非常基本的 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没有
所以:非常明确和明显。
我想实现一个非常简单的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没有
所以:非常明确和明显。