Similar presentations:
Методы и строки. Часть 3
1.
МетодыМетод – это набор операторов, организованный в соответствии с синтаксисом:
[Модификаторы] Тип Имя (список входных параметров) { Тело метода }
Модификаторы – это ключевые слова, обеспечивающие режим использования метода.
Пока (в данном разделе) будет использован только модификатор static, т.к. он позволяет
использовать метод без необходимости создания объекта.
Тип (метода) – это всегда тип единственного значения, которое метод может
возвращать в точку вызова. Конкретное возвращаемое значение определяется аргументом
оператора return имя. Если тип метода void, то оператор return (без аргумента) в теле
метода может отсутствовать, а возврат в точку вызова произойдёт после прохождения
«потоком выполнения» закрывающей фигурной скобки тела метода.
Список входных параметров представляет собой перечисление объявлений объектов,
используемых для передачи данных в метод. Он определяет типы, количество и порядок
следования переменных и называется сигнатурой. Эти переменные локализуются в теле
метода. В отличие от обычных объявлений в списке входных аргументов после каждого
типа должно быть только одно имя.
Тело метода – это фрагмент логически завершённого кода. Тело метода может иметь
произвольное количество операторов return, каждый из которых должен возвращать
значение, соответствующее типу метода.
Передача управления методу (для начала его работы) осуществляется оператором
вызова:
Имя_объекта = Имя_метода (список фактических аргументов);
Элементами списка фактических аргументов могут быть переменные или константы,
тип и порядок следования которых точно соответствует сигнатуре. Если метод
объявлен void, или если возвращаемое значение не используется, часть оператора
вызова «Имя_объекта=» опускается.
1
2.
Пример на объявление, вызов и перегрузка методовusing System;
class Методы
{static void Main()
{
bool a = true, b = false;
int c = 9, d = 10;
Console.WriteLine("До методов:\na={0},b={1},c={2},d={3}",a,b,c,d);
andor(a, b);
andor(c, d);
Console.WriteLine("После методов:\na={0},b={1},c={2},d={3}",a,b,c,d);
}
static void andor(bool a, bool b)
{
Console.WriteLine("В методе andor(bool,bool)");
Console.WriteLine("ИЛИ {0}", a || b);
Console.WriteLine("И
{0}", a && b);
a = false; b = true;
Console.WriteLine("a={0},b={1}",a, b);
}
static void andor(int a, int b)
{
Console.WriteLine("В методе andor(int,int)");
Console.WriteLine("ИЛИ {0}", a | b);
Console.WriteLine("И
{0}", a & b);
a = b = 100;
Console.WriteLine("a={0},b={1}",a,b);
}
}
Методы с одинаковыми именами, но различной сигнатурой
называются перегруженными
2
3.
Механизм передачи входных аргументовпо списку входных аргументов метода выделяется соответствующее
количество ячеек в стеке;
в каждую из выделенных ячеек копируется значение соответствующего
входного аргумента;
выделенная ячейка стека становится доступной в теле метода под
именем, заданным в списке входных аргументов;
по завершению выполнения метода ячейки с копиями входных
аргументов удаляются из стека
3
4.
Модификаторref
- это способ передачи вызываемому методу ссылок на объекты,
поименованные в списке входных аргументов (а не копий их значений).
Модификатор ref указывается дважды, и в точке вызова, и в заголовке
метода:
using System;
class Методы
{
static void Main()
{
int a = 1, b = 5, c = 10;
Console.WriteLine("Аргументы до вызова = {0}, {1}, {2}",a, b,c);
среднее(ref a, ref b, ref c);
Console.WriteLine("Аргументы после вызова={0}, {1}, {2}",a,b,c);
}
static void среднее(ref int a, ref int b, ref int c)
{
Console.WriteLine("Ср.арифм. значение = {0:f5}",(a+b+c)/3.0);
a = b = c = 0;
Console.WriteLine("Аргументы в методе={0}, {1}, {2}",a,b,c);
}
}
Входной параметр метода можно пометить также модификатором out
(выходной). При этом параметр может не получать значения до вызова метода,
4
но обязательно должен получить значение в теле метода
5.
Массив в качестве входного аргумента методаПередать ссылку (адрес) вместо копии значения объекта можно и в случае, когда
в качестве входного аргумента используется массив, т.к. массив – это изначально
ссылочный объект и его значением является адрес памяти, где реально
размещены элементы массива
using System;
class Методы
{
static void Main()
{
int[] a = { 1, 5, 10 };
float ср_ар;
среднее(a, out ср_ар);
Console.WriteLine("Среднеарифметическое значение={0:f5}",ср_ар);
Console.WriteLine("a[0] = {0}", a[0]);
}
static void среднее(int[] mass, out float ср_ар)
{
ср_ар = 0;
foreach( int i in mass)ср_ар += i;
ср_ар /= mass.Length;
mass[0] = 0;
}
}
5
6.
Модификатор paramsВ случае, когда в точке вызова метода используется несколько входных
аргументов одного типа, в самом методе они могут быть определены, как
элементы массива. Для этого в заголовке метода объявляется массив
соответствующего типа с модификатором params:
using System;
class Методы
{
static void Main()
{
int a = 1, b = 5, c = 10;
float ср_ар;
среднее( out ср_ар, a, b, c);
Console.WriteLine("Среднеарифметическое значение={0:f5}",ср_ар);
}
static void среднее(out float ср_ар, params int[] mass)
{
ср_ар = 0;
foreach( int i in mass)
ср_ар += i;
ср_ар /= mass.Length;
}
}
Массив, объявленный с модификатором params,
должен размещаться в конце списка входных аргументов
6
7.
Метод с возвращаемым значениемusing System;
class Методы
{ static void Main()
{
int a = 1 , b= 5, c= 10 ;
float ср_ар;
ср_ар = среднее( a, b, c);
Console.WriteLine("Среднеарифметическое значение={0:f5}",ср_ар);
Console.WriteLine(a);
}
static float среднее(params int[] mass)
{
float ср_ар = 0;
foreach( int i in mass)
ср_ар += i;
ср_ар /= mass.Length;
mass[0] = 0;
return ср_ар;
}
}
Обнуление нулевого элемента массива mass в методе среднее() не изменило
содержимого переменной а в методе Mаin:
в массиве mass, по-прежнему, находятся копии объектов
7
8.
СтрокиСтроки в языке С# являются объектами встроенного класса System.String и поэтому
относятся к ссылочным типам: при объявлении локальной строки в стеке создаётся
ссылка на объект, размещённый в динамической области памяти.
Для работы со строками обычно используют псевдоним string.
Содержимым строки является массив char-элементов.
В отличие от терминальных строк (в языках С и С++) в данном случае нуль-символ
(символ с кодом 0) в конце char-массива отсутствует
Варианты инициализации строк
using System;
class Строки1
Конста
{
нтой
static void Main
Массивом char{
элементов
string строка1="Содержимое строки";
Console.WriteLine("строка1 \"{0}\" длиной={1}символов",строка1,строка1.Length);
char[] массив = {'Т','о','ж','е',' ','с','т','р','о','к','а'};
string строка2 = new string(массив);
Console.WriteLine("строка2 \"{0}\" длиной={1} символов",строка2,строка2.Length);
Console.WriteLine("Начальные символы {0} и {1}",строка1[0],строка2[0]);
string строка3 = new string('A',10);
символом и
string строка4 = new string(массив, 5, 6);
коэффициентом
Console.WriteLine("строка3 ={0}, строка4 = {1}“,строка3,
строка4);
}
повтора
Массивом
char-элементов
с
указанием
}
начального элемента и количества элементов
8
9.
Операции и методы для работы со строкамиОперации
Конкатенация (слияние) строк.
+
Количество объединяемых строк
не ограничено (string)
Посимвольное сравнение
==
содержимого двух строк на
предмет их совпадения (true)
Посимвольное сравнение
!=
содержимого двух строк на
предмет их несовпадения (true)
Методы
Сравнение вызывающей строки со
строкой str : если значение
вызывающей строки меньше,
int CompareTo(string str)
возвращает отрицательное
число, если больше –
положительно, если равно – нуль
static string Copy(string str)
Копирование строки
int IndexOf(string str)
Поиск подстроки
int LastIndexOf(string str)
Поиск последней подстроки
string Insert
Вставка в вызывающую строку
(int index, string str)
подстроки str с индекса index
static string Join
Объединение разделителем str
(string str,params string[ ] mas) строк из массива mas
Расщепление вызывающей строки
string[ ] str Split
10.
Операции со строкамиusing System;
class Строки
{
static void Main()
{
string строка1="Первая";
string строка2 ="Первая";
Console.WriteLine("Строки 1и2 совпадают ? = {0}",строка1==строка2);
строка1 += строка2;
Console.WriteLine("Строки 1и2 совпадают ? = {0}",строка1 == строка2);
строка2 += "строка";
Console.WriteLine("Строки 1и2 совпадают ? = {0}",строка1 == строка2);
int res = строка1.CompareTo(строка2);
if(res==0) Console.WriteLine("Строкa 1 == 2");
else if (res < 0) Console.WriteLine("Строкa 1 < 2");
else Console.WriteLine("Строкa 1 > 2");
Console.WriteLine("строка1 = {0}", строка1);
Console.WriteLine("строка2 = {0}", строка2);
}
}
10
11.
Массивы строкusing System;
class Строки3
{
static void Main()
{
string[] мс1 ={"один", "два", "три"};
string[] мс2 = new string[3];
мс2[0] = "четыре";
мс2[1] = "пять";
мс2[2] = "шесть";
Console.WriteLine("Массив мс1:");
foreach( string i in мс1)
Console.Write(i+" ");
Console.WriteLine("\nМассив мс2:");
foreach (string i in мс2)
Console.Write(i + " ");
}
}
11
12.
Массивы строк, методы Replace(), Split() и Join()using System;
class Строки
{
static void Main()
{
string строка1="29.01.09";
Console.WriteLine("исходная строка: {0}", строка1);
строка1 = строка1.Replace("09", "2009");
string[] mass = строка1.Split('.');
строка1 = string.Join(":", mass);
Console.WriteLine("обработанная строка: {0}", строка1);
}
}
Массив строк mass используется в данном примере для размещения
расщеплённой строки
12