Методы в Си Шарп. Методы классов Как в c сам создался метод

Методы в Си Шарп | C#

Методы - это написанный код, который употребляется много раз (много раз вызывается). И для упрощения кода программы, использование метода очень важно. Метод - это новое слово в языке Си Шарп, старое слово - это функция.

Методы логичны, если данный код выполняется более 2-х раз. Тогда проще объявить имя метода, какие значения он принимает, и написать код, который бы выпонялся правильно при всех значениях, которые принимает метод.

Для того, чтобы объявить методы в C#, необходимо написать следующее:

ТИП_ВОЗВРАЩАЕМОГО_ЗНАЧЕНИЯ ИМЯ_ФУНКЦИИ (ПЕРЕМЕННЫЕ) { КОД_МЕТОДА }

Если вам не нужно что-то возвращать, то можно писать в ТИП_ВОЗВРАЩАЕМОГО_ЗНАЧЕНИЯ - void .

1. Функция не возвращающая значения и не принимающая аргументы:

void printError()
{
Console .Write("Error! Press Key..." );
Console .ReadKey();
}

2. Функция не возвращающая значения, но принимающая аргумент:

void printError(string s)
{
Console .Write("Error! " + s + "Press Key..." );
Console .ReadKey();
}

3. Функция не возвращающая значения, но принимающая аргументы:

void printError(string s, int i)
{
Console .Write("Error! " + s + " " + i + "Press Key..." );
Console .ReadKey();
}

3. Функция возвращающая значения, и принимающая аргументы:

char shifr(char x, int shifr)
{
x = (char )(x + shifr);
return x;
}

Вот пример программы, с применением методов: работа с методами ...

Также к методу можно устанавливать уровень защиты: private, public.

К примеру:

private char shifr(char x, int shifr)
{
x = (char )(x + shifr);
return x;
}

public char shifr(char x, int shifr)
{
x = (char )(x + shifr);
return x;
}

Использование и создание методов в программе на С# во многом схоже на уже известный вам подход из С++. Рассмотрим это поподробней. В C# любой метод является методом какого-либо класса. Например:

Using System; class Man{ public string name; public int age; public Man(string n,int a){ name = n; age = a; } public void Show(){ Console.WriteLine("Имя = "+name+"\tВозраст = "+age); } } class Sample { static void Main() { try{ Man obj = new Man("Fire",56); obj.Show(); } catch(Exception er){ Console.WriteLine(er.Message); } Console.Read(); } }

В данном примере у нас есть класс Man с методом Show и конструктором. Обратите внимание возле Show стоит спецификатор доступа public. Если его не указать по умолчанию будет поставлен private и вызвать его из класса Sample не получится. Для возврата значений и выхода из метода также как и в С++ используется оператор return. Принцип использования демонстрируется в примере:

Using System; class SomeClass{ public float x; public float y; public SomeClass(float a,float b){ x = a; y = b; } public float Summa(){ return x+y; } public void Test(float t){ if(t == 0){ Console.WriteLine("Для деления был передан 0"); return; } Console.WriteLine(" Результат = ",(x+y)/t); } } class Sample { static void Main() { try{ SomeClass obj = new SomeClass(2,3); Console.WriteLine("Сумма равна = "+obj.Summa()); obj.Test(0); } catch(Exception er){ Console.WriteLine(er.Message); } Console.Read(); } }

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

В C# есть два способа передачи параметров методу по значению, и по ссылке. В первом случае внутрь метода попадает не оригинальная переменная. а её копия, которая разрушается при выходе из метода не оказывая влияния на оригинальную переменную. При передаче методу значений обычных типов, таких как int, double и т.д. используется передача по значению. Следовательно, при изменение параметра, никакого влияния на оригинальную переменную не происходит. Например:

