Функции в си шарп

Функции в си шарп

Функция – это небольшая подпрограмма. Функции позволяют уменьшить размер программы за счет того, что не нужно повторно писать какой-то фрагмент кода — мы просто вызываем сколько угодно и где нужно объявленную функцию.

Функции в Си-шарп также называют методами. Между этими двумя понятиями разница небольшая, и тут мы будем использовать термин функция.

До этого, мы весь код писали в функции main. Функция main является главной функцией приложения и точкой входа программы. Любая функция в Си-шарп может быть объявлена только в рамках класса, так как C# — полностью объектно-ориентированный язык программирования (ООП). Объявление пользовательской функции внутри другой функции (например main) недопустимо. Объявление функции имеет следующую структуру:

[модификатор доступа] [тип возвращаемого значения] [имя функции] ([аргументы])

Модификатор доступа (области видимости) может быть public, private, protected, internal, но пока будем везде использовать public.

Между модификатором и типом может стоять ключевое слово static, что означает, что функция будет статичной. Скажу только, что из статичной функции можно вызывать другие функции, если они тоже статичные. Главная функция main – всегда static, поэтому все функции в этом уроке мы будем объявлять также статичными.

Функция может возвращать значение или не возвращать. Если функция, например, возвращает целое число, то нужно указать тип int. Если функция не возвращает никакого значения, то для этого используется ключевое слово void. Функции, которые не возвращают значение, еще называют процедурами.

Желательно называть функции так, чтобы имя отражало суть функции. Используйте глаголы или словосочетания с глаголами. Примеры: GetAge(), Sort(), SetVisibility().

Аргументы – это те данные, которые необходимы для выполнения функции. Аргументы записываются в формате [тип] [идентификатор]. Если аргументов несколько, они отделяются запятой. Аргументы могут отсутствовать.

Первая строка функции, где указываются тип, имя, аргументы и т.д. называется заголовком функции.

Перейдем к практике.

Пример функции, которая не возвращает значение

Напишем простую функцию, которая будет заменять в массиве строк указанное имя на другое. Данная функция будет принимать три аргумента: массив строк, имя, которое необходимо заменить и новое имя. Так как функция не будет возвращать значение, указываем тип void перед именем функции.

public static void ReplaceName(string[] names, string name, string newName)
<
for (int i=0; i

Проходим в цикле по элементам и смотрим, равен ли элемент указанному имени. Если да, то заменяем его на новое имя.

Функция написана, и теперь используем ее:

class Program
<
public static void ReplaceName(string[] names, string name, string newName)
<
for (int i=0; i max)
max = array[i];
>
return max;
>

Логика функции проста. Создаем переменную max, в которую записываем первый элемент массива. Дальше в цикле сравниваем каждый элемент со значением в max, если элемент больше, чем max, то записываем в max этот элемент. В конце функции используем оператор return, чтобы вернуть наш результат.

Оператор return должен быть обязательно в функции, которая возвращает значение.

Используем нашу функцию:

class Program
<
public static int GetMax(int[] array)
<
int max = array[0];
for (int i = 1; i max)
max = array[i];
>
return max;
>
static void Main(string[] args)
<
int[] numbers = < 3, 32, 16, 27, 55, 43, 2, 34 >;
int max;
max = GetMax(numbers); //вызов такой функции можно использовать при присваивании значения
Console.WriteLine(GetMax(numbers)); // вызов функции также можно использовать как аргумент при вызове другой функции. WriteLine() – тоже функция.
Console.ReadKey();
>
>

Оператор return

Когда встречается этот оператор, происходит выход из функции и код ниже (если он есть) выполняться не будет (например, в функцию передан такой аргумент, при котором нет смысла выполнять функцию). Он похож на оператор break, который используется для выхода из циклов. Этот оператор также можно использовать и в функциях, которые не возвращают значение. Оператор return допустимо использовать несколько раз в функции, но этого делать не рекомендуется.

Читайте также:  Sapphire tri x r9 fury

Пример 1. Напишите функцию, которая будет менять в массиве целых чисел все элементы, которые равны указанному значению (аргумент) на противоположное значение по знаку. Например, все элементы массива которые равны 5, будут меняться на -5.

public static void replacesign (int[] numbers, int number)
<
for (int i=0; i c? c : b) > a)? a : min;
>

