2013-11-11 2 views
-1

У меня проблема с примером моей книги. Из того, что я прочитал, не статические методы не могут использоваться без экземпляра объекта класса. Так все в порядке?C# static method

public partial class TempAgencyForm : Form 
{ 
    public TempAgencyForm() 
    { 
     InitializeComponent(); 
    } 

    private void btnCalculate_Click(object sender, EventArgs e) 
    { 
     ... 
     setVisibility(false); 
    } 

    private void setVisibility(bool visibilityValue) 
    { 
     ... 
    } 
} 
+4

Это действительно непонятно, что ваш вопрос здесь. –

+0

Я вижу 'static' один раз в вашем заголовке, один раз в вашем повествовании вопроса, а вовсе не в вашем примере кода. Не совсем понятно, что вы пытаетесь спросить. –

+0

Быстрый компилятор ответил бы на это, нет? –

ответ

4

Да, это прекрасно. Один нестатический метод может вызвать другой нестатический метод.

Вызов:

setVisibility(false); 

также может быть написано:

this.setVisibility(false); 

но this классификатор является излишним.

Однако, если бы вы попытались вызвать нестатический метод без квалификации экземпляра внутри члена static, что бы была проблема (ошибка во время компиляции).

+0

* Один нестатический метод может вызывать другой нестатический метод. * - Это немного чрезмерно общее, не так ли? – Groo

+0

@Groo Можете ли вы уточнить? Я пытаюсь дать detalis о том, что я имею в виду в тексте, следующем за этой строкой. –

+0

Да, нестатический метод может вызвать нестатический метод. Но нестатический метод * внутри одного класса * или * нестатический метод уже созданного объекта *. «Нестатический» метод, открытый или нет, не может быть вызван нигде, если не создан экземпляр этого класса. Между тем статический метод также может легко вызвать метод общедоступного экземпляра любого экземпляра объекта (или метод частного экземпляра его собственного родительского класса, если он его создает). И метод экземпляра может легко вызвать любой публичный статический метод или частный статический метод его собственного родительского класса. – Groo

3

Я предполагаю, что вы говорите о звонке setVisibility(false);. Да, это нормально, ни он, ни метод, вызывающий его, не являются статическими.

Это все произойдет внутри экземпляра TempAgencyForm

1

Да, это нормально, потому что он вызван изнутри другого члена.

Вы правы, так как setVisibility() не static, он всегда должен вызываться в контексте некоторого объекта родительского класса (TempAgencyForm в этом примере).

Однако btnCalculate_Click() является еще одним членом TempAgencyForm, как таковой вы сможете получить доступ к текущему/локальный объект, используя ключевое слово this (this.setVisibility()), который является необязательным, если нет disambiguity.

0

Статический или нестатический не имеет значения здесь, вы вызываете функцию-член, объявленную внутри одного и того же объекта. так короткий ответ «отлично»

, как вы называете членов TempAgencyForm может быть то, что вы имеете в виду

в этом случае (как вы определили) инстанциацию требуется

TempAgencyForm taf = new TempAgencyForm() 
taf.setVisibility(false); 

однако если у вас есть ваше определение класса себя как статическими, т.е.

public static partial class TempAgencyForm 

затем,

TempAgencyForm.setVisibility(false); 

является хватай (без создания объекта), как объект уже загружен в стек в момент запуска приложения,

+1

Статический класс не может иметь никакого другого базового класса, чем 'object' (и не может реализовывать никаких интерфейсов), поэтому ваша декларация' static class' является незаконной. –

+0

согласен и + 1 ошибка с закрытой копией копии (исправлено сейчас) – Krishna