Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Модификаторы для параметров методов

Тип bool.

Тип bool представляет значения ИСТИНА\ЛОЖЬ, которые в C# определяются зарезервированными словами true и false. Переменная или выражение типа bool будет иметь одно из этих двух значений. В C# не определено ни одно преобразование значения типа bool в целочисленное значение. Например, число 1 не преобразуется в значение true, а число 0 – в значение false.

Пример.

Using System;

Class BoolType

{ public static int Main(string[] args)

{ bool b;

b= false;

Console.WriteLine("b содержит” + b);

b= true;

Console.WriteLine("b содержит” + b);

if(b) Console.WriteLine("эта инструкция выполняется”); // управляет if-инструкцией

b= false;

if(b) Console.WriteLine("эта инструкция не выполняется”);

Console.WriteLine("10>9 равно” + (10>9));

// оператор отношения возвращает результат типа bool

return 0;

}

}

Эта программа выводит:

b содержит FALSE

b содержит True

эта инструкция выполняется

10>9 равно True

 

В большинстве случаев методы используют параметры. Модификаторы для параметров методов могут быть такими:

1) in (по умолчанию) - Параметр с модификатором in - это входящий параметр, передаваемый как значение.

2) out - исходящий параметр, который возвращается вызванным методом вызывающему.

3) ref - исходное значение присваивается вызывающим методом, но оно может быть изменено вызванным методом.При этом происходит передача параметра по ссылке.

4) params - Этот модификатор позволяет передавать целый набор параметров как единое целое. В любом методе может быть только один модификатор params, и параметр с этим модификатором может быть только последним параметром в списке параметров метода.

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

CLR также позволяет передавать параметры ссылкой, а не значением. В С# это делается с помощью ключевых слов out и ref. Оба модификатора заставляют компилятор генерировать код, передающего вместо самого параметра его адрес.

Разница между этими ключевыми словами касается метода инициализации объекта, на который указывает переданная ссылка. Если параметр метода помечен ключевым словом out, то вызывающий код может не инициализировать его, пока не будет вызван этот метод. В этом случае вызванный метод не может читать значение параметра и должен записать его, прежде чем вернуть управление. Если параметр метода помечен ключевым словом ref, то вызывающий код должен инициализировать его перед вызовом этого метода, а вызванный метод может, как читать, так и записывать значение параметра.

Использование ключевых слов out и ref с размерными и ссылочными типами существенно отличается.

Пример их использование сразмерными типами:

class Арр

{ static void Main()

{ Int32 x;

SetVal(out x); // Инициализировать параметр ж не обязательно.

Consol.WriteLine(x); // Выводит на консоль "10".

}

static void SetVal(out Int32 v)

{ v = 10;} // Этот метод должен инициализировать v.

}

В синтаксисе вызова метода используется ключевое слово out. Переменная х объявлена в стеке потока, ее адрес передается методу SetVal. Параметр этого метода v представляет собой указатель на размерный тип Int32. Внутри метода SetVal значение Int32, на которое указывает v, изменяется на 10. Когда SetVal возвращает управление, х равно 10, то же самое значение выводится на консоль.

Использование out с размерными типами эффективно, так как оно предотвращает копирование экземпляров размерного типа при вызовах методов.

Пример, в котором вместо out использовано ключевое слово ref:

using System;

class Арр

{ static void Main()

{ Int32 x = 5;

AddVal(ref x); //Параметр x должен быть инициализирован.

Console.WriteLine(x); //Выводит на консоль "15".

}

static void AddVal(ref Int32 v)

{v += 10;} // Этот метод может использовать инициализированный параметр v

}

Переменная х объявлена в стеке потока и инициализирована значением 5. Далее адрес х передается методу AddVal, чей параметр v является указателем на размерный тип Int32. Внутри метода AddVal должно быть уже инициализированное значение Int32, на которое указывает параметр v. Таким образом, AddVal может использовать первоначальное значение v в любом выражении. AddVal также может изменить это значение, тогда вызывающему коду «вернется» уже новое значение. В этом примере AddVal прибавляет к исходному значению 10. Когда AddVal возвращает управление, переменная х метода Main содержит значение «15», которое затем выводится на консоль.

 

С точки зрения IL или CLR, ключевые слова out и ref ничем не отличаются: оба заставляют передать указатель на экземпляр объекта. Разница в том, что они помогают компилятору гарантировать отсутствие ошибок в коде.

Следующий код пытается передать методу, ожидающему параметр ref, неинициализированное значение, чем вызывает ошибку компиляции:

Int32 x;

AddVal{ref х); //ошибка при компиляции

 

Кроме того, CLR позволяет по-разному перегружать методы в зависимости от того, параметры с каким модификатором в них используются.

Следующий код допустим и прекрасно компилируется:

class Point {

static void Add(Point p) {... }

static void Add(ref Point p) {... }

}

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

Поэтому в показанном выше типе Point нельзя определить метод:

static void Add(out Point p){...}

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

В случае ссылочных типов вызывающий код выделяет память для указателя на передаваемый объект, а вызванный код манипулирует этим указателем. Если параметр ссылочного типа указывается с одним из модификаторов ref и out, то по сути реализуется передача ссылки по ссылке. В силу этих особенностей использование ключевых слов out и ref со ссылочными типами полезно, лишь когда метод собирается «вернуть» ссылку на известный ему объект.

Пример

class SomeType

{public int32val;}

class App

{ static void Main()

{ SomeType ob;

CreateOb(out ob); // если без out, то компилятор выдаст сообщение использования

// локальной переменной ob, которой не присвоено значение.

Console.WriteLine(ob.val);

}

static void CreateOb(out SomeType a)

{ a=new SomeType();

a.val = 30; }

}

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

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

Пример программы, меняющей местами строки:

using System;

class Арр

{ static public void Swap(ref Object a, ref Object b)

{ Object t = b;

b = a;

a = t;

}

static void Main()

{ String s1 = "Jeffrey";

String s2 = "Richter"; // Типы переменных, передаваемых ссылкой,

// должны соответствовать ожидаемым методом.

Object ol = s1; о2 = s2;

Swap(ref ol, ref o2); // Теперь преобразуем объекты обратно в строки,

s1 = (String) ol;

s2 = (String) o2;

Console.WriteLine(s1); // Выводит "Richter"

Console.WriteLine(s2); // Выводят "Jeffrey"

}

}

Использование переменного количества параметров.

 

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

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

Здесь необходимо применить специальный тип параметра, который заменяет собой произвольное количество параметров. Это реализуется с помощью модификатора params.

Этот модификатор используется для передачи набора параметров (в неопределенном количестве) как одного параметра. Модификатор params используется для объявления параметра-массива, который сможет получить некоторое количество аргументов (в том числе и нулевое). Количество элементов в массиве будет равно числу аргументов, переданных методу.

Пусть имеется метод

static void Display(string msg, params int[] list)

{ Console.WriteLine(msg);

for (int i = 0; i < listLength; i++)

Console.WriteLine(list[i]);

}

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

public static void Main()

{ //Передаем значения методу, объявленному с модификатором params

int[] IntArray = new int[4]{10,11,12,16};

Display("Maccив”, IntArray);

Display("Три целых", 1, 2, 3);

Disp1ау("Сколько угодно", 55,983,98,33); }

<== предыдущая лекция | следующая лекция ==>
Особенности типов данных char. Литералы | 
Поделиться с друзьями:


Дата добавления: 2015-08-31; Просмотров: 411; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.