class Program
<
public static int getmin (int[] numbers)
<
int min = numbers[0];
for (int i=1; i 2) <
for (int i=2; i

Идея сайта изначально заключалась в написание программы для отправки смс, но щас нет времени, чтобы заниматся этим вопросом, но проект не умер, просто временно заморожен.
Так же Вы можете почитать мои уроки по программированию и некоторую интересующую Вас инфу и другие вкусности.

Привет. По просьбам читающих, после долгого перерыва продолжаю цикл статей о программирование на C#. Осталось вспомнить, о чем мы говорили последний раз. Бегло читаю последнюю статьи и понимаю, что продвинулись мы совсем не далеко.

Предлагаю, чтобы не затягивать предвкушение самого интересного, а именно написание программ для КПК, сделать еще 2 вводных урока, а дальше уже начать писать под коммуникаторы.

Что нам предстоит сделать в этом уроке?! Познакомится с функциями и процедурами в C#.

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

Функция – это такая же процедура, только ей свойственно явное возвращение результат ее работы.

Чтобы стало ясно, приведу пример:

static void CopyString(string a, ref string b)
<
b = a+b;
>

static string ReturnString(string a, string b)
<
return a + b;
>

Из анализа приведенного кода видно, что процедура CopyString – не возвращает значений с помощью слова return, те на прямую. Она возвращает значения через ref – указатель. Подробнее о нем, вы можете почитать в книгах по C#, а можете не запариватся и просто запомнить, что если вам нужно поменять значение какой-либо переменной в процедуре и возвратить это значение не явно используйте ref.

Да чуть не забыл, ref можно применять как в функциях так и в процедурах и не один раз. Например:

static string ReturnString(string a, string b,ref string c)
<
c=a+b+” Test”;
return a + b;
>

Что будет если мы засунем переменные a,b,c в функцию?! Например

a=Hello
b=Artem
e = ReturnString(a,b,c);

e = HelloArtem
c = HelloArtem Test

Как определить что перед вами процедура или функция и как вообще их писать?!

Запомните процедура всегда начинается со слова void, а функция с названия класса или типа, который она возвращает. Напрмер string в нашем случае.

Пишется процеру просто:

Void (параметры)
<
тело процедуры
>
(параметры)
<
Тело функции
Return ;
>

: позволяет видеть или скрывать процедуры для их вызова, может быть: public private. Так же существуют можификатор static.

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

Так с процедурами и функциями пока все). Хотя наверно стоит сказать, что процедуры и функции нужны для того, чтобы оптимизировать код программы:

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

Так же функции и процедуру позволяют выделять участки кода в логические блоки, что помогает, потом ее быстрей разбирать и понимать, чем читать однотипный код программы. А так же в случае если вы обнаружили ошибку в коде процедуры (функции) ее исправление приведет к исправлению во всей программе и вам не придется пересматривать весь написанный талмуд повторяющихся шаблонов.

Читайте также:  Площадь фигуры заданной в полярных координатах

Терминологические заморочки

В языке С, дедушке языка C#, все было очень просто: данные это числа, строки, массивы; программный код – операторы языка и функции. Функции в C, говоря языком структурного программирования, это подпрограммы.

С переходом от императивного языка C к объектно-ориентированному языку C++ понятие функции (как подпрограммы) сохранилось, однако каждая функция стала принадлежать какому-либо классу. Отметим что в С++ были добавлены специальные функции – конструкторы и деструкторы.

В язык C#, являющийся прямым наследником языка C++, многое перенесено без особых изменений, однако введенная терминология поначалу может ввести вас в заблуждение.

Разберемся с терминами и понятиями более подробно.

Оказывается, что к данным (данные-члены класса) теперь относятся не только поля, но и константы и события, а все, что содержит программный код, теперь называется функциями-членами класса, среди которых традиционная функция теперь называется методом класса.

Авторы языка определили, что функции-члены — это члены, которые обеспечивают некоторую функциональность для манипулирования данными класса. Они включают методы, свойства, конструкторы, финализаторы (деструкторы в С++), операции и индексаторы.

Для начинающего программиста важно освоить, прежде всего, работу с методами класса, а по сути (в прежнем понимании) – с функциями как подпрограммами. К этому добавим работу с конструкторами классов, а все остальное будет рассмотрено позже.

Шаблон объявления метода

[модификаторы] тип_возвращаемого_значения ИмяМетода([параметры])
<
// Тело метода
>
В C# определение метода состоит из указания модификаторов (static, public и т.п., модификаторы не обязательны), типа возвращаемого значения, имени метода и списка параметров в круглых скобках. Далее в фигурных скобках записывается тело метода.
Каждый параметр состоит из имени типа параметра и имени, по которому к нему можно обратиться в теле метода.

Возврат из метода и возврат значения

Если метод возвращает значение, то для указания точки выхода должен использоваться оператор возврата return вместе с возвращаемым значением. Если метод не возвращает ничего, то в качестве типа возврата указывается void (опустить тип возврата невозможно).

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

В целом, возврат из метода может произойти при двух условиях. Во-первых, когда встречается фигурная скобка, закрывающая тело метода. И во-вторых, когда выполняется оператор return. Имеются две формы оператора return: одна — для методов типа void (возврат из метода), т.е. тех методов, которые не возвращают значения, а другая — для методов, возвращающих конкретные значения.

Использование параметров

При вызове метода ему можно передать одно или несколько значений. Значение, передаваемое методу, называется аргументом. А переменная, получающая аргумент, называется формальным параметром, или просто параметром.

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

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

