Управление параметрами. Пример. Массивы и строки
В С и С++ используется только передача аргументов по значению. В С# некоторые идеи по управлению данными взяты из Pascal’я и, т.о., приняты меры к увеличению надежности программ. Аргументы простого типа данных передается по значению. Объекты классов передаются по ссылке.
Пример
Пусть имеется класс Test и в нем декларированы два свойства – a и b типа int и метод change(), следующего вида:
public void change (Test ob)
{
ob.a = ob.a + ob.b;
ob.b = - ob.b;
}
Тогда передача по ссылке происходит следующим неявным образом:
Test ob = new Test(15, 20);
ob.change(ob);
Модификаторы типа параметров – ref и out обеспечивают более гибкое управление передачей аргументов.
Пример
class RefTest
{
public void sqr(ref int i)
{ i = i * i; }
…………………………….
}
…………………………….
RefTest ob = new RefTest();
int a = 10;
ob.sqr(ref a); // ref срабатывает как оператор и вычисляет адрес переменной а
После вызова метода а имеет значение равное 100.
Модификатор out обеспечивает получение из метода некоторого значения. Out-аргумент не должен быть связан до вызова метода с каким-либо значением.
Пример
class Decompose
{
public int parts(double n, out double frac)
{
int whole;
whole = (int)n;
frac = n – whole;
return whole;
}
…………………………………….
}
class UseOut
{
public static void Main()
{
Decompose ob = new Decompose();
int i; double f;
i = ob.parts(10.125, out f);
Console.WriteLine(“Целая часть числа = ” + i);
Console.WriteLine(“Дробная часть равна = ” + а);
}
}
Один из классов в программе должен иметь метод Main(), с которого начинается выполнение программы.
Ref и out можно применять и к объектным параметрам. Фактически это соответствует передаче ссылки по ссылке и удобно, например для выполнения свопинга (взаимозамены) объектов.
Методы, конструкторы и операторы в С# можно перегружать. Также как в С++ компилятор различает их по сигнатуре и знает в какой точке программы выполнить правильный их выбор.
В методе может передаваться переменное число аргументов. Это указывается с помощью модификатора params.
Пример
…………………………
public int minVal(params int[] nums)
{
……………………………….
if (nums.Length == 0)
{………………………}
}
Все параметры сосредотачиваются в массиве параметров и к ним применимо свойство Length, возвращающее информацию о действительном числе аргументов.
Массивы и строки
Отличия при работе с массивами и строками в C# по сравнению с C++ - существенны. Массивы и строки создаются как объекты. Размеры и размерность массивов указываются сразу после указания типа элементов. Границы массивов в вычислениях автоматически контролируются.
Пример
int [,] table = new int[10, 20];
int [] nums = {99, 10, 100};
Для инициализации многомерных массивов используются вложенные фигурные скобки.
В С# допускается 2-мерные массивы с рваными краями. (Самостоятельно!)
Свойство Length позволяет выяснить число элементов в массиве или в строке массива.
Цикл foreach обеспечивает работу с коллекциями, одним из представителей которых является массив.
Пример
int sum = 0;
int [] nums = new int [10];
foreach(int x in nums)
sum += x; // x последовательно принимает значения элементов из массива nums
Строки в С# являются представителями типа данных string. Так же как и массивы строки – ссылочный тип данных. Строки можно сравнивать (==, !=, …), сцеплять с помощью оператора «+», копировать (метод Copy) и т.д.
Пример
char [] chararray = “test”;
string str = new string (chararray); // создание строки из массива типа char
Строки можно использовать в операторе switch.
Пример
string [] strs = {“один”, “два”, …};
……………………………………
foreach(string s in strs)
{
switch(s)
{
case “”:
Console.Write(1);
break;
case “”:
Console.Write(2);
break;
………………………………………
}
}
Дата добавления: 2016-05-26; просмотров: 1333;