Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSBasicCourse2ndedPodbelsky / CSBasicCourse2ndedPodbelsky.rtf
Скачиваний:
27
Добавлен:
22.03.2016
Размер:
11.9 Mб
Скачать

Int[ ] temp;

temp = vec1;

vec1 = vec2;

vec2 = temp;

}

Методы отличаются только модификаторами параметров. Для change1()

параметры передаются по значениям, для change2() – по ссылкам.

static void Main()

{

int[ ] ar1 = { 1, 4, 8, 2, 4, 9, 3 };

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

change1(ar1, ar2); // передача по значениям

Console.WriteLine("ar1.Length=" + ar1.Length);

Console.WriteLine("ar2.Length=" + ar2.Length);

change2(ref ar1, ref ar2); // передача по ссылкам

Console.WriteLine("ar1.Length=" + ar1.Length);

Console.WriteLine("ar2.Length=" + ar2.Length);

}

}

Результаты выполнения программы:

ar1.Length=7

ar2.Length=3

ar1.Length=3

ar2.Length=7

В методе Main() определены два конкретных массива:

int[ ] ar1 = { 1, 4, 8, 2, 4, 9, 3 };

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

Обращение change1(ar1, ar2); не изменяет ссылок, ar1 останется связанной с

массивом из 7-ми элементов, ar2 будет ссылаться, как и ранее, на массив из трёх

элементов.

При вызове change2(ref ar1, ref ar2);

ссылки обменяются значениями – ar1

будет ссылаться на массив из трёх элементов, ar2 будет адресовать массив из 7-ми

элементов.

На этом примере мы убедились, что аргумент с типом ссылки (так же как

аргумент с типом значения) может изменить своё значение при выполнении тела

метода только в том случае, когда он передан методу по ссылке, то есть имеет

модификатор ref или out.

Итак, параметр ссылочного типа может быть снабжен модификатором ref. Без

него – аргумент всегда "смотрит" на свой объект (внешний), может его менять, но

не может изменить своего значения. С ref аргумент с типом ссылки может сменить

своё значение и "отцепиться" от своего объекта.

В ряде случаев интересно иметь метод, который пригоден не для одного

фиксированного типа параметра, а до некоторой степени универсален и допускает

подстановку вместо параметра аргументов разных типов

"аргумент:аргументы

разных типов" . Так как все типы языка C# являются производными от одного

базового класса Object, то метод для обмена значений двух ссылок можно написать

так (программа 09_09.cs):

static void change(ref Object ob1, ref Object ob2)

{

Object temp;

temp = ob1;

ob1 = ob2;

ob2 = temp;

}

Чтобы обратиться к этому методу, необходимо привести типы нужных нам

аргументов к типу Object. После выполнения метода нужно "вернуть" полученным

результатам тип исходных ссылок. В следующем методе проделаны указанны

е

действия:

static void Main()

{

int[] ar1 = { 1, 4, 8, 2, 4, 9, 3 };

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

Object obj1 = ar1, obj2 = ar2;

change(ref obj1, ref obj2); // передача по ссылкам

ar1 = (int []) obj1;

ar2 = (int []) obj2;

Console.WriteLine("ar1.Length=" + ar1.Length);

Console.WriteLine("ar2.Length=" + ar2.Length);

}

Результаты выполнения программы:

ar1.Length=3

ar2.Length=7

Продемонстрированное в этой программе приведение типов аргументов

"аргумент:приведение типов аргументов"

к типам параметров при передаче по

ссылкам обусловлено синтаксисом языка и преследует обеспечение безопасности

кода программы.

В случае передачи по значению параметра с типом Object необходимости в

явном приведении типа аргумента к типу параметра нет. Вместо параметра с типом

Object разрешено подставить аргументы любых типов.

Следующий пример (программа 09_10.cs) иллюстрирует эту возможность.

Метод выводит сведения о типе переданного ему аргумента.

static void printType(Object param)

{ Console.WriteLine(param.GetType( ));}

Аргументы при обращениях к методу GetType( ) могут иметь любой тип,

производный от типа Object.

static void Main()

{

int[] ar1 = { 1, 4, 8, 2, 4, 9, 3 };

printType(ar1);

printType("строка");

printType(440);

}

}

Результаты выполнения программы:

System.Int32[

]

System.String

System.Int32

Предположим, что метод должен определить внутри своего тела некоторый

объект и сделать этот объект доступным в точке вызова. Это можно сделать двумя

способами.

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

возвращаемое функцией (методом) в точку вызова. Во-вторых, в методе можно

использовать параметр с типом ссылки, снабженный модификатором ref либо out.

Первый способ иллюстрирует следующая программа.

// 09_11.cs – ссылка как возвращаемое значение

using System;

class Program

{

static int[ ] newAr(uint numb)

{

int [ ] temp = new int[numb];

for (int i = 0; i < numb; i++)

temp[i] = (i + 1) * (i + 1);

return temp;

}

static void Main( )

{

int[ ] vector = newAr(6);

foreach (int el in vector)

Console.Write(el+" ");

Console.WriteLine( );

}

}

Результаты выполнения программы:

1 4 9 16 25 36

В программе метод (функция) newAr(), получив в качестве аргумента целое

неотрицательное значение, создаёт одномерный целочисленный массив, присваивает

его элементам значения квадратов натуральных чисел и возвращает в точку вызова

ссылку на сформированный массив. В методе Main() определена переменная-ссылка

vector на целочисленный массив и ей присвоен результат вызова метода newAr().

Результаты выполнения программы иллюстрируют сказанное.

Соседние файлы в папке CSBasicCourse2ndedPodbelsky