Приветствую Вас ГостьСуббота, 18.05.2024, 17:22

Light Midnight Inc.


Каталог статей

Главная » Статьи » Программирование » C#

C# для вундеркиндов. Часть 2.4. Учимся общаться с компьютером

При написании метода подобным «умным» образом,

 void WriteHello( string someName )
 {
 Console.WriteLine( "Hello ” + someName );
 }
 

мы фактически говорим: «Каждый раз при вызове этого метода я буду подставлять строку символов с неким именем. Любая подставляемая строка должна выводиться после слова «Hello».

Код в скобках (string someName) называется параметром. Параметр позволяет подставлять значение в метод при его вызове.

Когда вас обучали сложению чисел, учитель не рассказывал о каждой возможности, он просто научил вас методу и затем задал вам разные задачи: «Сложите 2 и 5. Теперь сложите 7 и 3». Это похоже на то, как если бы учитель изложил вам метод сложения чисел и подставлял каждый раз разные параметры. Неважно, какие это были бы параметры, вы бы смогли найти ответ, потому что знали бы метод.

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

 void WriteHello( string x )
 {
 Console.WriteLine( "Hello ” + x );
 }
 

А этот — нет:

 void WriteHello( string someName )
 {
 Console.WriteLine( "Hello ” + someBodysName );
 }
 

Можете найти ошибку? Параметры «someName» и «someBodysName» отличаются — это запутает нашего «электронного» друга и он «разгневается».

Кроме того, можно на полных правах использовать более одного параметра в методе. Для этого их нужно просто разделить запятыми:

 void WriteHello( string firstName, string lastName )
 {
 Console.WriteLine( "Hello ” + firstName + " ” + lastName );
 }
 

Но затем при вызове метода важно подставить правильное количество значений

 WriteHello( "Jiminy”, "Cricket” );
 

В данном случае на экран будет выведен текст «Hello Jiminy Cricket».

Отправка неверных типов параметров

Представьте, что когда вы впервые изучали сложение чисел, ваш учитель неожиданного задал вам такую задачу: «Сложите число 5 и цветок».

Что бы вы стали делать? Наверное ответили бы, что цветок это не число и сложение невозможно. Правильно.

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

А потом, каждый раз при вызове метода мы должны убедиться, что подставляем правильный тип значений в эти параметры. В приведенном ниже примере мы подставляем два целых числа, так как параметры метода «LuckyNumber» были определены как целые числа.

Строительный блок: Параметры

Чтобы подставить значения в метод, необходимо определить в нем параметры:

 class Person
 {
 // Поля
 string firstName;
 string lastName;

 // Метод
 public void LuckyNumber( int numberOfTeeth, int age )
 {
 Console.WriteLine( "Счастливое число " + numberOfTeeth * age );
 }
 …
 }
 
 Person jiminy;
 jiminy= new Person();
 jiminy.LuckyNumber(24, 14);
 

Приводимые до сих пор методы выводили некий текст на экран и затем просто возвращались назад к строке, вызвавшей их, как бы говоря: «Свое дело я сделал. Вернулся в исходную точку». Однако, иногда может возникать необходимость возврата некоторого значения в строку, из которой этот метод был вызван.

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

Далее определяется порядок создания метода. Следует помнить, что метод это часть, в которой мы учим компьютер КАК выполнять определенное действие, записывая последовательность операций. Сначала я напишу то, чего хочу добиться от компьютера на русском языке, а затем на C#:

  • Если животное, о котором мы говорим — слон, то number of legs = 4.

  • В ином случае, если животное, о котором мы говорим — индейка, то number of legs = 2.

  • В ином случае, если животное, о котором мы говорим — устрица, то number of legs = 1.

  • В ином случае, если мы говорим о каких-либо других животных, то number of legs = 0.

 int NumberOfLegs( string animalName )
 {

 if ( animalName == "слон” ) // Если название животного — слон
 {
 // Возвращаемое значение 4
 return 4;
 }
 else if ( animalName == "индейка" ) // В ином случае, если животное — индейка
 {
 // Возвращаемое значение 2
 return 2;
 }
 else if ( animalName == "устрица" ) // В ином случае, если животное — устрица
 {
 // Возвращаемое значение 1
 return 1;
 }
 Else // В ином случае (при всех других условиях)
 {
 // Возвращаемое значение 0
 return 0;
 }
 }
 

и затем мы могли бы вызвать метод: Вызовем его дважды:

 1. int i; //Создание переменной «i» целочисленного типа для хранения значения числа конечностей
 2. i = NumberOfLegs("индейка”); //Теперь i = 2 из метода NumberOfLegs выше
 3. Console.WriteLine("У индейки ” + i + " конечностей");
 4. i = NumberOfLegs("обезьяна”); //Теперь i = 0 из метода NumberOfLegs выше
 5. Console.WriteLine("У обезьяны ” + i + " конечностей");
 

По строке 3 на экран выводится текст «У индейки 2 конечностей», а по строке 5 — «У обезьяны 0 конечностей". Итак, метод возвращает значение, которое можно включить непосредственно в строку кода, откуда был вызван метод.

Почему мы определили метод именно так?

 int NumberOfLegs( string animalName )
 {
 ...

 }
 

а не вот так:

 
void NumberOfLegs( string animalName ) { ... }

или таким образом:

 
string NumberOfLegs( string animalName ) { ... }

А сделали так мы именно потому, что нам необходимо, чтобы метод возвращал целое число в данном случае, а не «пустое» значение (void), не строку букв, а именно целое число. А для работы с целыми числами используется тип данных «Integer» или «int» в сокращенном варианте.

При написании метода мы всегда указываем тип данных, возвращаемых этим методом. Если нет необходимости возвращать значение, мы используем «void» для возврата пустого значения.

 
void JustWriteSomething( string someThing ) { Console.WriteLine( someThing ); }

И наконец, возможно вы догадались, что слово «return» фактически возвращает значение. Когда компьютер встречает слово «return» происходит выход из метода и возврат запрашиваемого значения.

Возвращаемые значения затем автоматически становятся доступными в любом месте, где мы вызываем метод.

Например, возвращенное значение мы могли бы использовать следующим способом:

Сначала мы могли бы сохранить ответ в переменной и затем использовать значение переменной в отдельном выражении.

Или мы могли бы вызвать метод непосредственно в выражении WriteLine следующим образом:

Строительный блок: Возвращаемые значения

Иногда возникает необходимость получить значение из метода. В таком случае вместо указания типа «void», что означает, что «никакого значения возвращено не будет», мы указываем определенный тип данных, возвращаемых методом.

 class Person
 {
 // Поля

 string firstName;
 string lastName;

 // Метод

 int LuckyNumber( int numberOfTeeth, int age )
 {
 return ( numberOfTeeth * age );
 }

 }
 
 Person Susy;
 Susy = new Person();
 int num = Susy.LuckyNumber(24, 14);
 Console.WriteLine("Счастливое число Susy " + num);
 
 Console.WriteLine("Счастливое число Susy " + Susy.LuckyNumber(24, 14) );
 

Как и поля (см. предыдущую главу), методы можно вызвать из других классов. Такую возможность можно разрешить или запретить.

По умолчанию, все методы будут рассматриваться как private (закрытые), что означает, что их можно использовать только внутри своего класса. Чтобы разрешить их использование из других классов, можно добавить слово «public» в начало объявления.

 
public void JustWriteSomething( string someThing ) { Console.WriteLine( someThing ); }

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

В одном из разделов этой книги мы уже рассматривали пример с закрытыми и открытыми полями. Давайте дополним наш пример и включим закрытые (Private) и открытые (Public) методы в класс «Animal» и затем пытаемся обратиться к ним из класса «Zoo».

 class Animal
 {
 public string kindOfAnimal;
 public string name;
 public int numberOfLegs;
 public int height;
 public int length;
 public string color;
 bool hasTail;
 protected bool isMammal;
 private bool spellingCorrect;

 
public string GetFoodInfo() // Открытый метод, получающий информацию о том, чем питается животное { // Представим, что здесь расположен код, выполняющий поиск по базе данных … }
private void SpellingCorrect() // Закрытый метод для проверки правильности написания вида животного { // Представим, что здесь расположен код для проверки правописания … }
protected bool IsValidAnimalType() // Защищенный метод, принимающий решение о существовании указанного вида животного { // Представим, что здесь расположен код для проверки существующих видов животных … } … } class Zoo { Animal a = new Animal (); a.name = "Kangaroo”; string food; bool animalExists; // Следующий код будет выполнен успешно, поскольку классу «Zoo» разрешено // обращаться к открытым методам в классе «Animal» food = a.GetFoodInfo(); // Вызов открытого метода // Обе следующие строки НЕ будут выполнены, поскольку классу «Zoo» // не разрешено обращаться к закрытым или защищенным методам a.spellingCorrect(); // Попытка вызова закрытого метода animalExists = a.IsValidAnimalType(); // Попытка вызова защищенного метода }

Очень часто вам будут встречаться классы с достаточно специфичным типом метода, называемым «конструктором». Имя метода-конструктора соответствует имени класса и тип возврата в него не включается.

Данный метод называется конструктором, поскольку он помогает «конструировать» или строить объект при первом его создании. Создание этого метода в классах считается хорошей практикой.

 class Person
 {
 // Поля

 string firstName;
 string lastName;

 // Метод-конструктор для класса Person

 public Person()
 {
 firstName = "Johnny";
 lastName = "Rocket";
 }
 }
 

Метод-конструктор обрабатывается по-особому: он выполняется автоматически при каждом создании экземпляра класса.

Напоминание:

Под «экземпляром класса» мы понимаем определенный объект класса. Например, в одном из предыдущих разделов по объектам мы выделили «Гориллу Джереми» как определенный объект или экземпляр класса «Animal».

Итак, если мы выполним следующий код...

 Person p = new Person();
 Console.WriteLine( p.lastName );
 

то результатом будет слово «Rocket» на экране. Создав объект «Person» мы автоматически и незаметно выполнили метод конструктора «Person», который в этом случае задает значение «Rocket» для lastName.

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

Это действие можно сравнить с методом-конструктором, выполняемым для класса. Прежде чем новый экземпляр класса сможет что-либо сделать, выполняется метод-конструктор. В него можно включить любые действия, которые должны выполняться автоматически, прежде чем объект будет считаться «готовым к жизни».



Источник: http://msdn.microsoft.com/ru-ru/library/bb330920(v=vs.80).aspx
Категория: C# | Добавил: Cromartie (25.08.2013)
Просмотров: 795 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Наш опрос
Оцените мой сайт
Всего ответов: 542
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Реклама
Cheсking
Часы
Мини-чат
200
Друзья Сайта
  • Light Midnight - Ваша Еда
  • Light Midnight - Anim as life style
  • Поиск