Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> C# методы ? как вернуть из метода несколько значений 
:(
    Опции темы
Remiznik
Дата 16.4.2008, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 30.4.2005

Репутация: нет
Всего: 1



написал простенький метод ... проблема втом что вернуть надо несколько значений как это сделать ? или что можете посоветовать в место метода ... что то типа процедуры чтоб можно было вернуть несколько значений !!
PM MAIL   Вверх
QryStaL
Дата 16.4.2008, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 10
Всего: 32



Код

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



--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
Remiznik
Дата 16.4.2008, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 30.4.2005

Репутация: нет
Всего: 1



мне надо вернуть из метода несколько значений ... а в это коде я как понимаю не чего не возврашаеться !!
а я вот что подумал если все переменные сделать глобальными получить результат и нечего не возврашать а просто использовать перемены из метода ? 
PM MAIL   Вверх
SKrivosein
Дата 17.4.2008, 02:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

Репутация: 4
Всего: 8



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

Это сообщение отредактировал(а) SKrivosein - 17.4.2008, 03:00


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
jonie
Дата 17.4.2008, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
QryStaL
Дата 17.4.2008, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 10
Всего: 32



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();
    }
}



--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
VisualProgrammerNET
Дата 18.4.2008, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.10.2005
Где: Зеленоград

Репутация: 1
Всего: 6



вариант QryStaL оптимален. Ещё можно возвращать массив. 


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
source777
Дата 18.4.2008, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 3
Всего: 56



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

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

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



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
Rififi
Дата 18.4.2008, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: нет
Всего: 36



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

так уже (:

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

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


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

PM MAIL   Вверх
source777
Дата 18.4.2008, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 3
Всего: 56



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

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



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
Remiznik
Дата 24.4.2008, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 30.4.2005

Репутация: нет
Всего: 1



здела как ты написал только почемуто у меня компилятор говарит что нужно сначала опеределить переменые для метода но они у меня определены !
Код

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;
            }
                    }
   }

PM MAIL   Вверх
QryStaL
Дата 24.4.2008, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 10
Всего: 32



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

Код

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



--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
Remiznik
Дата 24.4.2008, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 30.4.2005

Репутация: нет
Всего: 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:14
PM MAIL   Вверх
Wanderer2019
Дата 24.4.2008, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 937
Регистрация: 3.12.2004
Где: Санкт-Петербург/П рага

Репутация: 2
Всего: 17



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

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

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


и все.
PM ICQ MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0857 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.