Не удается прочитать константу в экземпляре класса?
Я был слегка удивлен, когда компилятор жаловался на это:
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;
работает нормально. Мне просто интересно, что за этим стоит задуматься? У меня есть экземпляр открытого класса с общедоступной константой на нем, почему я не могу получить данные таким образом?
Ответы
Ответ 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 тоже не может.