Да, вы можете сказать это.
Основное отличие состоит в том, что переменные в методах (также называемые локальными переменными) имеют временное значение, используемое во время вызова метода. При следующем вызове метода предыдущее значение переменных будет потеряно, и вам придется снова их инициализировать. (Я не говорю о продвинутых вещах, таких как итераторы и захваченные переменные.)
С другой стороны, переменные в классах и структурах, то есть поля , живут до тех пор, пока живет объект. Т.е. они сохраняют свое значение между вызовами методов.
В отличие от локальных переменных, которые сначала не определены, полям присваивается значение по умолчанию, когда объект создается из класса. Поля структуры ведут себя по-разному в зависимости от того, используется ли структура в качестве поля класса или переменной. Поля структуры имеют то же значение, что и поле или переменная, их определяющая.
Как заметил @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