Четверг, 18.04.2024, 16:40
Приветствую Вас Гость | RSS

Лекции

Меню сайта
Форма входа
Категории раздела
ТАУ (Теория автоматического управления) [31]
лекции по ТАУ
Экология [151]
учебник
Бухгалтерский учет и налогообложение в строительстве [56]
Дементьев А.Ю. - Практическое пособие
Психология [104]
Пип
информатика [80]
с# Карли Ватсон
современные стулья [0]
новинки
Поиск

Главная » 2010 » Февраль » 11 » Функции структур
00:18
Функции структур
Функции структур
В предшествующей главе рассматривались типы структур, предназначенных для
хранения в одном месте нескольких элементов информации. На самом деле воз-
можностей у структур гораздо больше, и одной из них является способность содер-
жать не только данные, но и функции. На первый взгляд подобное может показаться
немного странным, однако на практике это приносит много пользы.
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);
Аналогичным образом можно описывать функции, отличающиеся числом требу-
ющихся им параметров и т. п.































Категория: информатика | Просмотров: 836 | Добавил: basic | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Календарь
«  Февраль 2010  »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

krutoto.ucoz.ru
Бесплатный конструктор сайтов - uCoz