Шаг 6 - C# функции.

Передача параметров

Можно передавать объекты по значению, а можно по ссылке, для этого есть ключевое слово ref:

static void Swap(ref int a, ref int b)
{
	int t = a;
	a = b;
	b = t;
}

Если нужно просто вернуть значение из функции, а не изменить существующее значение, то нужно использовать ключевое слово out:

static void SolveSquareEquation(
	double a, double b, double c, 
	out double x1, out double x2);

Причем соответствующее слово должно ставиться не только в заголовке функции, но и при ее вызове

swap(ref aa, ref bb);

Функции с переменным числом параметров

В стек помещается только массив объектов, а сами объекты размещаются теперь в куче, а не на стеке (в отличии от C++).

Для компилятора указывается ключевое слово params:

using System;
class Test 
{
	static void F(params int[] args)
	{
		Console.WriteLine("# of arguments: {0}", args.Length);
		for (int i = 0; i < args.Length; i++)
		{
			Console.WriteLine("\targs[{0}] = {1}", i, args[i]);
		}
		static void Main()
		{
			F();
			F(1);
			F(1, 2);
			F(1, 2, 3);
			F(new int[] {1, 2, 3, 4});
		}
	}
}

Управление видимостью

Есть пять типов видимости:

то же самое относится ко всему, что находится внутри класса

Функции и наследование

При наследовании можно скрыть функцию, для этого потребуется перед ней написать ключевое слово new. Можно переопределить, использовав ключевое слово override. Но переопределить можно только те функции, которые были объявлены ключевым словом virtual, как виртуальные (в отличие от Java, функции в C# по умолчанию невиртуальные)

Свойства

Позволяют скрыть способ получения значения а так же реализовать дополнительную логику.

public string Caption
{
	get
	{
		return ...;
	}
	set
	{
		... = value;
		...redraw...
	}
}

Если написать только функцию доступа get, а функцию доступа put пропустить, то свойство будет доступным только для чтения.

Индексаторы

Индексаторы позволяют использовать объект так же, как массив. Например, можно сделать "битовый массив" упаковав в байт по восемь бит.

class BitArray
{
	public bool this[int index]
	{
		get
		{
			return ...;
		}
		set
		{
			... = value;
		}
	}
}


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Сергей Радкевич