2014-12-14 1 views
0

Я прочитал много статей о статических полях, которые ** «Статические методы не имеют доступа к полям, которые являются полями экземпляра, поскольку поля экземпляра существуют только в экземплярах типа». **Статические методы не могут использовать поля экземпляра запроса?

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

Здесь Вы можете найти код,

class Program 
{ 
    static void Main(string[] args) 
    { 

    } 
} 

class clsA 
{ 
    int a = 1; 
    //Static methods have no way of accessing fields that are instance fields, 
    //as instance fields only exist on instances of the type. 
    public static void Method1Static() 
    { 
     //Here we can create and also access instance fields which we have declared inside the static method 
     int b = 1; 

     //a = 2; We get an error when we try to acces instance varible outside the static method 
     //An object reference is required for the non-static field, method, or property ' 


     Program pgm = new Program(); 
     //Here we can create and also access instance fields by creating the instance of the concrete class 
     clsA obj = new clsA(); 
     obj.a = 1; 
    } 
} 

Это правда «Мы могу получить доступ НЕРАСПРОСТРАНЕНИЯ статических полей внутри статического метода»?

Другой вопрос Если мы объявим класс clsA как статический класс, даже в то время мы не получаем никакой ошибки компиляции, если объявляем поля экземпляра внутри статического метода?

Где я ошибаюсь?

ответ

1

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

Ваш b не является полем экземпляра, это обычная локальная переменная.

Приведенное вами предложение означает, что вы не можете делать то, что вы пробовали в строке, которую вы закомментировали: вы не можете получить доступ к a без экземпляра. Нестатические методы используют this в качестве экземпляра по умолчанию, поэтому вы можете получить доступ к a, просто написав a = 17;, что эквивалентно this.a = 17;

+0

Я согласен. Кроме того, если вы объявляете свой класс clsA статичным, вы не можете создать его с помощью нового ключевого слова, чтобы строка была неудачной. –

+0

Благодаря nvoidgt, вы имеете в виду, что поле экземпляра - это поля, которые создаются с использованием новой переменной (исправьте меня, если я ошибаюсь). Итак, наконец, мы можем сказать, что если вам нужно получить доступ к полям экземпляра какого-либо конкретного класса в статическом методе нестатического класса, мы должны создать экземпляр этого класса? –

+0

Нет, поля экземпляра - это переменные, объявленные внутри класса, но не внутри метода. Интернет действительно не является хорошим средством для объяснения этого, вы можете захотеть получить хорошую книгу ООП и прочитать первые главы. В вашей местной библиотеке будут некоторые. – nvoigt