Функции структур В предшествующей главе рассматривались типы структур, предназначенных для хранения в одном месте нескольких элементов информации. На самом деле воз- можностей у структур гораздо больше, и одной из них является способность содер- жать не только данные, но и функции. На первый взгляд подобное может показаться немного странным, однако на практике это приносит много пользы. 126 Глава 6 В качестве простого примера рассмотрим следующую структуру: struct customerName { . public string firstName, lastName; ' • £ W-Ш •: ,; :шШ : • :тШ-: Ш^ШШШ Ш : '• ': 111 i i t i i i ШШтШ:^ , > .:: •••' Шт Ш Ш ШШЙШШШШМШ ШШ-;• .: -;-; ШШШШ. Если у нас имеются переменные типа customerName и нам необходимо вывести на консоль полное имя, мы будем вынуждены конструировать это имя из его со- ставных частей. Например, ДЛЯ переменной типа customerName С именем customer можно использовать следующий синтаксис: • • . • • • : c u s t o m e r N a m e m y G u s t o m e r ; : :; :- : .. . • : : ; : ' . . :• '•:. •::;•':' '^ •/.•.."•••':'• ;• v .•• :. • ' • > ; • • • . .: - / ; - У : ^ У < / ; У . ^ . ' •,• . - : m y C u s t o m e r . f i r s t N a m e = " J o h n : " . ; , : ' :•.,'•:•;,....•, '•.•••'••.:•.•.•...,-•.. • • . • .• •••::• , .Л. .'•;- : myCustomer.lastName = uFranklin"; : : • Console.WriteLine("{0} {1}*, customer.firstName, customer.lastName); Имея возможность включать в структуры функции, мы можем упростить эту процедуру за счет централизованного выполнения часто встречающихся задач. В данном случае это можно сделать следующим образом: struct customerName { public string firstName, lastName; public string Name () — / • • • * ' ( return firstName + • " + lastName; Эта функция очень похожа на другие функции, рассматриваемые в настоящей главе, за исключением того, что в ней отсутствует модификатор static. Причины этого отсутствия станут понятны позже, а пока достаточно просто запомнить, что это ключевое слово для функций структур не требуется. Мы можем воспользоваться этой функцией следующим образом: customerName myCustomer; myCustomer.firstName = "John"; myCustomer.lastName = *Franklin"; Consо1e.WriteLine(customer.Name()); Этот синтаксис гораздо проще и понятнее, чем предшествующий. Необходимо отметить, что функция Name о имеет непосредственный доступ к по- лям Структуры firstName И lastName. В рамках Структуры customerName ОНИ МОГут считаться глобальными. Перегрузка функций В начале этой главы вы узнали, как сравнивать сигнатуру функции при ее вы- зове. При этом необходимо иметь отдельные функции для работы с переменными различных типов. Наличие оператора перегрузки подтверждает, что последнее дей- ствительно является проблемой. Этот оператор предоставляет возможность созда- вать одновременно несколько функций, имеющих одинаковое имя, но работающих с параметрами различных типов. Например, ранее мы использовали следующую программу, в которой содержа- лась функция С именем MaxValue () \ Функции 127 class Classl { static int MaxValue(int[] intArray) { int maxVal = intArray[0]; for (int i = 1; i < intArray.Length; i++) { if (intArray[i] > maxVal) maxVal = intArray[i]; > return maxVal; } static void Main (string [] args) { int[] myArray = {1, 8, 3, 6, 2, 5, 9, 3, 0, 2}; int maxVal = MaxValue (myArray) ; - • Console.WriteLine("The maximum value in myArray is {0}", maxVal); Эта функция может использоваться только для массивов значений типа int. Мы могли бы создать функции с другими именами, предназначенные для работы с параметрами других типов, переименовав вышеприведенную функцию как-нибудь вроде IntArrayMaxValue () И добавив функции наподобие DoubleArrayMaxValue () ДЛЯ работы с другими типами. В качестве альтернативы мы можем просто включить в нашу программу следующую функцию: static double MaxValue (double [.] doubleArray) { '•••' . ' • • . • ; ..'^ double maxVal = doubleArray [0]; for (int i = 1; i < doubleArray.Length; i++) { if (doubleArray[i] > maxVal) maxVal = doubleArray[i]; > •• r e t u r n m a x V a l ; . • .• .• • ; • . ; • • • • • • , , . • : , ; . . : .• :• , \ • , ;" ' " \ • • } ' - ; "' l i l i f Разница между двумя функциями заключается в том, что эта функция работает со значениями типа double. Имя функции — MaxVaiueO — оказывается тем же самым, однако сигнатура (это принципиально) отличается. Было бы ошибкой опи- сать две функции с одинаковым именем и одинаковой сигнатурой, однако посколь- ку в данном случае сигнатуры различны, то все нормально. Теперь у нас имеются две версии функции MaxValue (), которые принимают массивы типа int и массивы типа double и возвращают максимальное значение типа int или типа double соответственно. Красота такой формы программы в том, что не требуется явно указывать, ко- торую из этих двух функций мы собираемся использовать. Мы просто задаем массив-параметр, и это приводит к выполнению того варианта, который соответст- вует типу используемого параметра. На данном этапе стоит отметить еще одну высокоинтеллектуальную черту VS. Если в нашем приложении имеются две одноименные функции, описанные выше, и мы наберем это имя, например, в MainO, то VS выведет доступные варианты перегрузки данной функции. Если будет набрано следующее: double result = MaxValue( 128 Глава 6 I-** 1 of 2 У int Classl.MaxValue(int[] intArray)| TO VS выведет информацию ПО обеим верСИЯМ функции MaxVaiueO, которые мы можем про- | -^ 2 of 2 • double Class 1 .MaxValue (double [] doubleArray)| CMOTpeTb С ПОМОЩЬЮ КНОПОК "стрелка ВВерх" и "стрелка вниз" (см. рис. слева). При перегрузке функций учитываются все аспекты, касающиеся их сигнатур. Существует возможность, например, описать две различные функции, одна из ко- торых принимает параметры по значению, а другая, соответственно, по ссылке: static void showDouble(ref int val) } static void showDouble(int val) Выбор используемой версии осуществляется исключительно на основании того, имеется ли в обращении к функции ключевое слово ref. При следующем вызове будет использован вариант, в котором параметр передается по ссылке: showDouble(ref val) ; А такой вызов позволит передать параметр по значению: showDouble(val); Аналогичным образом можно описывать функции, отличающиеся числом требу- ющихся им параметров и т. п.
|