У меня есть класс, который реализует С # SerialPort
, который используется для выглядеть следующим образом:Реализация IDisposable правильно на родительских классов в C#
public class AsyncSerial : IDisposable
{
SerialPort newPort; //Parameters declared in my constructor
//Constructor and other methods
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if(disposing)
{
this.Close();
this.Dispose();
}
}
}
Это не бросает никаких предупреждений анализа кода (я получил код от MSDN, как пример того, как это сделать правильно).
Поскольку я только собирался объявить один SerialPort
, я решил, что сделаю мой класс дочерним по отношению к SerialPort
, но теперь я получаю предупреждения, которые я не могу исправить.
public class AsyncSerial : SerialPort
{
//Constructor and other methods
public new void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected new virtual void Dispose(bool disposing)
{
if(disposing)
{
this.Close();
this.Dispose();
}
}
}
предупреждения Кодовые сказал Dispose методы должны быть new
как они скрывают члены, которые я сделал, но я также получаю:
«Предупреждение CA1063 Убедитесь, что 'AsyncSerial.Dispose() объявлен в общественных и запечатаны»
Создание запечатанной означает, что он должен быть отмечен override
(или я получаю ошибки компилятора), что делает его переопределения означает, что он может быть новым, так что я в конечном итоге с:
CS0506 Ошибка 'AsyncSerial.Dispose()': не может переопределить унаследованное элемент 'Component.Dispose()', поскольку он не отмечен виртуальный, аннотация, или переопределить
Я не знаю " правильный "способ реализовать размещение в классе с IDisposable
в родительском классе. Каждый пример, я нахожу только приспосабливает, имеющий IDisposable
в качестве основы, но делает мой класс
public class AsyncSerial : SerialPort, IDisposable
{
//code
}
дает мне предупреждение анализа кода, потому что SerialPort
уже реализует IDisposable
.
Должен ли я просто подавлять предупреждение о том, что «AsyncSerial.Dispose()» объявляется публичным и запечатанным, или есть правильный способ сделать это, что не дает предупреждения о анализе кода.
Встраивание SerialPort в порядке, но вам нужно всего лишь утилизировать его в методе Dispose(), ничего больше и нет необходимости в одноразовом шаблоне. Не стесняйтесь использовать * запечатанный *. Наследование тоже прекрасное, но тогда вам нужно * только * переопределить Dispose (bool) и не наследовать IDisposable. Так как у вас нет ничего лишнего, что не нужно. –