Лекция 13. Массив параметров и ключевое слово params

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 static void Addition(params int[] integers) { int result = 0; for (int i = 0; i < integers.Length; i++) { result += integers[i]; } Console.WriteLine(result); }   static void Main(string[] args) { Addition(1, 2, 3, 4, 5);   int[] array = new int[] { 1, 2, 3, 4 }; Addition(array);   Addition(); Console.ReadLine(); }

Причем, как видно из примера, на место параметра с модификатором params мы можем передать как отдельные значения, так и массив значений, либо вообще не передавать параметры.

Однако данный способ имеет ограничения: после параметра с модификатором params мы не можем указывать другие параметры. То есть следующее определение метода недопустимо:

1 2 static void Addition(params int[] integers, int x, string mes) {}

Также этот способ передачи параметров надо отличать от передачи массива в качестве параметра:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 // передача параметра с params static void Addition(params int[] integers) { int result = 0; for (int i = 0; i < integers.Length; i++) { result += integers[i]; } Console.WriteLine(result); } // передача массива static void AdditionMas(int[] integers, int k) { int result = 0; for (int i = 0; i < integers.Length; i++) { result += (integers[i]*k); } Console.WriteLine(result); }   static void Main(string[] args) { Addition(1, 2, 3, 4, 5);   int[] array = new int[] { 1, 2, 3, 4 }; AdditionMas(array, 2);   Console.ReadLine(); }

Так как метод AdditionMas принимает в качестве параметра массив без ключевого слова params, то при его вызове нам обязательно надо передать в качестве параметра массив.

 

Лекция 14. Область видимости переменных

Каждая переменная доступна в рамках определенного контекста или области видимость. Вне этого контекста переменная уже не существует.

Существуют различные контексты:

· Контекст класса. Переменные, определенные на уровне класса, доступны в любом методе этого класса

· Контекст метода. Переменные, определенные на уровне метода, являются локальными и доступны только в рамках данного метода. В других методах они недоступны

· Контекст блока кода. Переменные, определенные на уровне блока кода, также являются локальными и доступны только в рамках данного блока. Вне своего блока кода они не доступны.

Например, пусть класс Program определен следующим образом:

class Program // начало контекста класса

{

static int a = 9; // переменная уровня класса

               

static void Main(string[] args) // начало контекста метода Main

{

   int b = a - 1; // переменная уровня метода

 

   { // начало контекста блока кода

           

                                          int c = b - 1; // переменная уровня блока кода

 

   } // конец контекста блока кода, переменная с уничтожается

 

   //так нельзя, переменная c определена в блоке кода

   //Console.WriteLine(c);

 

   //так нельзя, переменная d определена в другом методе

   //Console.WriteLine(d);

 

   Console.Read();

 

} // конец контекста метода Main, переменная b уничтожается

 

void Display() // начало контекста метода Display

{

   // переменная a определена в контексте класса, поэтому доступна

   int d = a + 1;

 

} // конец конекста метода Display, переменная d уничтожается

 

} // конец контекста класса, переменная a уничтожается

Здесь определенно четыре переменных: a, b, c, d. Каждая из них существует в своем контексте. Переменная a существует в контексте всего класса Program и доступна в любом месте и блоке кода в методах Main и Display.

Переменная b существует только в рамках метода Main. Также как и переменная d существует в рамках метода Display. В методе Main мы не можем обратиться к переменной d, так как она в другом контексте.

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

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

При работе с переменными надо учитывать, что локальные переменные, определенные в методе или в блоке кода, скрывают переменные уровня класса, если их имена совпадают:

class Program

{

static int a = 9; // переменная уровня класса

   

           static void Main(string[] args)

{

   int a = 5; // скрывает переменную a, которая объявлена на уровне класса

   Console.WriteLine(a); // 5

           }

}

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

 

Лекция 15. Рекурсивные функции

Отдельно остановимся на рекурсивных функциях. Рекурсивная функция представляет такую конструкцию, при которой функция вызывает саму себя.

Возьмем, к примеру, функцию, вычисляющую факториал числа:

1 2 3 4 5 6 7 8 9 10 11 static int Factorial(int x) { if (x == 0) { return 1; } else { return x * Factorial(x - 1); } }

Итак, здесь у нас задается условие, что если вводимое число не равно 0, то мы умножаем данное число на результат этой же функции, в которую в качестве параметра передается число x-1. То есть происходит рекурсивный спуск. И так, пока не дойдем того момента, когда значение параметра не будет равно единице.

При создании рекурсивной функции в ней обязательно должен быть некоторый базовый вариант, который использует оператор returnи помещается в начале функции. В случае с факториалом это if (x == 0) return 1;.

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

Другим распространенным показательным примером рекурсивной функции служит функция, вычисляющая числа Фиббоначчи. n-й член последовательности Фибоначчи определяется по формуле: f(n)=f(n-1) + f(n-2), причем f(0)=0, а f(1)=1.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 static int Fibonachi(int n) { if (n == 0) { return 0; } if (n == 1) { return 1; } else { return Fibonachi(n - 1) + Fibonachi(n - 2); } }

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: