Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > C# методы ?


Автор: Remiznik 16.4.2008, 22:25
написал простенький метод ... проблема втом что вернуть надо несколько значений как это сделать ? или что можете посоветовать в место метода ... что то типа процедуры чтоб можно было вернуть несколько значений !!

Автор: QryStaL 16.4.2008, 22:38
Код

public void Method(out a, out b, out c)
{
    //
}

Автор: Remiznik 16.4.2008, 22:41
мне надо вернуть из метода несколько значений ... а в это коде я как понимаю не чего не возврашаеться !!
а я вот что подумал если все переменные сделать глобальными получить результат и нечего не возврашать а просто использовать перемены из метода ? 

Автор: SKrivosein 17.4.2008, 02:45
out -это модификатор параметра метода,метод ДОЛЖЕН приделить параметру значение которое потом вернется из метода. Ещё есть модификатор ref, который ДОЛЖЕН передат параметр как ссылочный тип в метод(аналог & в С++). Важно понять что  С# различает две категории типов данных:типы значений-"value type" и ссылочные типы-"reference type"(ну а ещё для  точности-казатели),от этого и зависит передача значений.А то что ты написал во втором своём посте по моему...  smile 

Автор: jonie 17.4.2008, 08:41
еще вариант пихать все это (то что надо вернуть) в структуру (или класс,например) и делать ее типом возврата функции....

Автор: QryStaL 17.4.2008, 08:52
Remiznik, что-то не пойму в чем проблема. Глянуть в МСДН пример использования ключевого слова out ?

Код

class Program
{
    public static void Main()
    {
        int a;
        string b;
        object c;
        Method(out a, out b, out c);
        Console.WriteLine(a + b + c);
        Console.Read();
    }
    public static void Method(out int a, out string b, out object c)
    {
        a = 1;
        b = "_";
        c = new object();
    }
}

Автор: VisualProgrammerNET 18.4.2008, 13:30
вариант QryStaL оптимален. Ещё можно возвращать массив. 

Автор: source777 18.4.2008, 20:11
Важным условием тут является такой критерий, как связность возвращаемых значений:
1) если они являются набором(например, корни уравнения), то следует вернуть либо массив, либо коллекцию
2) если они принадлежат к одной сущности, то следует вернуть либо структуру, либо класс
3) если они никак не связаны, то следует возвращать их как out параметры... 

P.S. Кстати в связи с тяготением C# к функциональной парадигме программирования, я не удивлюсь, если в следующей версии появятся кортежи(tuples), тогда для третьего случая надо будет использовать именно их  smile

Добавлено через 3 минуты и 22 секунды
Цитата(Remiznik @  16.4.2008,  22:41 Найти цитируемый пост)
а я вот что подумал если все переменные сделать глобальными получить результат и нечего не возврашать а просто использовать перемены из метода ?  
В ОО-программах не должно быть глобальных переменных, это противоречит самой основе ОО-парадигмы...

Автор: Rififi 18.4.2008, 20:15
Цитата(source777 @  18.4.2008,  20:11 Найти цитируемый пост)
я не удивлюсь, если в следующей версии появятся кортежи(tuples)

так уже (:

примерно так в c# 3.x:

Код
return new { 123, "zzz", new object() };


потом правда запаришься доставать :gigi:

Автор: source777 18.4.2008, 20:38
Цитата(Rififi @  18.4.2008,  20:15 Найти цитируемый пост)
так уже (:
Анонимные типы - это совсем не то же самое что кортежи, более того их даже и применить для реализации чего-нить похожего на кортежи очень сложно, если вообще возможно...

P.S. У тебя там ещё и ошибка в синтаксисе...

Автор: Remiznik 24.4.2008, 12:04
здела как ты написал только почемуто у меня компилятор говарит что нужно сначала опеределить переменые для метода но они у меня определены !
Код

class Program
    {
        public static void Main(string[] args)
        {
            double L_op, x_op, y_op, z_op;
            Optim(out L_op, out x_op, out y_op, out z_op);
            Console.WriteLine(z_op.ToString());
        }
        private static void Optim(out double L_op, out double x_op,out double y_op,out double z_op)
        {
            double x_max, y_max, z_max;
            double x1, y1, z1, x2, y2, z2, x3, y3, z3; 
            int c, m, k; 
            x_max = 40; y_max = 20;
            z_max = 2; k = 1;
            x1 = 1; y1 = 1; z1 = 1;
            x2 = 2; y2 = 2; z2 = 3;
            x3 = 3; y3 = 3; z3 = 3;// размеры комнаты задать с клавиатуры
            double  L_min;
            L_min = x_max * y_max * z_max;
            for (double dx = 0; dx <= x_max; )
            {
                for (double dy = 0; dy <= y_max; )
                {
                    for (double dz = 0; dz <= z_max; )
                    {
                        double L1, L2, L3, L_ras;
                        L1 = Math.Abs(dx - x1) + Math.Abs(dy - y1) + Math.Abs(dz - z1);
                        L2 = Math.Abs(dx - x2) + Math.Abs(dy - y2) + Math.Abs(dz - z2);
                        L3 = Math.Abs(dx - x3) + Math.Abs(dy - y3) + Math.Abs(dz - z3);
                        L_ras = L1 + L2 + L3;
                        if (L_ras <= L_min)
                        {
                            L_op = L_ras;
                            x_op = dx;
                            y_op = dy;
                            z_op = dz;
                        }
                        dz=dz + 0.1;
                    }
                    dy=dy + 0.1;
                }
                dx = dx + 0.1;
            }
                    }
   }

Автор: QryStaL 24.4.2008, 12:10
Потому что переменные, обозначенные out, должны обязательно инициализироваться значениями перед выходом из метода. У тебя этого не происходит. Допиши в начало метода

Код

L_op = 0;
x_op = 0;
y_op = 0;
z_op = 0;

Автор: Remiznik 24.4.2008, 12:12
Цитата(QryStaL @ 24.4.2008,  12:10)
Потому что переменные, обозначенные out, должны обязательно инициализироваться значениями перед выходом из метода. У тебя этого не происходит. Допиши в начало метода

Код

L_op = 0;
x_op = 0;
y_op = 0;
z_op = 0;

спасибо заработало ))

Автор: Wanderer2019 24.4.2008, 12:13
Цитата(Remiznik @  24.4.2008,  12:04 Найти цитируемый пост)
здела как ты написал только почемуто у меня компилятор говарит что нужно сначала опеределить переменые для метода но они у меня определены !

нутк определи же их внутри функции Optim. Например запиши в них 0:
Код

            L_op = 0;
            x_op = 0;
            y_op = 0;
            z_op = 0;


и все.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)