Предупреждение "Защищенный член в запечатанном классе" (одноэлементный класс)
Я реализовал одноэлементный класс и продолжаю получать предупреждение о том, что метод, который я пишу, является "новым защищенным членом, объявленным в классе печати". Это не влияет на сборку, но я не хочу игнорировать предупреждение на случай, если оно вызовет проблемы позже? Я понимаю, что запечатанный класс - это класс, который не может быть унаследован, поэтому его методы не могут быть переопределены, но я до сих пор не понимаю, почему следующий код выдаст мне предупреждение (это связано с использованием одноэлементного дизайна?):
namespace WPFSurfaceApp
{
public sealed class PresentationManager
{
PresentationManager()
{
}
protected void MethodName()
{
}
public static PresentationManager Instance
{
get
{
return Nested.instance;
}
}
class Nested
{
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Nested()
{
}
internal static readonly PresentationManager instance = new PresentationManager();
}
}
РЕДАКТИРОВАТЬ: предупреждение касается метода MethodName(). РЕДАКТИРОВАТЬ: изменить public void MethodName() на защищенный void MethodName()
4 ответа
Предупреждение потому что protected
не имеет смысла в классе, который не может быть унаследован от. Логически будет точно так же, как private
для sealed
учебный класс.
По сути, это не ошибка, но компилятор пытается обратить ваше внимание на то, что protected
вместо private
не даст вам никакой выгоды и, возможно, не будет делать то, что вы хотели (если вы хотели, чтобы это было видно подклассу, который не может существовать в запечатанном классе).
Так что, да, вы можете спокойно проигнорировать это, но логически protected
члены в sealed
учебный класс.
Запись MSDN для предупреждения компилятора CS0628
Это очевидно, потому что это не имеет никакого смысла. Что будет использовать защищенный член, если класс не может быть унаследован
Как говорит MSDN
Типы объявляют защищенные члены, чтобы наследующие типы могли получить доступ или переопределить член. По определению нельзя наследовать от закрытого типа, что означает, что защищенные методы для закрытых типов не могут быть вызваны.
Подумайте о том, когда вы просматриваете код самостоятельно. Вы видите то, что не имеет смысла, насколько вы можете видеть. Есть несколько вероятных возможностей:
- Разработчик сделал что-то глупое.
- Разработчик сделал что-то слишком умное, чтобы его цель была очевидна для вас.
- Разработчик сделал что-то разумное, что больше не имеет смысла из-за изменений, которые произошли в это время.
- Разработчик сделал что-то, что пока не имеет смысла, но будет, если произойдет запланированное изменение.
В первом случае они должны это исправить.
Во втором случае они должны это документировать.
В третьем случае они должны изменить это; это будет иметь мало практического значения, но код будет иметь больше смысла, и он может иметь небольшое преимущество в производительности.
В четвертом случае они должны документировать это на время и либо внести это изменение, либо отказаться от него раньше, чем позже.
В любом случае, вы хотели бы обсудить это с ними.
Здесь то же самое, нет смысла добавлять защищенный член в закрытый класс. Я понятия не имею, почему вы это сделали, и не могу решить, какой из четырех случаев выше применим, но один из них подходит. Предупреждение подчеркивает это. Выполняйте любое из четырех действий в зависимости от того, какой из четырех случаев действует.
Я говорю, что вы играете с C#. Шутки в сторону!!
В статическом классе говорят, что мы не можем объявить защищенные члены, поскольку статические классы не могут быть созданы. Фактически, когда мы пишем защищенные члены в статических классах, это приводит к ошибке во время сборки.
В запечатанном классе он выдаст предупреждение во время сборки. Я думаю, как статические классы, запечатанные классы также должны давать ОШИБКУ, а не ПРЕДУПРЕЖДЕНИЕ. Если эта разница должна быть, то почему?