Данные в C# хранятся в переменных соответствующего типа.
C# является языком со строгой типизацией - значит, компилятор гарантирует, что
переменная всегда имеет значение своего типа.
В C# определено 7 типов переменных: статические,
экземплярные,
элементы массивов. пераметры передаваемые по значению, выходные параметры и локальные
переменные:
Статическими переменными являются поля класса, объявленные
с ключевым словом static. Их значение является общим для всех экземпляров
класса. Поясним сказанное на примере:
using System;
namespace StaticVariables
{
///
/// Класс Singleton реализует шаблон Singleton (одиночка).
/// Этот шаблон позволяет ограничивать количество
/// экземпляров класса одним и обеспечивает к нему доступ.
///
///
class Singleton
{
///
/// Хранит единственный экземпляр класса
///
private static Singleton _instance;
// Обеспечивает доступ к этому экземпляру
public static Singleton Instance
{
get
{
// Если экземпляр не был создан, создаем его
if (_instance == null)
_instance = new Singleton();
return _instance;
}
}
///
/// Объявляем конструктор закрытым, чтобы не допустить создание
/// дополнительных экзепляров
///
private Singleton()
{
}
///
/// Стандартный hello, world!
///
public void HelloWorld()
{
Console.WriteLine("Hello, world");
}
}
public class Application
{
public static void Main()
{
Singleton singleton = Singleton.Instance;
singleton.HelloWorld();
}
}
}
В этом примере для доступа к статическому члену не нужно создавать
экземпляра класса.
Экземплярные переменные - это поля класса, значения
которых для каждого экземпляра индивидуальны.
using System;
namespace InstanceVariables
{
///
/// Этот класс хранит имя мужчины
///
class Man
{
///
/// Хранит обращение - общее для всех экземапляров
///
private static string _prefix = "Mr.";
///
/// Хранит имя каждого отдкльного мужчины
///
public string _name;
///
/// Создает мужчину с заданным именем
///
/// Имя
public Man( string name )
{
_name = name;
}
///
/// Меняет обращение для всех мужчин
///
/// Новое обращение
public void ChangePrefix( string prefix )
{
_prefix = prefix;
}
///
/// Выводит строковое представление экземпляра
///
/// Возвращает строковое представление
public override string ToString()
{
return _prefix + " " + _name;
}
}
public class Application
{
public static void Main()
{
// Создаем двух мужчин с разными именами
Man smith = new Man("Smith");
Man pitt = new Man("Pitt");
// Выводим их начальные состояния
Console.WriteLine("До изменения: " + smith + ", " + pitt);
// Изменяем имя одного из них
pitt._name = "Pumpkin";
Console.WriteLine
("После изменения имени одного из них: " + smith + ", " + pitt);
// Меняем обращение
pitt.ChangePrefix("Dr.");
Console.WriteLine
("После изменения обращения: " + smith + ", " + pitt);
}
}
}
Вот вывод программы:
До изменения: Mr. Smith, Mr. Pitt
После изменения имени одного из них: Mr. Smith, Mr. Pumpkin
После изменения обращения: Dr. Smith, Dr. Pumpkin
Как видно из вывода, в первый раз меняется значение только для одного
экземпляра, а во воторой - для всех. Также отметим, что статические и
экземплярные переменные автоматически инициализируются значением по умолчанию.
Элементы массивов, а также различные параметры будут обсуждены в
соответствующих главах. Здесь мы разберем лишь локальные переменные:
Локальные переменные - это переменные, объявленные в теле метода. Они не
инициализируются автоматически и время их жизни зависит от компилятора, но оно
не больше, чем время исполнения метода. Локальные переменные могут быть
определены и в управляющих блоках for, while, foreach, if.
using System;
namespace LocalVariables
{
public class Application
{
static int i = 117;
public static void Main()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("i = {0}", i);
}
Console.WriteLine("i = {0}", Application.i);
}
}
}
Вывод программы следующий:
i = 0
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9
i = 117