Ссылка на объект требуется для нестатического поля, метода или свойства - PullRequest
0 голосов
/ 10 августа 2011

Привет всем, я новичок в C #, и я пытаюсь вызвать функцию closeComm () примерно так:

    public void closeComm()
    {
        commIRToy.ClosePort();
        commProj.ClosePort();
        commTV.ClosePort();
        commAV.ClosePort();
    }

    public static void loadAnotherRemote()
    {
        closeComm();
    }

Однако, это дает мне ошибку:1006 * Ссылка на объект требуется для нестатического поля, метода или свойства

Когда я пытаюсь сделать это следующим образом:

    public static void closeComm()
    {
        commIRToy.ClosePort();
        commProj.ClosePort();
        commTV.ClosePort();
        commAV.ClosePort();
    }

    public static void loadAnotherRemote()
    {
        closeComm();
    }

Я могу вызватьфункция, но все commIRToy, commProj, commTV и commAV имеют ошибку Ссылка на объект требуется для нестатического поля, метода или свойства Та же ошибка, что и у меня ....

Ответы [ 6 ]

3 голосов
/ 10 августа 2011

Вам нужно будет сделать поля commIRToy, commProj, commTV и commAV статическими или удалить ключевое слово static из метода loadAnotherRemote.

1 голос
/ 10 августа 2011

Краткий ответ:

Попробуйте:

public static void loadAnotherRemote()
{
    new TypeThatContainsCloseComm(…).closeComm();
}

Более длинный ответ:

Прежде всего, вынеобходимо понимать static: все, что объявлено static, не принадлежит ни к какому конкретному экземпляру типа, но относится к самому типу .То есть, если у вас есть статический метод TypeThatContainsCloseComm.closeComm, вы можете вызвать его с помощью:

   TypeThatContainsCloseComm.closeComm(…)
// ^^^^^^^^^^^^^^^^^^^^^^^^^^
//     name of the type!

Однако все методы, которые не объявлены static, могут быть вызваны только для определенного экземпляр , потому что это то, к чему они принадлежат:

   var commProj = new TypeThatContainsClosePort();  // <- create a instance here
   commProj.ClosePort();
// ^^^^^^^^
// instance of a type!

Теперь вернемся к исходному коду:

public void closeComm()
{
    commIRToy.ClosePort();
    commProj.ClosePort();
    commTV.ClosePort();
    commAV.ClosePort();
}

public static void loadAnotherRemote()
{
    // this method is static, therefore we are not "within" an object instance
    closeComm();  // ERROR: closeComm is not static, therefore you need
                  // some object instance to call it!
}

… и вернемся ко второй попытке:

public static void closeComm()
{
    commIRToy.ClosePort();  // ERROR if commIRToy, commProj, commTV, commAV
    commProj.ClosePort();   //       are not declared static, because we're
    commTV.ClosePort();     //       in a static method and thus "outside" an
    commAV.ClosePort();     //       object instance, yet these fields are
}                           //       declared within one.

public static void loadAnotherRemote()
{
    closeComm();  // this call is fine now, since `closeComm` is static,
                  // no object instance is required to call it.
}
1 голос
/ 10 августа 2011

Вы получаете первую ошибку, потому что loadAnotherRemote() является статическим, но пытается вызвать метод, который не является статическим.Вы получаете вторую ошибку, поскольку при вызове статического метода переменные commIrTroy и т. Д. Являются экземплярами класса, а не статичны.Трудно дать вам ответ, потому что я не уверен в контексте этих методов.

1 голос
/ 10 августа 2011

A нестатический метод работает с конкретным экземпляром класса. При доступе к переменным-членам он обращается к членам экземпляра, из которого он был вызван. Метод static не требует вызова какого-либо конкретного экземпляра. Поскольку он не вызывается через экземпляр, он не может ссылаться на какие-либо переменные, специфичные для экземпляра, только на статические переменные.

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

Это означает, что вы должны добавить слово static перед объявлениями commIRToy и т. Д .:

static PCComm.CommunicationManager commIRToy = new PCComm.CommunicationManager();

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

0 голосов
/ 10 августа 2011

C # Спецификации:

10.6.2 Статический и экземплярный методы

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

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

MSDN:

Статические члены

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

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

С уважением, Максим

0 голосов
/ 10 августа 2011

A static метод выполняется в контексте класса.Вы можете вызвать classname.StaticMethod() в любое время, потому что компилятор понимает это однозначно.

Когда вы опускаете static, вы определяете метод, который выполняется в контексте объекта (экземпляра класса),обычно создается с использованием new classname();.

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

Вы можете вызвать static метод from и метод instance, но не наоборот, если только у вас нет объекта для контекста.

Если вам нужно вызвать closeComm() в контексте определенного объекта (возможно, потому что у вас многоэкземпляры), метод loadAnotherRemote() нуждается в ссылке на объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...