• Добро пожаловать на сайт - Forumteam.digital !

    Что бы просматривать темы форума необходимо зарегестрироваться или войти в свой аккаунт.

    Группа в телеграме (подпишитесь, что бы не потерять нас) - ForumTeam Chat [Подписатся]
    Связь с администратором - @ftmadmin

18. Разбираем некоторые параметры и задание на дом.

Redman

<FORUMTEAM>
Команда форума
Регистрация
13.11.17
Сообщения
13.340
Реакции
8.377
Баллы
1.200
FTC
208¢
Передача параметров в функцию (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();
       
    }
}

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