Реализация очень простой IDisposable - PullRequest
1 голос
/ 13 октября 2019

Я хотел бы реализовать очень простую IDisposable.
Вся идея состоит в том, чтобы измерить время выполнения моих методов, которые все они возвращают 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(), или я должен реализовать весь Dispose шаблон в моем классе?
В моем классе нет ресурсов для освобождения.

Дополнительный вопрос: есть ли лучший шаблон для измерения времени выполнения метода вместо использования IDisposable как и я?

Извините, если этот вопрос тупой. Я действительно новичок в .net
Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 13 октября 2019

Чтобы оставаться верным концепции области действия, вы можете ввести свой результат в конструктор IDisposable. Использование интерфейса для обеспечения гибкости. Я удивлен, что никто не упомянул о потере безопасности типов в вашем методе, я бы определенно добавил параметр общего типа в базовый класс MethodResult (как вы упомянули в комментариях).

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;
}
2 голосов
/ 13 октября 2019

Да, это нормально, но я бы, вероятно, посоветовал "запечатать" класс;не может быть и речи о том, нуждается ли он в более сложном virtual Dispose(bool) API, поддержке финализатора, если вы просто объявите его как:

public sealed class MethodResult : IDisposable

, потому что теперь:

  • it не может быть разделенным на подклассы, так что вы знаете, что вам не нужно иметь дело с полиморфизмом
  • это не имеет финализатора, и вы знаете, что подкласс не't

Итак: очень явно и очевидно.

...