Методы c#. Программирование.
Базовый курс с#
Как писал Никлаус Вирт, программы — это алгоритмы + структуры данных. Можно считать, что данные в C# — это поля объектов и статические поля классов. Алгоритмы (т. е. функциональность программ) представляются с помощью методов класса и методов его объектов. В языке C# методы не существуют вне классов или структур. Нестатические методы реализуют функциональность объектов. Статические методы… Читать ещё >
Методы c#. Программирование. Базовый курс с# (реферат, курсовая, диплом, контрольная)
Методы-процедуры и методы-функции
Как писал Никлаус Вирт, программы — это алгоритмы + структуры данных. Можно считать, что данные в C# — это поля объектов и статические поля классов. Алгоритмы (т. е. функциональность программ) представляются с помощью методов класса и методов его объектов. В языке C# методы не существуют вне классов или структур. Нестатические методы реализуют функциональность объектов. Статические методы обеспечивают функциональность классов и, тем самым, программы в целом. Каждый метод предназначен для выполнения действий, определяемых совокупностью входящих в метод (в его тело) операторов. Начиная с версии C# 7.0, в каждом методе может быть определен и использован другой (локальный) метод (локальные методы рассмотрены в параграфе 9.2).
Для определения методов и при их вызове в C# не используются никакие служебные слова. В «языках древности», таких как ФОРТРАН или КОБОЛ, и в некоторых более современных языках, не входящих в семейство С-образных, для обозначения подпрограмм, функций, процедур используются специальные термины, включаемые в список служебных слов соответствующего языка (FUNCTION, SUBROUTINE — в Фортране, procedure в Паскале и т. д.). Для вызова подпрограмм в Фортране используется конструкция со служебным словом CALL и т. п.
В языках, ведущих свое происхождение от языка С (C + +, Java, C# и др.) при определении функций и для обращения к ним специальные термины не применяются. Это в полной мере относится и к методам языка С#. Однако синтаксически и семантически методы C# можно разделить на процедуры и функции. Это деление не особенно жесткое и в ряде случаев метод может играть две роли — и процедуры, и функции.
В упрощенном варианте формат декларации метода, который может играть роль как процедуры, так и функции, можно представить так:
людификаторы_метода0t
тип_возвращаемого_значения имя_метода (спецификация_параметров).
{операторы_тела_метода}.
Индекс opt указывает на необязательность модификаторов метода.
Фигурные скобки ограничивают тело метода, часть объявления перед телом метода называют заголовком метода.
Минимальная конструкция, применяемая для обращения к методу:
имя_метода(список_аргументов).
В общем случае имя метода при обращении дополняется префиксами, указывающими на принадлежность метода пространству имен, конкретному классу или реально существующему объекту.
Метод-процедура отличается от метода-функции следующими свойствами:
- • в качестве типа возвращаемого значения используется void, т. е. процедура не возвращает в точку вызова никакого результата;
- • в теле процедуры может отсутствовать оператор возврата return, а когда он присутствует, то в нем нет выражения для вычисления возвращаемого значения. Если оператор return отсутствует, то точка выхода из процедуры (из метода) расположена за последним оператором тела метода;
- • для обращения к методу-процедуре используется вызов метода в виде отдельного оператора:
имя_метода (список_аргументов);
Метод-функция всегда возвращает в точку вызова результат (некоторое значение). Типом возвращаемого значения служит тип ссылки или тип значения.
В теле функции всегда присутствует, по крайней мере, один оператор возврата:
return выражение;
где выражение определяет возвращаемый функцией результат.
Обращение к методу-функции может использоваться в качестве операнда подходящего выражения. Термин «подходящего» относится к необходимости согласования операндов в выражении по типам.
Если результат, возвращаемый методом-функцией, по каким-то причинам не нужен в программе, а требуется только выполнение операторов тела функции, то обращение к ней может оформляться как отдельный оператор и в этом случае функция выступает в роли процедуры.
Когда вы знакомитесь с некоторым методом (или пишете свой метод), очень важно понимать, откуда метод берет (или будет брать) исходные данные и куда (и как) метод отправляет результаты своей работы.
Исходные данные могут быть получены:
- • через аппарат параметров метода;
- • как глобальные по отношению к методу;
- • от внешних устройств (потоки ввода, файловые потоки).
Результаты метод может передавать:
- • в точку вызова как возвращаемое значение;
- • в глобальные по отношению к методу объекты;
- • внешним устройствам (потоки вывода, файловые потоки);
- • через аппарат параметров метода.
Глобальными по отношению к методу объектами в C# являются статические поля класса, в котором, метод определен, и поля (статические) других классов, непосредственный доступ к которым имеет метод. Для нестатического метода в качестве глобальных данных доступны нестатические члены класса, т. е. члены объектов этого класса. Для локальных методов глобальными объектами являются параметры и локальные переменные того метода, в котором объявлен локальный метод. Обмены через глобальные объекты являются нарушением принципов инкапсуляции и обычно в реальных разработках не рекомендуются.
Обмены со стандартными потоками ввода-вывода, поддерживаемые средствами класса Console, нам уже знакомы. Для организации обменов с файловыми потоками используются те средства библиотеки классов, которые мы еще не рассматривали. Сосредоточимся на особенностях обменов через аппарат параметров.
При определении метода в его заголовке размещается спецификация параметров (возможно пустая) — разделенная запятыми последовательность спецификаторов параметров. Каждый спецификатор параметра имеет вид:
модификатор тип_параметра имя_параметра
Модификатор параметра может отсутствовать или имеет одну из следующих форм: ref, out, params, this.
Если модификатор параметра отсутствует, то спецификатор параметра может включать умалчиваемое значение аргумента и принимает вид:
тип_параметра имя_параметра = выражение
Такие параметры в литературе называют необязательными (optional parameter). Выражение после знака присваивания определяет умалчиваемое значение аргумента и должно быть константным.
Ограничений на тип параметра не накладывается. Параметр может быть: предопределенного типа (базовые типы, строки, object); перечислением; структурой; классом; массивом; интерфейсом; делегатом.
Имя параметра — это идентификатор, который выбирает автор метода. Область видимости и время существования параметра ограничиваются заголовком и телом метода. Таким образом, параметры не видны и недоступны для кода, который не размещен в теле метода.
Стандарт C# отмечает существование четырех видов параметров:
- • параметры, передаваемые по значениям;
- • параметры, передаваемые по ссылкам (ref);
- • выходные параметры (out);
• массив-параметр (params).
Параметры первых трех видов в Стандарте C# называют фиксированными параметрами. Спецификация фиксированного параметра включает необязательный модификатор ref или out, обозначение типа и идентификатор (имя параметра).
Список параметров представляет собой последовательность разделенных запятыми спецификаторов параметров (возможно, пустую), из которых только последний может быть массивом-параметром, имеющим модификатор params.
Модификаторы метода необязательны, но их достаточно много. Вот их список, пока без комментариев:
new, public, protected, internal, private, static, virtual, sealed, override, abstract, extern, async.
В данной главе мы будем рассматривать только статические методы (методы классов, не объектов) и локальные методы. В декларацию каждого метода класса (или структуры) входит модификатор static и такой метод называют статическим методом.
Чтобы продемонстрировать некоторые возможности и отличия метода-процедуры от метода-функции, рассмотрим следующую программу.
// 0901.cs — Статические методы — процедура и функция using System;
using static System. Console; class Program {.
static void print (string line).
{
WriteLine («Длина строки: «+ line. Length);
WriteLine («Значение строки: «+ line);
>
static string change (string str).
{
char[] rev = str. ToCharArrayQ;
Array.Reverse (rev); return new string (rev);
}
static void Main ().
{
string numbers = «123 456 789» ;
print (numbers);
numbers = change (numbers);
print (numbers);
} }
Результат выполнения программы:
Длина строки: 9 Значение строки: 123 456 789.
Длина строки: 9.
Значение строки: 987 654 321.
В классе Program три статических метода. Метод print () получает исходные данные в виде строки-параметра и выводит длину и значение этой строки. В точку вызова метод print () ничего не возвращает — это процедура.
Метод change () — это функция. Он получает в качестве параметра строку, формирует ее «перевернутое» значение и возвращает в точку вызова этот результат.
В статическом методе Main () определена ссылка numbers на строку «123 456 789». В отдельном операторе вызван метод-процедура print (numbers), который выводит сведения о строке, именованной ссылкой numbers. Затем та же ссылка использована в качестве аргумента метода-функции change (). Обращение к этому методу размещено в правой части оператора присваивания, поэтому возвращаемый методом change () результат становится новым значением ссылки numbers. Повторное обращение к методу print () иллюстрирует изменения.