Внимание. Поля, описанные со спецификатором static, а также константы существуют в един­ственном экземпляре для всех объектов класса

Поля, описанные со спецификатором static, а также константы существуют в един­ственном экземпляре для всех объектов класса, поэтому к ним обращаются не через имя экземпляра, а через имя класса. Если класс содержит только статические эле­менты, экземпляр класса создавать не требуется. Именно этим фактом мы пользо­вались во всех предыдущих листингах.

Обращение к полю класса выполняется с помощью операции доступа (точка). Справа от точки задается имя поля, слева — имя экземпляра для обычных полей или имя класса для статических. В листинге 5.1 приведены пример простого класса Demo и два способа обращения к его полям.

class Demo

{

public int a = 1; // поле данных

public const double с = 1.66; // константа

public static string s = "Demo"; // статическое поле класса

double у; // закрытое поле данных

}

class Class1

{

static void Main()

{

Demo x = new Demo(); // создание экземпляра класса Demo

Console.WriteLine(x.a); // x.a - обращение к полю класса

Console.WriteLine(Demo.с); // Demo.с - обращение к константе

Console.WriteLine(Demo.s); // обращение к статическому полю

}

}

Поле у вывести на экран аналогичным образом не удастся: оно является закры­тым, то есть недоступно извне (из класса Class1). Поскольку значение этому полю явным образом не присвоено, среда присваивает ему значение ноль.

ВНИМАНИЕ

Все поля сначала автоматически инициализируются нулем соответствующего типа (например, полям типа int присваивается 0, а ссылкам на объекты — значение null). После этого полю присваивается значение, заданное при его явной инициа­лизации. Задание начальных значений для статических полей выполняется при инициализации класса, а обычных — при создании экземпляра.

Поля со спецификатором readonly предназначены только для чтения. Установить значение такого поля можно либо при его описании, либо в конструкторе (кон­структоры рассматриваются далее в этой главе).

Методы

Метод — это функциональный элемент класса, который реализует вычисления или другие действия, выполняемые классом или экземпляром. Методы опреде­ляют поведение класса.

Метод представляет собой законченный фрагмент кода, к которому можно обра­титься по имени. Он описывается один раз, а вызываться может столько раз, сколько необходимо. Один и тот же метод может обрабатывать различные дан­ные, переданные ему в качестве аргументов. Синтаксис метода:

[ атрибуты ] [ спецификаторы ] тип имя_метода ([ параметры ]) тело_метода

Рассмотрим основные элементы описания метода. Первая строка представляет собой заголовок метода. Тело метода, задающее действия, выполняемые методом, чаще всего представляет собой блок — последовательность операторов в фигур­ных скобках1.

При описании методов можно использовать спецификаторы 1-7 из табл. 5.2, имеющие тот же смысл, что и для полей, а также спецификаторы virtual, sealed, override, abstract и extern, которые будут рассмотрены по мере необходимости. Чаще всего для методов задается спецификатор доступа public, ведь методы составляют интерфейс класса — то, с чем работает пользователь, поэтому они должны быть доступны.

ВНИМАНИЕ

Статические (static) методы, или методы класса, можно вызывать, не создавая эк­земпляр объекта. Именно таким образом используется метод Main.

Позже мы увидим, что для методов некоторых типов вместо тела используется просто точка с запятой.

Пример простейшего метода:

public double Gety() // метод для получения поля у из листинга 5.1

{

return у;

}

Тип определяет, значение какого типа вычисляется с помощью метода. Часто употребляется термин «метод возвращает значение», поскольку после выполне­ния метода происходит возврат в то место вызывающей функции, откуда был вызван метод, и передача туда значения выражения, записанного в операторе return (рис. 5.3). Если метод не возвращает никакого значения, в его заголовке задается тип void, а оператор return отсутствует.

Параметры используются для обмена информацией с методом. Параметр пред­ставляет собой локальную переменную, которая при вызове метода принима­ет значение соответствующего аргумента. Область действия параметра — весь метод.

Например, чтобы вычислить значение синуса для вещественной величины х, мы передаем ее в качестве аргумента в метод Sin класса Math, а чтобы вывести значе­ние этой переменной на экран, мы передаем ее в метод WriteLine класса Console:

double x = 0.1; double у = Math.Sin(x); Console.WriteLine(x);

При этом метод Sin возвращает в точку своего вызова вещественное значение си­нуса, которое присваивается переменной у, а метод WriteLine ничего не возвращает.

ВНИМАНИЕ

Метод, не возвращающий значение, вызывается отдельным оператором, а метод, возвращающий значение, — в составе выражения в правой части оператора при­сваивания.

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

соответствовать друг другу. Правила соответствия подробно рассматриваются в следующих разделах.

Для каждого параметра должны задаваться его тип и имя. Например, заголовок метода Sin выглядит следующим образом:

public static double Sin(double a);

Имя метода вкупе с количеством, типами и спецификаторами его параметров представляет собой сигнатуру метода — то, по чему один метод отличают от других. В классе не должно быть методов с одинаковыми сигнатурами. В листинге 5.2 в класс Demo добавлены методы установки и получения значения поля у (на самом деле для подобных целей используются не методы, а свойства, которые рассматриваются чуть позже). Кроме того, статическое поле s закрыто, то есть определено по умолчанию как private, а для его получения описан метод Gets, являющий собою пример статического метода.

Листинг 5.2. Простейшие методы

using System;

namespace ConsoleApplication1

{

class Demo

{

public int a = 1;

public const double с = 1.66;

static string s = "Demo";

double y;

public double Gety() // метод получения поля у

{

return у;

}

public void Sety(double y_) // метод установки поля у

{

у = у_;

}

public static string Gets() // метод получения поля s

{

return s;

}

}

class Class1

{

static void Main()

{

Demo x = new Demo();

x.Sety(0.12); // вызов метода установки поля у

Console.WriteLine(x.Gety()); // вызов метода получения поля у

Console.WriteLine(Demo.Gets()); // вызов метода получения поля s

// Console.WriteLine(Gets ()); // вариант вызова

}

}

}

Как видите, методы класса имеют непосредственный доступ к его закрытым полям. Метод, описанный со спецификатором static, должен обращаться только к статическим полям класса. Обратите внимание на то, что статический метод вызывается через имя класса, а обычный — через имя экземпляра.

ПРИМЕЧАНИЕ

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: