Подтвердить что ты не робот

Не удается прочитать константу в экземпляре класса?

Я был слегка удивлен, когда компилятор жаловался на это:

public class UsefulClass
{
    public const String RatingName = @"Ratings\rating";
}

public class OtherClass
{
    public void SomeFunc()
    {
        UsefulClass useful = new UsefulClass();
        String rating = useful.RatingName;
    }
}

Компилятор говорит: "Статический член не может быть доступен с помощью ссылки на экземпляр, вместо этого используйте его с именем типа"

Это не проблема, String rating = UsefulClass.RatingName; работает нормально. Мне просто интересно, что за этим стоит задуматься? У меня есть экземпляр открытого класса с общедоступной константой на нем, почему я не могу получить данные таким образом?

4b9b3361

Ответ 1

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

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

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

Ответ 2

"переменная", отмеченная const, является конструкцией времени компиляции, а не членом экземпляра. Вы можете получить к нему доступ, как если бы вы статическую переменную:

public void SomeFunc()
{
    UsefulClass useful = new UsefulClass();
    String rating = UsefulClass.RatingName; // Access as if static
}

При этом я лично перенес его в свойство, если оно предназначено для использования, как вы описали, например:

public class UsefulClass
{
    private const string ratingName = @"Ratings\rating";

    public string RatingName { get { return ratingName; } }
}

Это заставило бы ваш синтаксис работать, но также был бы лучшим дизайном, IMO, поскольку он не публиковал ваши константы публично.

Ответ 3

Потому что const в С# неявно статического типа. И как статические члены могут быть доступны только на члене класса, а не на экземпляре, const тоже не может.