Как вызвать метод в с
Перейти к содержимому

Как вызвать метод в с

  • автор:

C # — Методы

Метод — это группа операторов, которые вместе выполняют задачу. Каждая программа C # имеет хотя бы один класс с методом Main.

Чтобы использовать метод, вам необходимо:

  • Определить метод
  • Вызвать метод

Определение методов в C #

Когда вы определяете метод, вы в основном объявляете элементы его структуры. Синтаксис для определения метода в C # выглядит следующим образом:

  (Parameter List)

Ниже приведены различные элементы метода —

  • Access Specifier — определяет видимость переменной или метода из другого класса.
  • Тип возврата . Метод может возвращать значение. Тип возврата — это тип данных значения, возвращаемого методом. Если метод не возвращает никаких значений, то возвращаемый тип недействителен .
  • Имя метода. Имя метода является уникальным идентификатором и чувствительным к регистру. Он не может быть таким же, как любой другой идентификатор, объявленный в классе.
  • Список параметров — заключено между круглыми скобками, параметры используются для передачи и приема данных из метода. Список параметров относится к типу, порядку и количеству параметров метода. Параметры являются необязательными; то есть метод не может содержать никаких параметров.
  • Тело метода — содержит набор инструкций, необходимых для выполнения требуемой активности.

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

class NumberManipulator < public int FindMax(int num1, int num2) < /* local variable declaration */ int result; if (num1 >num2) result = num1; else result = num2; return result; > . >

Методы вызова в C #

Вы можете вызвать метод, используя имя метода. Следующий пример иллюстрирует это:

using System; namespace CalculatorApplication < class NumberManipulator < public int FindMax(int num1, int num2) < /* local variable declaration */ int result; if (num1 >num2) result = num1; else result = num2; return result; > static void Main(string[] args) < /* local variable definition */ int a = 100; int b = 200; int ret; NumberManipulator n = new NumberManipulator(); //calling the FindMax method ret = n.FindMax(a, b); Console.WriteLine("Max value is : ", ret ); Console.ReadLine(); > > >

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

Max value is : 200

Вы также можете вызвать общедоступный метод из других классов, используя экземпляр класса. Например, метод FindMax принадлежит классу NumberManipulator , его можно вызвать из другого класса Test .

using System; namespace CalculatorApplication < class NumberManipulator < public int FindMax(int num1, int num2) < /* local variable declaration */ int result; if(num1 >num2) result = num1; else result = num2; return result; > > class Test < static void Main(string[] args) < /* local variable definition */ int a = 100; int b = 200; int ret; NumberManipulator n = new NumberManipulator(); //calling the FindMax method ret = n.FindMax(a, b); Console.WriteLine("Max value is : ", ret ); Console.ReadLine(); > > >

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

Max value is : 200

Вызов рекурсивного метода

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

using System; namespace CalculatorApplication < class NumberManipulator < public int factorial(int num) < /* local variable declaration */ int result; if (num == 1) < return 1; >else < result = factorial(num - 1) * num; return result; >> static void Main(string[] args) < NumberManipulator n = new NumberManipulator(); //calling the factorial method ", n.factorial(6)); Console.WriteLine("Factorial of 7 is : ", n.factorial(7)); Console.WriteLine("Factorial of 8 is : ", n.factorial(8)); Console.ReadLine(); > > >

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

Factorial of 6 is: 720 Factorial of 7 is: 5040 Factorial of 8 is: 40320

Передача параметров методу

Когда вызывается метод с параметрами, вам необходимо передать параметры методу. Существует три способа передачи параметров в метод —

Параметры параметров

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

Контрольные параметры

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

Выходные параметры

Этот метод помогает вернуть более одного значения.

Как вызвать метод в с

Доброго времени суток! В этом уроке я расскажу, что же такое методы в C#. Я уже не раз употреблял этот термин, и пришла пора разобраться с ним. Как всегда, я не буду перегружать Вас информацией, дам только самое необходимое (разумеется, на мой взгляд).

И так, что же такое метод? В контексте объектно-ориентированного программирования, метод – это подпрограмма. А подпрограмма, в свою очередь – это фрагмент программы, который написать нужно один раз, а использовать его можно многократно (для выполнения однотипных действий). Это довольно удобно по нескольким причинам, например, можно реализовать определенный алгоритм один раз, хорошо его отладить, и быть уверенным в правильности его работы применяя его в дальнейшем многократно. Да и использование подпрограмм, значительно сокращает объем исходного кода проекта. Или еще представьте такую ситуацию, мы один раз написали подпрограмму, которая выполняет определенные действия, и многократно её используем, а потом, технические требования заставляют нас модифицировать алгоритм этих самых действий, так вот, нам достаточно всего один раз изменить код подпрограммы (изменения применяется во всех местах её использования). Думаю я убедил Вас в том, что познакомиться с методами в C# обязательно стоит!

