Обучающие курсы:

Обучение профессии "Разработчик C#" + стажировка в Mail.ru
Обучение профессии "Разработчик Python" + трудоустройство
Обучение профессии "Веб-разработчик" + стажировка в Mail.ru


Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Передача параметров в функцию (ref , out)

Как вы уже знаете из предыдущего раздела обычные типы данных типа int, char передаются внутрь метода по значению, что не позволяет сохранять изменения в них после выхода из метода. Для того чтобы решить эту проблему необходимо использовать ключевые слова ref и out, позволяющие осуществить передачу обычного типа по ссылке.

Использование модификатора ref

В C# указание модификатора ref приводит к созданию вызова по ссылке вместо вызова по значению. Данный модификатор указывается при объявлении метода и при его вызове. Например:

using System;
class Numbers{
    public void Swap(ref int z,ref int w){
    	int temp = z;
    	z = w;
    	w = temp; 
    }

}
class Sample
{
	static void Main() 
	{
		int k = 10, l = 20;
		Numbers obj = new Numbers();
		obj.Swap(ref k,ref l);
		Console.WriteLine(k+" "+l); // k=20 , l=10
		Console.Read();
	}
}

Важным моментом при использовании ref является то, что значение переменной передаваемой в качестве параметра должно быть присвоено заранее до вызова метода, иначе при попытке компиляции возникнет ошибка компиляции.

Использование модификатора out

Модификатор out используется для возврата более одного значения из метода. Отличие out от ref состоит в том что передаваемую переменную не обязательно инициализировать. Также метод объявленный с модификатором out обязан присвоить значение соответствующей переменной, до своего завершения и передачи управления вызывающей функции. Например:

using System;
class Numbers{

    static public float Delete(float a,float b,out bool res){
    	if(b==0){
    	    res = false;
    	    return -1;
    	}
    	res = true;
    	return a/b;
    }

}
class Sample
{
	static void Main() 
	{
		bool flag;
		float a = 4, b = 2;
		float res = Numbers.Delete(a,b,out flag);
		try{
			if(flag){
				Console.WriteLine("Результат {0}/{1} = {2} ",a,b,res);
			}
			else{
				Console.WriteLine("Деление на 0");	
			}
		}
		catch(Exception e){
			Console.WriteLine(e.Message);
		}
		Console.Read();
	}
}

Передача произвольного количества аргументов.

При написании метода обычно известно количество аргументов, которые ему потребуются для работы, но иногда может возникнуть ситуация, когда это неудобно. Например: подсчет суммы произвольного количества чисел или вычисление максимума из произвольного количества чисел. Чтобы решить эту проблему нужно использовать массив с модификатором params, который позволяет передавать методу произвольное количество аргументов. Например:

using System;
class Numbers{

    static public int Summa(params int[]arr){
    	// Проверка переданы ли аргументы при  вызове метода
    	if(arr.Length==0){
    	    Console.WriteLine("Нет элементов в массиве");
    	    return 0;
    	}
    	int s = 0;
    	for(int i =0;i<arr.Length;i++){
    		s+=arr[i];
    	}
    	return s;
    }

}
class Sample
{
	static void Main() 
	{
		try{
			int [] ar= {1,2,3,4};
			Console.WriteLine(Numbers.Summa(ar));
			Console.WriteLine(Numbers.Summa()); // 
Метод вызывается без аргументов
			Console.WriteLine(Numbers.Summa(1,1,1,1));
		}
		catch(Exception e){
			Console.WriteLine(e.Message);
		}
		Console.Read();
		
	}
}

С параметром переменной длины можно также передавать обычные параметры при этом параметр переменной длины должен располагаться в списке аргументов последним. В любой метод можно передать только один параметр переменной длины. Например:

using System;
class Numbers{

    static public int Summa(string str,params int[]arr){
    	// Проверка переданы ли аргументы при  вызове метода
    	Console.WriteLine(str);
    	if(arr.Length==0){
    	    Console.WriteLine("Нет элементов в массиве");
    	    return 0;
    	}
    	int s = 0;
    	for(int i =0;i<arr.Length;i++){
    		s+=arr[i];
    	}
    	return s;
    }

}
class Sample
{
	static void Main() 
	{
		try{
			int [] ar= {1,2,3,4};
			Console.WriteLine(Numbers.Summa("Первый Звонок",ar));
			Console.WriteLine(Numbers.Summa("Второй Звонок")); // 
Метод вызывается без аргументов
			Console.WriteLine(Numbers.Summa("Третий Звонок",1,1,1,1));
		}
		catch(Exception e){
			Console.WriteLine(e.Message);
		}
		Console.Read();
		
	}
}

Домашнее задание

Разработать игру "двадцать одно" с компьютером. Правила необходимо найти (разузнать) самостоятельно. Карты выводятся с помощью выбранных вами символов.


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru