Функции с переменным числом аргументов private static int Sum(int a, int b) { return a + b; } static void Main() { int sum = Sum(1, 2); } 1 Функции
int Sum(params int [] array) { int sum = 0; foreach (int n in array) { sum += n; } return sum; } int s1 = Sum(1, 2, 3); int s2 = Sum(1, 2, 3, 4, 5); 2 -возможно любое количество параметров -нет ограничений на тип параметров -params должен быть последним в списке аргументов, и в единственном экземпляре
int Min (int a, int b) { return (a < b ? a : b); } string Min (string a, string b) { return (a.Length < b.Length ? a : b); } float Min (float[] p) { … } Перегрузка функций (functions overload) 3 Min (1, 5); Min ("abc", "ab") Min (new float[]{0.1f, 0.2f, 0.3f});
4 bool IsLeapYear(DateTime dateTime) { return IsLeapYear(dateTime.Year); } bool IsLeapYear(int year) { return (year % 4 == 0 && year % 100 != 0 || year % 400 == 0); }
Перегрузка функций, содержащих params void func (params int [] p); void func (int x, int y); void func (int x, params int [] p); void func (int x, int y); func(3, 5); func(10, 20, 30); func(1, 2); 5
При выборе варианта функции, у использования params меньший приоритет: void func (params int [] p); void func (int x, int y); void func (int x, params int [] p); void func (int x, int y); func(3, 5); func(10, 20, 30); func(1, 2); Но еще меньший приоритет у приведения типа : void func(params int[] p); void func(uint x, uint y); func(1, 2); 6
7 Передача value-type аргументов в функцию long x = 5; long y = x; y = 1; x - ? private static void SetZero(float val) { val = 0f; } static void Main() { float f = 10f; SetZero(f); // f - ? }
8 Передача ref-type аргументов в функцию int[] arrayA = { 1, 2, 3 }; int[] arrayB = arrayA; arrayB[0] = 5; foreach (int i in arrayA) Console.WriteLine(i); private static void SetZero(float[] val) { for (int i = 0; i < val.Length; i++) val[i] = 0f; } static void Main() { float[] array = { 1f, 2f, 3f }; SetZero(array); foreach (int i in array) Console.WriteLine(i); }
Модификатор ref -позволяет передавать в функцию значение по ссылке 9 private static void Swap (ref int a, ref int b) { int tmp = a; a = b; b = tmp; } int x = 1, y = 2; Swap(ref x, ref y);
10 Передаче по ссылке параметра reference-type private static void SetZero(int[] p) { p[0] = 10; p = new int[] { 1, 2, 3 }; }... int[] array = new int[5]; SetZero(array); foreach (int i in array) { Console.Write("{0} ", i); }
11 private static void SetZero(ref int[] p) { p[0] = 10; p = new int[] { 1, 2, 3 }; }... int[] array = new int[5]; SetZero(ref array); foreach (int i in array) { Console.Write("{0} ", i); }
Модификатор out -предназначен для получения значений из метода (по ссылке) 12 void MinMax(int a, int b, out int min, out int max) { min = (a < b) ? a : b; max = (a > b) ? a : b; } int minValue; int maxValue; MinMax(100, 10, out minValue, out maxValue);
13 Значения параметров функций по умолчанию public void Show(string text, string caption, bool sound) { //... }... Show("Привет!", "", false);
14 void Show(string text, string caption = "", bool sound = false) { //... }... Show("Привет!"); Show("Привет!", "Сообщение"); Show("Привет!", "Сообщение", true);
15 Именованные параметры class Circle { public void Set(int x, int y, int r) { } Circle circle = new Circle(); circle.Set(x: 0, y: 0, r: 10); // circle.Set(x: 0, r: 10, y: 0);
16 class Circle { public void Set(int x=0, int y=0, int r=1) { } Circle circle = new Circle(); circle.Set(y: 0);