Using System; class SomeClass{ public float x; public SomeClass(float a){ x = a; } public void TryToSetTo99(float res){ res = 99; } public float Mult(float res){ return res*x; } } class Sample { static void Main() { try{ SomeClass obj = new SomeClass(2); float test = 5; obj.TryToSetTo99(test); Console.WriteLine(test); // 5 Console.WriteLine(obj.Mult(test)); // 10 } catch(Exception er){ Console.WriteLine(er.Message); } Console.Read(); } }

Легко заметить, что переменная test не изменила своё значение после передачи её в TryToSetTo99.Теперь рассмотрим второй способ передачи параметров - по ссылке. В этом случае передается не копия переданного параметра, а ссылка на оригинальный объект, что позволяет модифицировать оригинал. По ссылке всегда автоматически передаются объекты классов. Например:

Using System; class SomeClass{ public int x; public int y; } class SomeClass2{ public void Set(SomeClass obj){ obj.x=1; obj.y=2; } } class Sample { static void Main() { try{ SomeClass obj = new SomeClass(); SomeClass2 obj2 = new SomeClass2(); obj.x = 8; obj.y = 9; obj2.Set(obj); // передаётся по ссылке Console.WriteLine(obj.x+" "+obj.y); // 1 2 } catch(Exception er){ Console.WriteLine(er.Message); } Console.Read(); } }

Как изменить значение для переменной типа int или double при передаче её внутрь метода будет показано в следующем разделе. В С#, как и в С++. можно перегружать методы. Правила при перегрузке такие же, как и в С++.

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

Статическим методом называется метод с модификатором static. Разница между обычным методом класса и таким состоит в том, что метод с static модификатором может быть вызван без создания какого-либо объекта класса. Например:

Using System; class Figure{ public static void Draw(){ Console.WriteLine("FigureDraw"); } } class Sample { static void Main() { try{ Figure.Draw(); } catch(Exception er){ Console.WriteLine(er.Message); } Console.Read(); } }

Отличия static - методов от обычных:

  1. Методы с модификатором static не имеют ссылки this.
  2. Метод с модификатором static, может непосредственно(без указания имени объекта) вызывать только другой статический метод.
  3. Метод с модификатором static имеет только прямой доступ к static - данным.
Например: using System; class Figure{ public int a; public void Line(){ Console.WriteLine("*************"); } public static void Draw(){ a = 78; // ОШИБКА!!! a не static - член Console.WriteLine("FigureDraw"); Line(); //// ОШИБКА!!! Line не static - метод } public static void Draw2(Figure t){ t.Line(); // А так можно!!! } } class Sample { static void Main() { try{ Figure.Draw(); Figure.Draw2(); } catch(Exception er){ Console.WriteLine(er.Message); } Console.Read(); } }

Методы

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

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

В C# определение метода состоит из любых модификаторов (таких как спецификация доступности), типа возвращаемого значения, за которым следует имя метода, затем список аргументов в круглых скобках и далее - тело метода в фигурных скобках:

[модификаторы] тип_возврата ИмяМетода([параметры]) { // Тело метода }

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

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

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

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

Давайте рассмотрим пример:

Using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class MyMathOperation { public double r; public string s; // Возвращает площадь круга public double sqrCircle() { return Math.PI * r * r; } // Возвращает длину окружности public double longCircle() { return 2 * Math.PI * r; } public void writeResult() { Console.WriteLine("Вычислить площадь или длину? s/l:"); s = Console.ReadLine(); s = s.ToLower(); if (s == "s") { Console.WriteLine("Площадь круга равна {0:#.###}",sqrCircle()); return; } else if (s == "l") { Console.WriteLine("Длина окружности равна {0:#.##}",longCircle()); return; } else { Console.WriteLine("Вы ввели не тот символ"); } } } class Program { static void Main(string args) { Console.WriteLine("Введите радиус: "); string radius = Console.ReadLine(); MyMathOperation newOperation = new MyMathOperation { r = double.Parse(radius) }; newOperation.writeResult(); Console.ReadLine(); } } }

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

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

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

Давайте рассмотрим пример:

Using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class myClass { public void someMethod(double myArr, int i) { myArr = 12.0; i = 12; } } class Program { static void Main(string args) { double arr1 = { 0, 1.5, 3.9, 5.1 }; int i = 0; Console.WriteLine("Массив arr1 до вызова метода: "); foreach (double d in arr1) Console.Write("{0}\t",d); Console.WriteLine("\nПеременная i = {0}\n",i); Console.WriteLine("Вызов метода someMethod ..."); myClass ss = new myClass(); ss.someMethod(arr1,i); Console.WriteLine("Массив arr1 после вызова метода:"); foreach (double d in arr1) Console.Write("{0}\t",d); Console.WriteLine("\nПеременная i = {0}\n",i); Console.ReadLine(); } } }

в 16 уроке мет рассказывал про классы, ну вот я продолжу эту тему.
Он объявлял переменные открытыми(public), вобще не рекомендуется объявлять их открытыми если с ними работают только методы. Эти переменные из любой части кода вызываются с помощью объектов класса. Ну вобще существует не только этот модификатор(public) есть еще 3: internal - переменные доступны в пределах 1 namespace, private - переменные доступны только в пределах класса и protected - почти такойже как и private, но только переменные доступны еще и классам наследникам. И про методы они также могут быть с такими же модификаторами(public, private и т.д) и могут возращать значение(int, double, bool и т.д) и если метод возращает значение у него должны быть параметры(то что у метода в скобках), они объявляются как переменные и разделяются запятыми и при вызове метода их указывают значения для них в порядке их объявления. И сделаем консольный калькулятор. Вот код:

Using System; //подключаем пространство имен class Program { /* * назначаем 2 закрытые переменные * типа double модификатор можно * не указывать т.к он по умол * чанию закрытый(private) */ double FN = 0.0; double SN = 0.0; public void SetFNandSN() //делаем открытый метод не возвращающий значение { Console.WriteLine(); Console.Write("Введите 1 число: "); FN = Convert.ToDouble(Console.ReadLine()); Console.Write("Введите 2 число: "); SN = Convert.ToDouble(Console.ReadLine()); /* * вызываем метод SimpleCalculate * и не нужно создавать объект т.к * метод в этом же классе */ SimpleCalculate(); } void SimpleCalculate() //создаем закрытый метод т.к он вызывается только из этого класса { Console.WriteLine(); Console.WriteLine("Сумма: " + (FN + SN)); Console.WriteLine("Разность: " + (FN - SN)); Console.WriteLine("Частное: " + (FN / SN)); Console.WriteLine("Произведение: " + (FN * SN)); Console.WriteLine(); } } class DemoProgram { static int Main() { Program ob = new Program(); //создаем новый объект int intvar1 = 0; Console.WriteLine("Сколько раз производить вычисления?"); intvar1 = Convert.ToInt32(Console.ReadLine()); //конвертируем наш ответ в тип int for(int i = 0; i < intvar1; i++) { ob.SetFNandSN(); //вызываем метод } Console.ReadKey(); //ожидаем нажатия любой клавиши return 0; //возвращаем значение 0 т.к Main() должен возвращать значение int } }

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