Иногда число аргументов, которые будут переданы методу, неизвестно до периода выполнения. Например, вам нужен класс, который чертит на графике линию, заданную последовательностями х- и у-координат. У вас может быть класс с методом, принимающим единственный аргумент — объект
Point,
который представляет значения обеих координат х и у. Затем этот метод сохраняет каждый объект
Point
в связанном списке или в элементах массива, пока вызывающая программа не даст команду на вывод всей последовательности точек. Однако это решение не годится по двум причинам. Во-первых, оно требует от пользователя рутинной работы по вызову одного и того же метода для каждой точки линии, которую нужно нарисовать, — очень утомительно, если линия будет длиной; а чтобы нарисовать линию, затем приходится вызывать другой метод. Во-вторых, данное решение требует от класса хранить эти точки, тогда как они нужны лишь для того, чтобы использовать единственный метод —
DrawLine.
Эту проблему эффективно решает переменное количество аргументов.
Вы можете задавать переменное число параметров метода через ключевое слово
params
и указывая массив в списке аргументов метода. Вот пример класса
Draw,
using System;
class Point {
public Point(int x, int y) {
this.x = x; this.у = у; }
public int x; public int y; }
class Chart {
public void DrawLine(params Point[] p) {
Console.WriteLine("\пЭтот метод позволяет нарисовать линию " + "по следующий точкам:"); for (int i = 0; i < p.GetLength(O); i++) {
Console.WriteLine("{0), {1}". p[i].x, p[i].y); } } }
class VarArgsApp {
public static void Main() {
Point p1 = new Point(5,10); Point p2 = new Point(5, 15); Point p3 = new Point(5, 20);
Chart chart = new ChartQ;
chart.DrawLine(p1, p2, p3); } }
Метод
DrawLine
сообщает компилятору С#, что он может принимать переменное число объектов
Point.
Затем в период выполнения метод ис-
\
пользует простой цикл
for
для прохода по всем объектам
Point
и вывода всех точек.
В реальном приложении для доступа к членам
х
и
у
объекта
Point
на-, много лучше будет использовать свойства, чем объявлять эти члены как
public.
Кроме того, в методе
DrawLine
было бы лучше применять оператop
foreach
вместо цикла
for.
Но чтобы не нарушать ход изложения ма-т.ериала, я пока не буду вводить эти функции языка. О свойствах я расскажу в главе 7, а об операторе
foreach —
в главе И.