Предупреждение «Защищенный член в запечатанном классе» (класс синглтона) - PullRequest
6 голосов
/ 11 января 2012

Я реализовал одноэлементный класс и продолжаю получать предупреждение о том, что метод, который я пишу, является «новым защищенным членом, объявленным в классе печати». Это не влияет на сборку, но я не хочу игнорировать предупреждение на случай, если оно вызовет проблемы позже? Я понимаю, что запечатанный класс - это класс, который не может быть унаследован - поэтому его методы не могут быть переопределены, но я до сих пор не понимаю, почему следующий код выдаст мне предупреждение (это связано с использованием одноэлементного дизайна?):

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 ]

15 голосов
/ 11 января 2012

Предупреждение связано с тем, что protected не имеет смысла в классе, который не может быть унаследован от.По логике он будет точно таким же, как private для класса sealed.

Само по себе это не ошибка, но компилятор пытается привлечь ваше внимание к тому факту, что создание protected вместо private не даст вам никакой выгоды и, возможно, не будет выполнять то, что вы хотели(если вы намеревались сделать его видимым для подкласса, который не может существовать в запечатанном классе).

Итак, да, вы можете спокойно его игнорировать, но логически непоследовательно иметь protectedчлены класса sealed.

MSDN-запись для Предупреждение компилятора CS0628

4 голосов
/ 11 января 2012

Это очевидно, потому что это не имеет никакого смысла.Что будет использоваться защищенным членом, если класс не может быть унаследован,По определению нельзя наследовать от закрытого типа, что означает, что защищенные методы для закрытых типов не могут быть вызваны.

2 голосов
/ 11 января 2012

Подумайте о том, когда вы пересматриваете код самостоятельно. Вы видите то, что не имеет смысла, насколько вы можете видеть. Есть несколько вероятных возможностей:

  1. Разработчик сделал что-то глупое.
  2. Разработчик сделал что-то слишком умное, чтобы его цель была очевидна для вас.
  3. Разработчик сделал что-то разумное, что больше не имеет смысла из-за изменений, произошедших за это время.
  4. Разработчик сделал что-то, что пока не имеет смысла, но будет, если произойдет запланированное изменение.

В первом случае они должны это исправить.

Во втором случае они должны это задокументировать.

В третьем случае они должны изменить его; это мало что даст на практике, но код будет иметь больше смысла, и он может иметь некоторое незначительное преимущество в производительности.

В четвертом случае они должны документировать это на время и либо внести это изменение, либо отказаться от него раньше, чем позже.

В любом случае, вы хотели бы обсудить это с ними.

Здесь то же самое, нет смысла добавлять защищенный член в закрытый класс. Я не знаю, почему вы это сделали, и не могу решить, какой из четырех случаев выше применим, но один из них подходит. Предупреждение подчеркивает это. Выполняйте любое из четырех действий в зависимости от того, какой из четырех случаев действует.

0 голосов
/ 04 августа 2012

Я говорю, что вы играете с C #. Серьезно !!
В статическом классе говорят, что мы не можем объявить защищенные члены, поскольку статические классы не могут быть созданы. Фактически, когда мы пишем защищенные члены в статических классах, это приводит к ошибке во время сборки.
В запечатанном классе, он будет выдавать предупреждение во время сборки. Я думаю, как статические классы, запечатанные классы также должны давать ОШИБКУ, а не ПРЕДУПРЕЖДЕНИЕ. Если эта разница должна быть, то почему?

...