И так, к делу! Мы уже знакомы с методом «Main» в главном файле программы. Это, так называемая точка входа в программу, главный метод наших программ. Этот метод, Visual Studio сгенерила сама, давайте рассмотрим, как он выглядит в исходном состоянии (сразу после создания нового проекта). Для этого создадим новый проект консольного приложения и рассмотрим код метода «Main», что называется под детально! А выглядит он вот так:

class Program < static void Main(string[] args) < >>

Я преднамеренно привел код метода «Main» вместе с объемлющим его кодом. Метод «Main» относится к классу «Program» (т.е. находится внутри класса «Program«).

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

Метод состоит из так называемого заголовка и тела:

//Заголовок метода static void Main(string[] args) < //Тело метода >

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

Далее идет ключевое слово void, в этом месте, указывается тип возвращаемого методом значения. Что это значит? Это значит, что выполнив какую-то работу, метод может вернуть её результат, а мы можем сохранить его в какой-либо переменной (и использовать для дальнейших нужд). А тип переменной, должен совпадать с типом возвращаемого значения! Но не каждый метод должен возвращать какое-то значение, и именно в тех случаях, когда метод «ничего не возвращает» указывается ключевое слово void.

Если бы метод «Main» должен был возвращать целое число, то вместо слова void было бы использовано слово int.

После ключевого слова void следует название метода, в данном случае – это Main. После названия идут круглые скобки, в которых определяются аргументы метода. В нашем случае – это «string[] args». Т.е. массив строк. Аргументы метода – это входные данные, которые получает метод. Аргументы метода в заголовке еще называют его формальными параметрами.

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

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

/*Этот метод принимает два целых числа и *возвращает их сумму*/ static int Sum(int aFirstArg, int aSecondArg)

Думаю что с заголовками методов более или менее понятно, давайте рассмотрим, что такое тело метода. А это просто набор операторов, заключенный в фигурные скобки сразу после заголовка метода.

Метод, чей заголовок мы рассматривали ранее, целиком, может выглядеть примерно так:

/*Этот метод принимает два целых числа и *возвращает их сумму*/ static int Sum(int aFirstArg, int aSecondArg)

Т.е. по факту, мы уже имеем написанный метод (подпрограмму), но теперь нужно им как-то воспользоваться, иначе, зачем он нам нужен? А чтобы воспользоваться методом, нужно его, так сказать, вызвать! Делается это следующим образом:

static void Main(string[] args) < //Вызов метода Sum с фактическими параметрами int result = Sum(24, 6); //Вывод результата в консоль Console.WriteLine(result); >

В примере выше мы вызвали метод «Sum» с фактическими параметрами, где первый из них равен 24 а второй – 6. Результат метода будет сохранен в переменной «result» и позже мы выводим его в консоль. В принципе, все просто!

А теперь, давайте применим полученные знания на практике! Улучшим пример из предыдущего урока. В нем мы дважды просили пользователя ввести целое число с клавиатуры, т.е. выполняли однотипные действия. Давайте оптимизируем наш код, создадим метод, который будет принимать в качестве аргумента текст приглашения пользователю, а возвращать введенное им число, после чего дважды вызовем этот метод с разными формальными параметрами.

class Program < /* * Данный метод выводит пользователю приглашение, * указанное в аргументе anOutputStr, получает введенную * с клавиатуры строку, преобразует её в целое число и * возвращает это число */ static int GetNumber(string anOutputStr) < //Вывод приглашения пользователю Console.Write(anOutputStr); //Получение строки string tmpString = Console.ReadLine(); //Преобразование строки в число int tmpArg = Convert.ToInt32(tmpString); return tmpArg; >static void Main(string[] args) < //Потенциально опасный блок try < //Первый вызов метода (получение первого числа) int firstArg = GetNumber("Введите первое число и нажмите клавишу Enter: "); //Второй вызов метода (получение второго числа) int secondArg = GetNumber("Введите второе число и нажмите клавишу Enter: "); //Сложение двух переменных int result = firstArg + secondArg; //Вывод результата Console.WriteLine("Результат сложения введенных чисел: " + result.ToString()); >//Блок обработки ошибок, SystemException - самый общий тип ошибок catch (SystemException) < Console.WriteLine("Во время выполнения программы произошла ошибка, вероятно, были введены некорректные данные!"); >> >

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

