abdul wadood Ответов: 3

Реф против какой из них лучше использовать


Поскольку Реф передает данные в двух направлениях и передает данные в одну сторону.Но одна вещь, которую я не уверен, какой из них лучше использовать, я сделал простое практическое использование ref и out, которые имеют одинаковый выход..Если он имеет тот же выход, то в чем разница?

Вот мой код с использованием ключевого слова out:

Что я уже пробовал:

static void Main(string[] args)
        {
            Console.Write("First number = ");
            int num1 = int.Parse(Console.ReadLine());

            Console.Write("Second number = ");
            int num2 = int.Parse(Console.ReadLine());

            int remainder;
            int division;
            


            
            Remainder(num1, num2,out  remainder, out division);

            Console.WriteLine("Your Output {0} / {1} is {2} having remainder = {3}",num1,num2,division,remainder);


        }
        static void Remainder(int FN,int SN,out int remainder,out int division)
        {
            remainder = FN % SN;
            division = FN / SN;
        }


Теперь с помощью ключевого слова ref :

static void Main(string[] args)
        {
            Console.Write("First number = ");
            int num1 = int.Parse(Console.ReadLine());

            Console.Write("Second number = ");
            int num2 = int.Parse(Console.ReadLine());

            int remainder = 0;
            int division = 0;
            


            
            Remainder(num1, num2,ref  remainder, ref division);

            Console.WriteLine("Your Output {0} / {1} is {2} having remainder = {3}",num1,num2,division,remainder);


        }
        static void Remainder(int FN,int SN,ref int remainder,ref int division)
        {
            remainder = FN % SN;
            division = FN / SN;
        }


Используя метод остатка, он просто берет 2 числа и дает деление и остаток.Работает одинаково для обоих, какой из них я должен использовать?

phil.o

Что вы подразумеваете под словами "ref передает данные двумя способами, а out передает данные одним способом"? Откуда берется это предположение?

3 Ответов

Рейтинг:
23

phil.o

ref и out они очень похожи в том, что позволяют передавать параметры по ссылке, а не по значению.
Единственная разница заключается в том, что out не требует инициализации параметра перед передачей, в то время как ref требуется уже инициализированный параметр. Кроме того, ни один из них не лучше другого; вы должны использовать то, что соответствует вашему контексту. Если параметр не инициализирован, используйте out; если нет, используйте ref.


BillWoodruff

+5

phil.o

Спасибо :)

abdul wadood

просто и полезно. Спасибо

phil.o

Добро пожаловать.

Рейтинг:
19

OriginalGriff

Как сказал Фил, они очень похожи.
Но... если вы не используете переданное значение - как это делает ваш пример, - то используйте ref это избыточно и просто добавляет дополнительные накладные расходы к каждому вызову. С помощью out вместо этого параметры больше отражают то, что вы на самом деле делаете.
Но... Я бы не использовал ни то, ни другое в этом случае: я бы либо создал структуру DivisonResult:

public struct DivisionResult
    {
    public int Remainder { get; set; }
    public int Quotient { get; set; }
    }
И верните новый экземпляр этого:
public static DivisionResult Remainder(int FN, int SN)
    {
    return new DivisionResult() { Remainder = FN % SN, Quotient = FN / SN };
    }

Или я бы вернул кортеж: Класс Кортежа (Система)[^]


phil.o

5 для лучшей альтернативы :)

BillWoodruff

+5
Да здравствует кортеж c#7 !

публичный статический (int,int) остаток(int FN, int SN)
{
возвращение (ФН % СН НС / СН);
}

OriginalGriff

Я все еще не убежден в таких "анонимных кортежах" - я не убежден, что они делают код более читабельным, если вы не приложите усилий и не назовете их:

возвращение (остаток: ФН % СН коэффициент: ФН / ЗП);
...
(int остаток, int частное) = деление( FN, SN);

BillWoodruff

хорошая мысль ! если бы я был в команде, я бы использовал имена. твое здоровье, Билл

abdul wadood

Прямо сейчас, как новичок, я начал узнавать только о ref и out - никакого представления о структуре и кортеже, посмотрим на них позже...

в любом случае спасибо за решение. +5

OriginalGriff

Всегда пожалуйста!

Рейтинг:
1

George Swan

Я бы сказал, что ни один из ваших вариантов не является лучшим. Я хотел бы использовать Tuple Что-то вроде этого:

static Tuple<int, int> Remainder(int dividend, int divisor)
       {

           int quotient = dividend / divisor;
           int remainder = dividend % divisor;
           return Tuple.Create(quotient, remainder);
       }

           int dividend = 10;
           int divisor = 3;
           var resultTuple = Remainder(dividend, divisor);
           Console.WriteLine("Your Output {0}/{1} is {2} having remainder = {3}",
             dividend, divisor, resultTuple.Item1, resultTuple.Item2);


abdul wadood

Не знаю, что такое Кортеж..

George Swan

https://msdn.microsoft.com/en-us/library/system.tuple(v=против 110).aspx