Передача методу параметров по ссылке
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

 

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

Использование out со значимыми типами:

class Test {

static void GetVal(out int v) {

v = 10;            //Этот метод должен инициализтровать переменную v

}

static void Main() {

       int x;

GetVal (out x);    //Инициализировать x не обязательно.

       Console.WriteLine(x); // отображаем 10

Console.ReadKey();

}

}

Недопустимо :

class Test {

static void GetVal(out int v, out int c)

{

   c = 5;            //Этот метод должен инициализтровать переменные V и С

}

static void Main() {

       int x, y;

   GetVal (out x, out y);    //Инициализировать x не обязательно.

       Console.WriteLine(y);

   Console.ReadKey();

}                         

}

Использование out со значимыми типами эффективно, так как оно предотвращает копирование экземпляров значимого типа при вызовах методов.

Если параметр метода помечен ключевым словом ref, вызывающий код должен инициализировать его перед вызовом этого метода. Вызванный метод может читать и записывать значение параметра.

Использование ref со значимым типом:

class Test {

static void GetVal(ref int v) {

v += 5;            //Этот метод может использовать инициализированный

//параметр v

}

static void Main() {

       int x = 10;

GetVal (ref x);    //Инициализировать x обязательно.

       Console.WriteLine(x);

Console.ReadKey();

}

}

Недопустимо :

class Test {

static void GetVal(ref int v) {

v += 5; // метод не может использовать не инициализированный параметр

}

static void Main() {

       int x; // x-не инициализируется ошибка компиляции

GetVal (ref x);

       Console.WriteLine(x);

Console.ReadKey();

}

}

Пример

class Test {

static void Swap(ref int x, ref int y) {

int temp = x;

x = y;

y = temp;

}

static void Main() {

int i = 1, j = 2;

Swap(ref i, ref j);

Console.WriteLine("i = {0}, j = {1}", i, j);

Console.ReadKey();

}

}

Ключевые слова out и ref со значимыми типами позволяют методу управлять единственным экземпляром значимого типа.

В случае ссылочных типов вызывающий код выделяет память для указателя на передаваемый объект, а вызванный код управляет этим указателем. Использование ключевых слов out и ref со ссылочными типами необходимо если нужна ссылка на объект.

Использование out со ссылочными типами:

class Test {

static void SplitPath(string path, out string dir, out string name) {

       int i = path.Length;

       while (i > 0) {

             char ch = path[i-1];

             if (ch == '\\' || ch == '/' || ch == ':') break;

             i--;

       }

       dir = path.Substring(0, i);

       name = path.Substring(i);

}

static void Main() {

       string dir, name;

       SplitPath("c:\\Windows\\System\\hello.txt", out dir, out name);

       Console.WriteLine(dir);

       Console.WriteLine(name);

   Console.ReadKey();

}

}

 

Массив_параметров

Ключевое слово params позволяет определить параметр метода, принимающий переменное количество аргументов.

 

Массив_параметров состоит из необязательного набора атрибутов, модификатора params, типа_массива и идентификатора. Массив параметров объявляет единственный параметр заданного типа массива с данным именем. Тип_массива массива параметров должен быть типом одномерного массива

 

Например, типы string[] и string[][] могут использоваться в качестве типа массива параметров, но тип string[,] – не может. Невозможно объединить модификатор params с модификаторами ref и out.

 

Пример

 

class Test

{

static void F(params int[] args)

{

   Console.Write("Array contains {0} elements:", args.Length);

   foreach (int i in args)

       Console.Write(" {0}", i);

   Console.WriteLine();

}

static void Main()

{

   int[] arr = { 1, 2, 3 };

   F(arr);

   F(10, 20, 30, 40);

   F();

}

}

 

 



Дата: 2019-03-05, просмотров: 208.