Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции ЛИПО .doc
Скачиваний:
3
Добавлен:
17.08.2019
Размер:
420.86 Кб
Скачать

Методы Ссылочные параметры ref и out

Типы С# можно разделить на типы-значения и ссылоч­ные типы. Когда методу передается значение ссылочного типа, все изменения в преде­лах метода отражаются и на исходной переменной. Если же аргументом метода является переменная типа-значения, она копируется в формальный параметр. В результате исходная переменная и переменная в методе явля­ются разными, никак не связанными величинами.

До сих пор подобные свойства редко использовались, поскольку любое вычисленное методом значение возвращалось в точку вызова. Но как быть, если требуется возвращать несколь­ко значений? Здесь уже нельзя воспользоваться возвращаемым значением (поскольку так можно возвратить только одну переменную). Дня решения этой проблемы предназ­начены ссылочные параметры, которые объявляются с ключевым словом ref

public static void Swap(ref int a, ref int b)

Данный заголовок метода указывает, что а и b являются ссылочными параметрами. Вызов метода также должен содержать ключевое слово ref, например:

Swap(ref Value_1, ref Value_2)

Несоблюдение этого правила вызывает сообщение об ошибке на этапе компиляции.

Напишем метод, который обменивает значениями переменные Value_1 и Value_2 и выводит результат.

using System;

class Swapper

{

public static void Main()

{

int value_1=10;

int value_2=20;

Console.WriteLine("Число №1:{0} Число №2:{1}", value_1, value_2);

Swap(ref value_1, ref value_2);

Console.WriteLine("Число №1:{0} Число №2:{1}", value_1, value_2);

Console.ReadLine();

}

public static void Swap(ref int a, ref int b)

{

int c;

c=a;

a=b;

b=c;

}

}

OUT

Любой аргумент, передаваемый как ссылочный параметр, должен поддерживать присва­ивание значения (т.е. он не может быть, к примеру, Константой). Swap(ref 10, ref 20) так как числу 10 или 20 нельзя присвоить значение.

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

using System;

class c

{

public static void Main()

{

int a;

m(a);

Console.WriteLine(a);

Console.ReadLine();

}

public static void m(int new_value)

{

new_value=100;

}

}

При попытке компиляции будет выдано сообщение об ошибке.

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

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

using System;

class c

{

public static void Main()

{

int a;

m(out a);

Console.WriteLine(a);

Console.ReadLine();

}

public static void m( out int new_value)

{

new_value=100;

}

}

Переменное число аргументов метода

public static int Sum(int a, int b)

{

int sumTotal;

sumTotal = a + b;

return sumTotal;

}

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

При создании новых методов с другим количеством входных параметров код программы резко увеличивается и становиться громоздким. Его можно упростить, создан метод, воспринимающий любое число аргу­ментов. Именно для этого и предназначен массив параметров. Он объявляется посред­ством ключевого слова params перед одномерным массивом в заголовке метода

public static Int Sum(params int [] numbers)

Теперь вызов метода Sum может включать любое число ар­гументов.

Массив параметров должен быть одномерным, поэтому с ключевым словом params нельзя использовать массивы формата int [ , ].

Ключевое слово params указывает среде исполнения автоматически вставлять аргу­менты в массив numbers. Если вызов метода Sum выглядит, например, ...Sum(10,20,30)

Mассив numbers будет иметь длину 3 и к моменту вызова метода Sum содержать следую­щее:

Индекс 0 1 2

Значение 10 20 30

Массив numbers принадлежит типу int, поэтому тип всех предполагаемых аргумен­тов должен быть неявно преобразуем в int.

Метода Sum может вообще не содержать аргумен­тов. Это говорит о том, что массив numbers имеет нулевую длину.

Наконец, аргументом метода Sum может быть и одномерный массив, базовый тип которого неявно преобразуется в тип массива numbers.

using System;

class SumCalculator

{

public static void Main()

{

int res1, res2, res3, res4;

int [] n={4,5,6,7};

res1=Sum(1,2);

res2=Sum(1,2,3);

res3=Sum(n);

res4=Sum();

Console.WriteLine("\n\nСумма: {0}, {1}, {2}, {3}",res1,res2,res3,res4);

Console.ReadLine();

}

public static int Sum(params int[] nombers)

{

int Sum=0;

Console.WriteLine("\nКоличество слагаемых{0}",nombers.Length);

for (int i=0; i<nombers.Length; i++)

{

Sum+=nombers[i];

Console.WriteLine("Слагаемое №{0}= {1}",i+1,nombers[i]);

}

return Sum;

}