Использование подпрограмм в C#

Примером использования подпрограмм может служить следующий:

using System; class Ex {

static void Main()

Console.WriteLine ("Вызываем метод Jump …");

Jump () ;

}

static void Jump()

{

Console.WriteLine ("Привет из Jump …");

Console.ReadLine();

}

}

Когда перед именем метода (функции) не указывается имя объекта, то предполагается, что используется метод класса, где данный метод объявлен. Такой метод (функция) называется статическим. При записи такого метода нужно указывать ключевое слово static. Правила здесь такие же, как и в Java. Ключевое слово static указывает на принадлежность поля или метода классу, а не объекту. Если требуется выйти из метода заблаговременно, то следует использовать оператор возврата return.

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

using System; class Color {

public Color()

{

this.red=255; this.green=O; this.blue=255;

}

protected int red; protected int green; protected int blue;

public void GetColors(out int red, out int green, out int blue)

red=this.red; green=this.green; blue=this.blue;

}

static void Main()

{

Color c= new Color(); int red; int green; int blue;

c.GetColors(out red, out green, out blue);

Console.WriteLine("red color is "+red);

Console.ReadLine();

}

}

}

В этом примере объявлен единственный класс color. В классе Coior объявлены: конструктор public coior() (конструктор можно не задавать), переменные:

protected int red; protected int green; protected int blue;

а также два метода Main() и Getcoiors(). По своей структуре программа имеет прямую аналогию с программой Java. Конструктор имеет то же имя, что и класс, в котором он определен. Задача конструктора — инициализировать переменные класса:

this.red=255; this.green=O;

В методе Main о выполняем создание объекта класса coior:

Color c= new Color();

Затем вызываем метод Getcoiors о : c.GetColors(out red, out green, out blue);

При вызове метода Getcoiors() в скобках перечисляем аргументы и указываем для них модификатор out (или in). Модификатор out соответствует выходному параметру, т. e. такому, который получает значение в методе; модификатор in соответствует входному параметру (такой параметр имеет значение и не изменяет его при выходе). Можно указывать тип составной in out (такой параметр передается в метод и в этом методе его значение изменяется). Остается лишь обратить внимание на то, как объявляется метод Getcoiors о в классе:

public void GetColors(out int red, out int green, out int blue)

Здесь указывается список параметров метода, их типы и модификаторы. Вместо модификатора out можно использовать модификатор ref, но при условии, что передаваемый с данным модификатором параметр получил значение (инициализирован).

В C# реализован механизм ссылок на методы, использующий так называемые делегаты. Делегат можно объявить, например, следующим образом:

public delegate double DelegateFunction (double x, double у);

Теперь имя метода DelegateFunction() можно связать с любым методом, который возвращает значение типа double и использует два аргумента также типа double. Иллюстрацию использования делегата можно дать на следующем примере (листинг 3.9).

Листинг 3.9. Использование делегатов

using System;

public delegate double DelegateFunction (double x, double у); public class Classl

{

return Math.Pow((Math.Pow(x,2)+Math.Pow(y,2)),0.5);

}

public static double Sum(double x, double y)

{

return x+y;

}

}

class Example {

public static void Main()

{

double a=10; double b=20;

DelegateFunction df= new DelegateFunction(Classl.Distance); Console.WriteLine("FirstDelegate returned "+ df(a,b)); df= new DelegateFunction(Classl.Sum);

Console.WriteLine("SecondDelegate returned "+ df(a,b)); Console.ReadLine();

}

}

}

В данном примере объявлен делегат:

public delegate double DelegateFunction (double x, double

y) ;

В классе ciassi также представлены реализации методов Distance() и sum(). Видим, что эти методы возвращают значение типа double и используют два аргумента типа double. В таком случае говорят, что оба метода имеют одинаковую сигнатуру, которая совпадает с сигнатурой объявленного делегата. Этого обстоятельст

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

DelegateFunction df= new DelegateFunction (Classl.Distance);

Здесь в конструктор класса делегата передается имя первого метода. Далее реализуется вывод на консоль значения метода Distance (), хотя обращение выполняется к делегату:

Console.WriteLine("FirstDelegate returned "+ df(a,b));

По аналогии выполняется связывание делегата со вторым методом и вывод значения, получаемого методом sum ():

df= new DelegateFunction(Classl.Sum);

Console.WriteLine("SecondDelegate returned "+ df(a,b)); Заметим, что методы, связываемые с делегатом, объявлены как статические, поэтому и в конструкторе класса делегата указывается имя класса, а затем через точку — имя метода.

Источник: Герман О. B., Герман Ю. О., Программирование на Java и C# для студента. — СПб.: БХВ-Петербург, 2005. — 512 c.: ил.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100