Если переменная, указанная в списке параметров, относится к типу значений (int, double, bool и т.п.), то вызываемый метод получает копию этой переменной, а это значит, что все изменения в ней, выполненные внутри метода будут утеряны.

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

Поведение строк также отличается. Дело в том, что строки являются неизменными (изменение значения строки приводит к созданию совершенно новой строки), поэтому строки не демонстрируют поведение, характерное для ссылочных типов. Любые изменения, проведенные в строке внутри метода, не влияют на исходную строку.

Читайте также:  Флеш контент на этой странице заблокирован

Передача структуры (struct) как параметра через ее имя также произойдет через копирование (помните, структура относится к типу значений).

Если же для каких-либо типов данных необходима передача по ссылке (она более эффективна при большом объеме данных, который приходится копировать), то перед указанием типа параметра достаточно указать модификатор ref (reference – ссылка, англ.).

Рассмотрим три примера.

ПРИМЕР 1. В статье Первая программа на языке Си шарп мы разбирали программу:

В классе Program объявляется метод Main() (главная функция приложения), при выполнении которого вызываются два метода класса Console: WriteLine() (вывод строки текста) и ReadKey() (чтение символа с клавиатуры).

Ключевое слово static означает, что данный метод принадлежит классу Program.

Модификатор void указывает, что метод не возвращает никаких параметров.

Метод Main() в качестве списка параметров имеет массив строк, метод WriteLine() имеет один параметр – строку, метод ReadKey() параметров не имеет.

ПРИМЕР 2. Объявление метода в примере Вычисление функции sin(x) выглядит так:

Параметром (аргументом) функции объявляется переменная x типа double, метод возвращает результат также типа double (последний оператор метода return s;). Метод является статическим. Для вызова метода достаточно написать оператор y=Sin2(x);

ПРИМЕР 3. Передача параметров по значению, ссылке и через статическую переменную

Объявим в классе Program структуру West с двумя полями, статическую переменную f и метод vp( ):
static void vp(int[] b, West u, string t, double d, ref decimal y)
где b – массив, u – структура, t – строка, d – вещественное число, y – десятичный тип, передается по ссылке (модификатор ref).

В методе изменим эти переменные, а также и f для того, чтобы проверить способы передачи параметров (копированием или по ссылке).

Напечатаем эти значения до и после вызова метода vp().

Результат:

Обратите внимание, что второй элемент массива a[1], десятичное число x (передаваемое через ссылку — ref) и статическая переменная f изменились, а структура u, строка t и вещественное число d не изменились.

Отметим, что статическое поле f, объявленное в классе, доступно методам этого класса без механизма передачи параметров.

Некоторые итоги:

1) переменные, объявленные внутри метода или в списке его параметров, являются локальными переменными;

2) при вызове метода параметры из списка в заголовке метода либо копируются в локальные переменные метода, либо передаются по ссылке;

3) копируются все встроенные типы значений, структуры и (по сути) строки, хотя и они относятся к ссылочным типам;

4) по ссылке передаются массивы и другие объекты. Если их поля будут изменены внутри вызываемого метода, то эти изменения сохранятся при возврате в вызывающий метод;

5) передачу параметров по ссылке (без копирования в локальные переменные метода) можно обеспечить, используя модификатор ref. Однако это не имеет смысла для переменных ссылочного типа («масло масленое»);

6) нет необходимости передавать статические переменные класса через список параметров, в рамках одного класса они имеют смысл глобальных переменных в императивных языках программирования (хотя термин «глобальная переменная» в C# не употребляют);

7) для доступа к данным-членам и функциям-членам других классов необходимо указать имя класса, поставить точку, указать имя члена класса, например: Math.PI — константа, число пи=3,14158… , Math.Tan(x) — тангенс числа x, заданного в радианах;

8) доступ к членам других классов зависит от уровня его приватности (public, но не private или protected).

Как и во многих языках программирования для реализации рекурсивных алгоритмов в C# можно использовать рекурсивные методы.

Завершим раздел рассмотрением двух из трех ключевых принципов ООП — наследования и полиморфизма, считаю принцип инкапсуляции (объединение данных и и методов в класс) уже достаточно ясным.

Ссылка на основную публикацию
Фото на зеленом фоне хромакей
Зеленый фон или «хромакей» применяют при съемках для последующей его замены на любой другой. Хромакей может быть и другого цвета,...
Файловая система для операционной системы windows
Вы знаете, что Windows Phone использует NTFS? Почему большинство карт памяти и почти все USB-накопители по-прежнему используют старый-добрый FAT? Почему...
Файлы в карантине что с ними делать
содержит все нейтрализованные вредоносные программы в корзине в течение определенного периода времени до того момента, как применит к ним соответствующие...
Фото на скайп для пацанов
Крутые фотографии пацанов на аву: фото без лица, в маске анонима, крутые пацаны с битами и с пистолетами. Крутые фото...
Adblock detector