Уточнение понимания полей - PullRequest
0 голосов
/ 27 октября 2018

В настоящее время я изучаю C # в Unity через серию видеоуроков, и только что были введены поля. Правильно ли я сказал, что поля - это просто переменные, объявленные на уровне класса?

1 Ответ

0 голосов
/ 27 октября 2018

Да, вы можете сказать это.

Основное отличие состоит в том, что переменные в методах (также называемые локальными переменными) имеют временное значение, используемое во время вызова метода. При следующем вызове метода предыдущее значение переменных будет потеряно, и вам придется снова их инициализировать. (Я не говорю о продвинутых вещах, таких как итераторы и захваченные переменные.)

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

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


Как заметил @elgonzo, есть два типа полей

  • Статические поля. Они объявлены с модификатором static. Статические поля существуют ровно один раз для определенного класса или структуры, независимо от количества объектов этого типа.
  • Поля экземпляра существуют один раз для объекта (то есть экземпляра класса или структуры).

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

* * Пример 1 022. С этим классом ...
public class A
{
    private static int _staticCounter;
    private int _instanceCounter;

    public void Count()
    {
        _staticCounter++;
        _instanceCounter++;
    }

    public void PrintCount()
    {
        Console.WriteLine($"Static = {_staticCounter}, Instance = {_instanceCounter}");
    }

    public static void PrintStatic()
    {
        Console.WriteLine($"Static = {_staticCounter}"); // Can only access static fields.
    }
}

... этот тест ...

A x = new A();
A y = new A();

x.Count();
x.Count();
y.Count();
y.Count();
y.Count();

x.PrintCount();
y.PrintCount();
A.PrintStatic();
Console.ReadKey();

... выводит это на консоль

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