Статическое свойство ссылается на нестатический метод - PullRequest
2 голосов
/ 16 апреля 2010

Как статическое свойство может ссылаться на нестатический метод?

Пример:

public static int UserID
{
  get
  {
     return GetUserID();
  }
}

private int GetUserID()
{
  return 1;
}

Когда я пытаюсь это скомпилировать, я получаю сообщение об ошибке: «Ссылка на объект требуется для нестатического поля, метода или свойства« GetUserID () »

Ответы [ 5 ]

11 голосов
/ 16 апреля 2010

Это не работает.

Когда вы определяете статическое свойство (или статический метод), вы определяете свойство, которое работает с классом тип , а не с экземпляром класса.

Свойства и методы экземпляра, с другой стороны, работают с конкретным, созданным экземпляром класса. Чтобы использовать их, вам нужно иметь ссылку на этот конкретный экземпляр. (С другой стороны, все в порядке.)

В качестве примера рассмотрим Fruit и класс "Apple". Скажем, у класса Apple есть свойство экземпляра, определяющее степень зрелости Apple на данный момент.

Вы бы не «Яблоко» описали бы, насколько оно созрело, а скорее конкретное «Яблоко» (экземпляр). С другой стороны, вы можете получить экземпляр яблока и спросить его, содержит ли он семена (которые могут быть определены в самом классе Apple (статический)).

2 голосов
/ 16 апреля 2010

Вам просто нужно создать новый экземпляр:

public static int UserID
{
  get
  {
    return new MyClass().GetUserID()     
  }
}

Ну, вам не нужно создавать новый экземпляр каждый раз, когда вызывается UserId - вместо этого вы можете иметь статическое поле, содержащее экземпляр MyClass (что, конечно, будет подходом к реализации шаблон Singleton ).

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

1 голос
/ 16 апреля 2010

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

Для вашего случая, вы уверены, что вам нужно GetUserID(), чтобы быть методом экземпляра? В любом случае возвращает одно и то же значение. Или, если ваш код просто фиктивный, и вам требуется больше логики в GetUserID(), может, вы скажете нам, что вы собираетесь делать?

0 голосов
/ 16 апреля 2010

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

0 голосов
/ 16 апреля 2010

Просто не может.

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

Попробуйте взглянуть на: http://en.wikipedia.org/wiki/Singleton_pattern

Пример:

public sealed class Singleton
{
    private static readonly Singleton _instance = new Singleton();

    private Singleton() { }

    public static Singleton Instance
    {
        get
        {
            return _instance;
        }
    }

    public static int UserID
    {
        get
        {
            return _instance.GetUserID();
        }
    }

    private int GetUserID()
    {
        return 1;
    }

}
...