Методы (Руководство по программированию на C#)

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

Метод Main является точкой входа для каждого приложения C# и вызывается общеязыковой средой выполнения (CLR) при запуске программы. В приложении, использующем инструкции верхнего уровня, метод Main создается компилятором и содержит все инструкции верхнего уровня.

В этой статье рассматриваются названные методы. Дополнительные сведения об анонимных функциях см. в статье Лямбда-выражения.

Сигнатуры методов

Методы объявляются в классе, структуре или интерфейсе путем указания уровня доступа, такого как public или private , необязательных модификаторов, таких как abstract или sealed , возвращаемого значения, имени метода и всех параметров этого метода. Все эти части вместе представляют собой сигнатуру метода.

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

Параметры метода заключаются в скобки и разделяются запятыми. Пустые скобки указывают, что параметры методу не требуются. Этот класс содержит четыре метода:

abstract class Motorcycle < // Anyone can call this. public void StartEngine() // Only derived classes can call this. protected void AddGas(int gallons) < /* Method statements here */ >// Derived classes can override the base class implementation. public virtual int Drive(int miles, int speed) < /* Method statements here */ return 1; >// Derived classes must implement this. public abstract double GetTopSpeed(); > 

Доступ к методу

Вызов метода в объекте аналогичен доступу к полю. После имени объекта добавьте точку, имя метода и круглые скобки. Аргументы перечисляются в этих скобках и разделяются запятыми. Таким образом, методы класса Motorcycle могут вызываться, как показано в следующем примере:

class TestMotorcycle : Motorcycle < public override double GetTopSpeed() < return 108.4; >static void Main() < TestMotorcycle moto = new TestMotorcycle(); moto.StartEngine(); moto.AddGas(15); moto.Drive(5, 20); double speed = moto.GetTopSpeed(); Console.WriteLine("My top speed is ", speed); > > 

Параметры и аргументы метода

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

public void Caller() < int numA = 4; // Call with an int variable. int productA = Square(numA); int numB = 32; // Call with another int variable. int productB = Square(numB); // Call with an integer literal. int productC = Square(12); // Call with an expression that evaluates to int. productC = Square(productA * 3); >int Square(int i) < // Store input argument in a local variable. int input = i; return input * input; >

Передача по ссылке и передача по значению

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

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

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

public class SampleRefType

Теперь, если передать объект, основанный на этом типе, в метод, то будет передана ссылка на объект. В следующем примере объект типа SampleRefType передается в метод ModifyObject :

public static void TestRefType() < SampleRefType rt = new SampleRefType(); rt.value = 44; ModifyObject(rt); Console.WriteLine(rt.value); >static void ModifyObject(SampleRefType obj)

В этом примере, в сущности, делается то же, что и в предыдущем примере, — аргумент по значению передается в метод. Но поскольку здесь используется ссылочный тип, результат будет другим. В данном случае в методе ModifyObject изменено поле value параметра obj , а также изменено поле value аргумента, rt в методе TestRefType . В качестве выходных данных метод TestRefType отображает 33.

Дополнительные сведения о передаче ссылочных типов по ссылке и по значению см. в разделах Передача параметров ссылочного типа и Ссылочные типы.

Возвращаемые значения

Методы могут возвращать значение вызывающему объекту. Если тип возврата, указываемый перед именем метода, не void , этот метод может возвращать значение с помощью оператора return . Инструкция с ключевым словом return , за которым следует значение, соответствующее типу возврата, будет возвращать это значение объекту, вызвавшему метод.

Значение можно вернуть вызывающему объекту по значению или по ссылке. Значения возвращаются вызывающему объекту по ссылке, если ключевое слово ref используется в сигнатуре метода и указывается после каждого ключевого слова return . Например, следующая сигнатура метода и оператор return указывают, что метод возвращает переменную с именем estDistance вызывающему объекту по ссылке.

public ref double GetEstimatedDistance()

Ключевое слове return также останавливает выполнение метода. Если тип возврата — void , инструкцию return без значения по-прежнему можно использовать для завершения выполнения метода. Без ключевого слова return этот метод будет останавливать выполнение при достижении конца блока кода. Методы с типом возврата, отличным от void, должны использовать ключевое слово return для возврата значения. Например, в следующих двух методах ключевое слово return используется для возврата целочисленных значений.

class SimpleMath < public int AddTwoNumbers(int number1, int number2) < return number1 + number2; >public int SquareANumber(int number) < return number * number; >> 

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

int result = obj.AddTwoNumbers(1, 2); result = obj.SquareANumber(result); // The result is 9. Console.WriteLine(result); 
result = obj.SquareANumber(obj.AddTwoNumbers(1, 2)); // The result is 9. Console.WriteLine(result); 

Использование локальной переменной, в данном случае result , для сохранения значения является необязательным. Это может улучшить читаемость кода или может оказаться необходимым, если нужно сохранить исходное значение аргумента для всей области метода.

Чтобы использовать значение, возвращаемое по ссылке из метода, необходимо объявить локальную ссылочную переменную, если планируется изменение значения. Например, если метод Planet.GetEstimatedDistance возвращает значение Double по ссылке, можно определить его как локальную ссылочную переменную с использованием кода следующего вида:

ref double distance = ref Planet.GetEstimatedDistance(); 

Возвращать многомерный массив из метода M , который изменяет содержимое массива, необязательно, если вызывающая функция передает массив в M . В целях оптимизации можно возвращать полученный массив из M или функциональный поток значений, однако это необязательно. Это связано с тем, что C# передает все ссылочные типы по значению, а значение ссылки на массив представляет собой указатель на массив. В методе M любые изменения содержимого массива отслеживаются любым кодом, имеющим ссылку на массив, как показано в приведенном ниже примере:

static void Main(string[] args) < int[,] matrix = new int[2, 2]; FillMatrix(matrix); // matrix is now full of -1 >public static void FillMatrix(int[,] matrix) < for (int i = 0; i < matrix.GetLength(0); i++) < for (int j = 0; j < matrix.GetLength(1); j++) < matrix[i, j] = -1; >> > 

Асинхронные методы

С помощью функции async можно вызывать асинхронные методы, не прибегая к использованию явных обратных вызовов или ручному разделению кода между несколькими методами или лямбда-выражениями.

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

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

В следующем примере метод Main служит примером асинхронного метода с типом возврата Task. Он переходит к методу DoSomethingAsync и, поскольку он выражается в одной строке, он может опустить ключевые слова async и await . Поскольку DoSomethingAsync является асинхронным методом, задача для вызова DoSomethingAsync должна быть ожидаемой, как показывает следующая инструкция: await DoSomethingAsync(); .

class Program < static Task Main() =>DoSomethingAsync(); static async Task DoSomethingAsync() < TaskdelayTask = DelayAsync(); int result = await delayTask; // The previous two statements may be combined into // the following statement. //int result = await DelayAsync(); Console.WriteLine($"Result: "); > static async Task DelayAsync() < await Task.Delay(100); return 5; >> // Example output: // Result: 5 

Асинхронный метод не может объявить все параметры ref или out , но может вызывать методы, которые имеют такие параметры.

Определения текста выражений

Часто используются определения методов, которые просто немедленно возвращаются с результатом выражения или которые имеют единственную инструкцию в тексте метода. Для определения таких методов существует сокращенный синтаксис с использованием => :

public Point Move(int dx, int dy) => new Point(x + dx, y + dy); public void Print() => Console.WriteLine(First + " " + Last); // Works with operators, properties, and indexers too. public static Complex operator +(Complex a, Complex b) => a.Add(b); public string Name => First + " " + Last; public Customer this[long id] => store.LookupCustomer(id); 

Если метод возвращает void или является асинхронным методом, то текст метода должен быть выражением инструкции (так же, как при использовании лямбда-выражений). Свойства и индексаторы должны быть только для чтения, и вы не должны использовать ключевое слово get метода доступа.

Итераторы

Итератор выполняет настраиваемую итерацию по коллекции, например по списку или массиву. Итератор использует инструкцию yield return для возврата всех элементов по одному. При достижении инструкции yield return текущее расположение в коде запоминается. При следующем вызове итератора выполнение возобновляется с этого места.

Итератор вызывается из клиентского кода с помощью инструкции foreach .

Дополнительные сведения см. в разделе Итераторы.

Спецификация языка C#

Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

См. также

  • Руководство по программированию на C#
  • Система типов C#
  • Модификаторы доступа
  • Статические классы и члены статических классов
  • Наследование
  • Абстрактные и запечатанные классы и члены классов
  • params
  • out
  • ref;
  • Параметры методов

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Energy
education

C#

Объектно-ориентированный язык программирования. Разработан в 1998—2001 годах группой инженеров под руководством Андерса Хейлсберга в компании Microsoft как язык разработки приложений для платформы Microsoft .NET Framework и впоследствии был стандартизирован как ECMA-334 и ISO/IEC 23270.

11. Методы

Метод представляет собой группу операторов, которые предназначены для выполнение определенной задачи. Каждая программа на языке C# имеет как минимум один класс с методом Main.

Для того, чтобы мспользовать методы необходимо:

  • Определить метод
  • Вызвать метод
Определение методов в C#

Когда вы определяете метод, вы по сути, объявляете элементы его структуры. Синтаксис для определения метода в C# следующий:

   (Parameter List)

Ниже приведены различные элементы метода:

  • Спецификатор доступа: Необходим для определения видимости переменных или методов для других классов.
  • Возвращаемый тип: Метод может возвращать значение. Тип возвращаемого значения это тип данных для возвращаемого значения метода. Если метод не возвращает значение, тогда тип возвращаемоего значения будет void.
  • Имя метода: Имя метода это уникальный индитификатор и он регистрозависимый.
  • Список параметров: Записаные в скобках параметры используются для передачи и получения данных в метод и из него. Список параметров включет описание типа, порядка и количества параметров метода. Параметры являются необязательными, то есть метод может не иметь параметров.
  • Тело метода: Содержит набор инструкций, необходимых для завершения требуемой операции.
Пример:

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

 class NumberManipulator < public int FindMax(int num1, int num2) < /* объявление локальной переменной */ int result; if (num1 >num2) result = num1; else result = num2; return result; > . > 
Вызов методов в C#

Можно вызвать метод с использованием имя метода. Следующий пример иллюстрирует это:

 using System; namespace CalculatorApplication < class NumberManipulator < public int FindMax(int num1, int num2) < /* объявление локальной переменной */ int result; if (num1 >num2) result = num1; else result = num2; return result; > static void Main(string[] args) < /* объявление локальных переменных */ int a = 100; int b = 200; int ret; NumberManipulator n = new NumberManipulator(); //вызов метода FindMax ret = n.FindMax(a, b); Console.WriteLine("Максимальное значение : ", ret ); Console.ReadLine(); > > 

Если приведенный выше код скомпилировать и выполнить, это приведет к следующему результату:

 Максимальное значение : 200 

Также можно вызывать методы со спецификатором доступа public из других классов с помощью экземпляра класса. Например, метод FindMax принадлежит классу NumberManipulator. Его можно вызвать из другого класса Test.

 using System; namespace CalculatorApplication < class NumberManipulator < public int FindMax(int num1, int num2) < /* объявление локальной переменной */ int result; if (num1 >num2) result = num1; else result = num2; return result; > > class Test < static void Main(string[] args) < /* объявление локальных переменных */ int a = 100; int b = 200; int ret; NumberManipulator n = new NumberManipulator(); //вызов метода FindMax ret = n.FindMax(a, b); Console.WriteLine("Максимальное значение : ", ret ); Console.ReadLine(); > > > 

Если приведенный выше код скомпилировать и выполнить, это приведет к следующему результату:

 Максимальное значение : 200 
Рекурсивный вызов метода

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

 using System; namespace CalculatorApplication < class NumberManipulator < public int factorial(int num) < /* объявление локальной переменной */ int result; if (num == 1) < return 1; >else < result = factorial(num - 1) * num; return result; >> static void Main(string[] args) < NumberManipulator n = new NumberManipulator(); //calling the factorial method Console.WriteLine("Факториал 6 : ", n.factorial(6)); Console.WriteLine("Факториал 7 : ", n.factorial(7)); Console.WriteLine("Факториал 8 : ", n.factorial(8)); Console.ReadLine(); > > > 

Если приведенный выше код скомпилировать и выполнить, это приведет к следующему результату:

 Факториал 6 : 720 Факториал 7 : 5040 Факториал 8 : 40320 
Передача параметров в метод

Когда вызывается метод с параметрами, необходимо передать параметры методу. В C# есть три способа передать параметры методу:

Механизм Описание
Значения этот способ копирует действительное значение аргумента в формальный параметр метода. В этом случае, изменение параметра внутри метода не влияют на значение аргумента.
Ссылки Этот способ копирует ссылки на область памяти где расположен аргумент в формальный параметр метода. Это означает что изменение параметра влияют на аргумент.
Выходные параметры В этом случае можно вернуть несколько значений.
Передача параметров по значению

Это самый распространеный механизм передачи параметров в метод. В этом случае, когда метод вызывается, создается копия для каждого из передаваемых парамеров. В этом случае, изменение параметра внутри метода не влияют на значение аргумента. Следующий пример демонстрирует это:

 using System; namespace CalculatorApplication < class NumberManipulator < public void swap(int x, int y) < int temp; temp = x; /* сохраняет значение x */ x = y; /* помещает значение y в x */ y = temp; /* помещает значение temp в y */ >static void Main(string[] args) < NumberManipulator n = new NumberManipulator(); /* объявление локальных переменных */ int a = 100; int b = 200; Console.WriteLine("До замены, значение a : ", a); Console.WriteLine("До замены, значение b : ", b); /* вызыв метода swap */ n.swap(a, b); Console.WriteLine("После замены, значение a : ", a); Console.WriteLine("После замены, значение b : ", b); Console.ReadLine(); > > > 

Если приведенный выше код скомпилировать и выполнить, это приведет к следующему результату:

 До замены, значение of a :100 До замены, значение of b :200 После замены, значение of a :100 После замены, значение of b :200 

Это показывает, что никаких изменений значений не произошло, даже при изменении их значений внутри метода.

Передача параметров по ссылке

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

В C# объявление параметра ссылки происходит использыя ключевое слово ref. Следующий пример демонстрирует это:

 using System; namespace CalculatorApplication < class NumberManipulator < public void swap(ref int x, ref int y) < int temp; temp = x; /* сохраняет значение x */ x = y; /* помещает значение y в x */ y = temp; /* помещает значение temp в y */ >static void Main(string[] args) < NumberManipulator n = new NumberManipulator(); /* объявление локальных переменных */ int a = 100; int b = 200; Console.WriteLine("До замены, значение a : ", a); Console.WriteLine("До замены, значение b : ", b); /* вызыв метода swap */ n.swap(ref a, ref b); Console.WriteLine("После замены, значение a : ", a); Console.WriteLine("После замены, значение b : ", b); Console.ReadLine(); > > > 

Если приведенный выше код скомпилировать и выполнить, это приведет к следующему результату:

 До замены, значение a : 100 До замены, значение b : 200 После замены, значение a : 200 После замены, значение b : 100 

Это показывает, что значения параметров изменились внутри метода swap и эти изменения отразидись в методе Main.

Передача выходных параметров

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

Следующий пример иллюстрирует это:

 using System; namespace CalculatorApplication < class NumberManipulator < public void getValue(out int x ) < int temp = 5; x = temp; >static void Main(string[] args) < NumberManipulator n = new NumberManipulator(); /* объявление локальной переменной */ int a = 100; Console.WriteLine("До вызова метода, значение a : ", a); /* вызов метода getValue */ n.getValue(out a); Console.WriteLine("После вызова метода, значение a : ", a); Console.ReadLine(); > > > 

Если приведенный выше код скомпилировать и выполнить, это приведет к следующему результату:

 До вызова метода, значение a : 100 После вызова метода, значение a : 5 

Несмотря на то, что переменные, передаваемые в качестве выходных параметров могут не инициализироваться перед передачей, вызывающий метод должен присвоить значение перед возвратом метода. Выходные параметры особенно полезны когда необходимо вернуть значения из метода через параметры без инициализаций значений параметров. Посмотрите следующий пример, чтобы понять это:

 using System; namespace CalculatorApplication < class NumberManipulator < public void getValues(out int x, out int y ) < Console.WriteLine("Введите первое значение: "); x = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Введите второе значение: "); y = Convert.ToInt32(Console.ReadLine()); >static void Main(string[] args) < NumberManipulator n = new NumberManipulator(); /* объявление локальной переменной */ int a , b; /* вызов метода getValues */ n.getValues(out a, out b); Console.WriteLine("После вызова метода, значение a : ", a); Console.WriteLine("После вызова метода, значение b : ", b); Console.ReadLine(); > > > 

Если приведенный выше код скомпилировать и выполнить, это приведет к следующему результату (в зависимости от ввода пользователя):

 Введите первое значение: 7 Введите второе значение: 8 После вызова метода, значение a : 7 После вызова метода, значение b : 8 

Администратор сайта: Колосов Михаил
email:
Copyright © 2011-2024. All rights reserved.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *