Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSBasicCourse2ndedPodbelsky / CSBasicCourse2ndedPodbelsky.rtf
Скачиваний:
27
Добавлен:
22.03.2016
Размер:
11.9 Mб
Скачать

10.4. Статические методы

Статический метод "метод:статический метод" Main() мы уже используем

,

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

Main() можно обращаться ко всем статическим членам того класса, где размещён

метод Main( ).

Статические методы, отличные от Main( ), мы уже подробно рассматривали, но

ограничивались их размещением в том классе, где находится метод Main(). В этом

случае

для

обращения

к

методу

можно

использовать

выражение

имя_метода(список_аргументов). Если статический метод определён в другом

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

имя_класса.имя_метода(список_аргументов)

По умолчанию статический метод имеет модификатор доступа private, т.е

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

планируется вызывать вне класса, необходимо указать модификатор доступа. В

зависимости от дальнейшего применения метода используются модификаторы

public (открытый), protected – (защищещённый), internal – (внутренний),

protected internal – (защищённый

внутренний).

Области видимости, которые

обеспечены перечисленными модификаторами, те же что и для полей классов.

Статические методы применяются: для инициализации статических полей; для

обращения к статическим полям с целью их изменения или получения значений; для

обработки внешних данных, передаваемых методу через аппарат параметров; для

вызова из других методов класса. Особо нужно отметить, что в теле статического

метода недоступны нестатические члены того класса, которому принадлежит

метод.

В следующей программе статические методы используются для инициализации

статических полей и для обеспечения внешнего доступа к закрытому полю класса.

// 10_06.cs - статические методы класса

using System;

class newClass {

static int n = 5;

static int x = f1(n);

public static int y = fb(n) ? 10 : -10

;

public static int getX() { return x; }

static bool fb(int a) { return a % 2 == 0 ? true : false; }

static int f1(int d) { return d * d * d; }

}

class Program

{

static void Main()

{

Console.WriteLine("newClass.y = " + newClass.y);

Console.WriteLine("newClass.getX() = " + newClass.getX());

}

}

Результат выполнения программы:

newClass.y = -10

newClass.getX() = 125

Обратите внимание, что в классе newClass только два открытых члена – поле

int y и метод getX(). Поля x, n и методы fb(), f1() недоступны вне класса.

В теле любого метода могут быть объявлены локальные переменные

"переменные:локальные переменные" и константы с типами ссылок и значений.

Имена таких переменных имеют право совпадать с именами статических членов

того класса, в котором размещён метод. В этом случае локальная переменная

"экранирует"

одноимённую

статическую

переменную,

то

есть

имя

без

квалификатора "имя_класса." при совпадении имён относится только к локальному

объекту метода. В качестве примера рассмотрим следующий метод Main() из

класса Test_cs:

// 10_07.cs - Статические поля класса и локальные данные методов

using System;

class Test_cs {

static int n = 10; // инициализация разрешена

static string line = new string('*', n);

static double constant = 9.81; // поле класса Test_cs

double pi = 3.14159; // поле объекта класса Test_cs

static void Main( ) {

const double PI = 3.14159; // локальная константа

double circle; // локальная переменная

//circle = 2 * pi * n; // ошибка - нет объекта класса Test_cs

circle = 2 * PI * n

;

Console.WriteLine("Длина окружности=" + circle.ToString( ));

Console.WriteLine(line);

Test_cs.n = 20; // изменили значение поля класса

line = new string('*', n); // изменили значение ссылки

Console.WriteLine(line);

const double constant = 2.718282; // локальная константа

Console.WriteLine("Test_cs.constant=" + Test_cs.constant);

Console.WriteLine("constant=" + constant);

}

}

Результат выполнения программы:

Длина окружности=62,8318

**********

********************

Test_cs.constant=9,81

constant=2,718282

В тексте метода Main( ):

PI – локальная именованная константа;

circle – локальная переменная;

n, Test_cs.n – два обращения к одному и тому же статическому полю класса;

line – статическая ссылка–поле класса;

constant – локальная константа, имя которой совпадает с именем статического

поля класса Test_cs.

Попытка обращения в теле метода Main( ) к нестатическому полю pi приводит к

ошибке – пока не создан объект класса (объект, которому будет принадлежать поле

pi) к его нестатическим полям обращаться нельзя, их нет.

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

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

которых есть право доступа к этому классу.

Итак, пока не создан объект класса, существуют и доступны только

статические члены класса.

Соседние файлы в папке CSBasicCourse2ndedPodbelsky