C# 实现一个非常基本的IDisposable

C# 实现一个非常基本的IDisposable,c#,.net,idisposable,C#,.net,Idisposable,我想实现一个非常简单的IDisposable。 整个想法是测量我的方法的执行时间,它们都返回MethodResult。e、 g 用法: static MethodResult TestMehodResult() { using (var result = new MethodResult()) { result.Result = 666; Thread.Sleep(1000); return result; } } 我的问

我想实现一个非常简单的IDisposable。 整个想法是测量我的方法的执行时间,它们都返回MethodResult。e、 g

用法:

static MethodResult TestMehodResult()
{
    using (var result = new MethodResult())
    {
        result.Result = 666;
        Thread.Sleep(1000);
        return result;
    }
}
我的问题很简单:对于这种情况,只实现Dispose方法就足够了,还是应该在类中实现整个方法? 在我的班上没有可供使用的资源

附加问题:有没有更好的模式来衡量方法的执行时间,而不是像我一样使用IDisposable

对不起,如果这个问题是愚蠢的。我对.net真的很陌生
提前感谢。

为了忠实于范围的概念,您可以将结果注入IDisposable的构造函数中。使用接口使事情保持灵活。我很惊讶没有人在方法中提到类型安全性的损失,我肯定会在注释中提到泛型类型参数时将其添加到基本MethodResult类中

公共接口ITimed { TimeSpan ExecutionTime{get;set;} } 公共类方法结果:ITimed { 公共T结果{get;set;} 公共TimeSpan执行时间{get;set;} } 公共类MethodTimer:IDisposable { 私人只读秒表(Stopwatch);; 私人ITimed_结果; 公共方法时标结果 { _结果=结果; _秒表=新秒表; _秒表,开始; } 公共空间处置 { _秒表,停; _result.ExecutionTime=\u StopWatch.appeased; _结果=空; } } 用法

静态方法结果测试方法结果 { var timedResult=新方法结果; 使用var timer=newmethodTimerTimedResult { timedResult.Result=666; 线程1000; } 返回时间结果; }
为了忠实于范围的概念,可以将结果注入IDisposable的构造函数中。使用接口使事情保持灵活。我很惊讶没有人在方法中提到类型安全性的损失,我肯定会在注释中提到泛型类型参数时将其添加到基本MethodResult类中

公共接口ITimed { TimeSpan ExecutionTime{get;set;} } 公共类方法结果:ITimed { 公共T结果{get;set;} 公共TimeSpan执行时间{get;set;} } 公共类MethodTimer:IDisposable { 私人只读秒表(Stopwatch);; 私人ITimed_结果; 公共方法时标结果 { _结果=结果; _秒表=新秒表; _秒表,开始; } 公共空间处置 { _秒表,停; _result.ExecutionTime=\u StopWatch.appeased; _结果=空; } } 用法

静态方法结果测试方法结果 { var timedResult=新方法结果; 使用var timer=newmethodTimerTimedResult { timedResult.Result=666; 线程1000; } 返回时间结果; }
是的,那很好,但我可能会建议封班;如果您将其声明为:

公共密封类MethodResult:IDisposable 因为现在:

它不能被子类化,所以你知道你不需要处理多态性 它没有终结器,您知道子类没有终结器
所以:非常明确和明显。

是的,这很好,但我可能会建议密封类;如果您将其声明为:

公共密封类MethodResult:IDisposable 因为现在:

它不能被子类化,所以你知道你不需要处理多态性 它没有终结器,您知道子类没有终结器
所以:非常明确和明显。

不,这不是一个好方法。它将根据您的需要发挥作用,但会让每个人感到困惑。处置一个对象应该会使它变得无用,但你是在返回之前处置它。与之相比,这感觉更加合理。较长形式的标准Microsoft模式有两个主要优点。a它处理非托管资源。b它处理继承。您也不需要,因此您的表单对于您的目的来说很好@GSerg正确地质疑您是否应该使用Dispose——我的评论纯粹是将您的代码与较长的形式进行比较——我不是说您应该或不应该使用Dispose,而是返回结果;考虑返回结果。其中SomeProperty提供了必要的数据。这允许您使用Dispose模式,但处理了@GSerg的主要和有效问题。拥有一个对象并不是非法的,而是在被处置后继续使用它的奇怪/非标准的。但这正是您正在做的——您的TestMehodResult方法处理它,然后返回它。它会起作用,但很奇怪。解决方案是将当前类分为两个类。新的类将有结果和结果
ExecutionTime属性。然后使用return result.YourNewPropertyWhichPopulatesYourNewClass;而不是返回结果;。虽然像这样使用一次性用品的方式很不寻常,但这不会是一个问题,我也曾经创造过一个类似的例子。这里令人困惑的是这个MethodResult类,它实际上是一个度量范围,而不是一个方法的结果。如果该方法无效怎么办?或者,如果没有测量一种方法?我称之为MeasureOperation,但它没有公开为公共类型。请随意使用或调查链接下的源代码。不,这不是一个好方法。它将根据您的需要发挥作用,但会让每个人感到困惑。处置一个对象应该会使它变得无用,但你是在返回之前处置它。与之相比,这感觉更加合理。较长形式的标准Microsoft模式有两个主要优点。a它处理非托管资源。b它处理继承。您也不需要,因此您的表单对于您的目的来说很好@GSerg正确地质疑您是否应该使用Dispose——我的评论纯粹是将您的代码与较长的形式进行比较——我不是说您应该或不应该使用Dispose,而是返回结果;考虑返回结果。其中SomeProperty提供了必要的数据。这允许您使用Dispose模式,但处理了@GSerg的主要和有效问题。拥有一个对象并不是非法的,而是在被处置后继续使用它的奇怪/非标准的。但这正是您正在做的——您的TestMehodResult方法处理它,然后返回它。它会起作用,但很奇怪。解决方案是将当前类分为两个类。新类将具有Result和ExecutionTime属性。然后使用return result.YourNewPropertyWhichPopulatesYourNewClass;而不是返回结果;。虽然像这样使用一次性用品的方式很不寻常,但这不会是一个问题,我也曾经创造过一个类似的例子。这里令人困惑的是这个MethodResult类,它实际上是一个度量范围,而不是一个方法的结果。如果该方法无效怎么办?或者,如果没有测量一种方法?我称之为MeasureOperation,但它没有公开为公共类型。请随意使用或调查链接下的来源。谢谢。这基本上是我在读了@GyörgyKőszeg的评论后开始做的。为什么需要MethodTimer.Dispose方法中的_result=null?它不会将结果设置为null吗?@zig该结果将比计时器寿命长,因此我们不会处理其引用的双关语,以尽快将计时器标记为垃圾收集。将其设置为null是不必要的,在这里没有任何好处。如果使用using模式,则在调用Dispose的同时计时器实例将超出作用域,因此GC已经知道计时器可以被释放,并且不再持有对_结果的引用。将其设置为null是不必要的,在这里没有任何好处。如果MethodTimer具有较长的生命周期(例如,不在函数范围内),则它具有优势。我同意@Funk在这里的实现——将其设置为null没有任何坏处。这通常不会有帮助,但有时会。谢谢。这基本上是我在读了@GyörgyKőszeg的评论后开始做的。为什么需要MethodTimer.Dispose方法中的_result=null?它不会将结果设置为null吗?@zig该结果将比计时器寿命长,因此我们不会处理其引用的双关语,以尽快将计时器标记为垃圾收集。将其设置为null是不必要的,在这里没有任何好处。如果使用using模式,则在调用Dispose的同时计时器实例将超出作用域,因此GC已经知道计时器可以被释放,并且不再持有对_结果的引用。将其设置为null是不必要的,在这里没有任何好处。如果MethodTimer具有较长的生命周期(例如,不在函数范围内),则它具有优势。我同意@Funk在这里的实现——将其设置为null没有任何坏处。它通常不会有帮助,但有时会。但如果它需要被分类,但没有资源可以免费使用呢?在我的测试中,我看到Dispose在子类后代中被很好地调用。@zig如果它可以被外部类型子类化,那么基类不知道没有资源(托管或非托管)可以释放,它不应该对派生类了解太多。在这种情况下,我将使用受保护的虚拟处置库处置方法。如果它只能被你控制中的事物子类化,即它是一个内部类型或只有内部构造函数:那么当然,你可以欺骗并使用你拥有的额外知识,但是如果它需要子类化,但没有资源可以释放呢?在我的测试中,我看到Dispose在子类后代中被很好地调用。@zig如果它可以被外部类型子类化,那么基类就不知道没有资源(托管的或非托管的)可以释放,它不应该对派生类了解太多 s在这种情况下,我将使用受保护的虚拟处置库处置方法。如果它只能被你控制中的事物子类化,即它是一个内部类型或只有内部构造函数:那么当然,你可以欺骗并使用你拥有的额外知识
static MethodResult TestMehodResult()
{
    using (var result = new MethodResult())
    {
        result.Result = 666;
        Thread.Sleep(1000);
        return result;
    }
}