C # out параметры обмануть? - PullRequest
3 голосов
/ 25 февраля 2009

Привет, у меня есть код C #, похожий на этот:

int someNumber;
Thing someThing;

doStuff(out someNumber);
someThing = new Thing(someNumber); 

Я хотел бы знать, есть ли способ удалить someNumber и создать экземпляр someThing непосредственно в аргументах параметра.

Редактирование кода Actaul возвращает мне 8 параметров, но я просто старался сделать его простым, чтобы оно было больше похоже на:

int someNumber1, someNumber2, somNumber3, someNumber4,
someNumber5, someNumber6, someNumber7, someNumber8;

Thing someThing1, someThing2, someThing3, someThing4,
someThing5, someThing6, someThing7, someThing8;

doStuff(out someNumber1, out someNumber2, out someNumber3, out someNumber4,
out someNumber5, out someNumber6, out someNumber7, out someNumber8);

someThing1 = new Thing(someNumber1); etc.....................

Ответы [ 7 ]

5 голосов
/ 25 февраля 2009

Ну, если вы обнаружите, что делаете это регулярно, вы могли бы сделать что-то вроде:

public delegate void OutAction<T>(out T value);

public TResult UseOut<TIntermediate,TResult>
    (OutAction<TIntermediate> outAction,
     Func<TIntermediate,TResult> selector)
{
    TIntermediate tmp;
    outAction(out tmp);
    return selector(tmp);
}

Затем вызовите его с помощью (обратите внимание, что doStuff здесь группа методов - отсутствие () является преднамеренным!):

Thing someThing = UseOut(doStuff, x => new Thing(x));

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

РЕДАКТИРОВАТЬ: Когда вы начинаете получать несколько параметров, это становится намного сложнее - потому что выходной параметр может быть первый, второй, третий, четвертый и т. Д. ...

РЕДАКТИРОВАТЬ: немного проще версия:

public TResult ReturnOut<TResult>(OutAction<TResult> outAction)
{
    TResult tmp;
    outAction(out tmp);
    return tmp;
}

Использование:

Thing someThing = new Thing(ReturnOut(doStuff));
3 голосов
/ 25 февраля 2009

Ну, во-первых, есть ли причина, по которой вы не можете использовать обычный возврат вместо out здесь? Было бы чище (если нет веской причины).

Тогда вы можете использовать:

someThing = new Thing(doStuff());
1 голос
/ 25 февраля 2009

Не совсем. Вы можете передать someThing как byref, поэтому метод doStuff инициализирует его, но это неприятно. То, что у вас здесь, прекрасно.

Вероятно, вам следует просто вернуть значение из doStuff, и в этом случае это лучший подход:

var thing = new Thing(doStuff());

Параметры Out лучше всего использовать, когда вы хотите реализовать шаблон TryParse или когда вам нужно вернуть несколько значений из вызова функции. Если честно, даже тогда может быть лучше вернуть объект со свойствами, содержащими нужные вам значения.

0 голосов
/ 25 февраля 2009

Подобно ответу ck, если все ваши someNumber переменные являются целыми числами, вы можете DoStuff() вернуть List<int> или IEnumerable<int>, а затем выполнить итерацию по возвращенному списку для установки ваших Thing объектов. Если ваши someNumber переменные имеют разные типы, вы можете создать тип возвращаемого значения для возврата коллекции значений. Однако, если все эти значения являются просто параметрами конструктора для Thing объектов, я должен согласиться с ck, что вы действительно должны DoStuff() вернуть List<Thing> или IEnumerable<Thing>.

0 голосов
/ 25 февраля 2009

В этой конкретной ситуации вы не можете просто вернуть

List<Thing>

с объектами z уже созданы?

Я знаю, что это не отвечает на настоящий вопрос, но может быть полезно в этом сценарии.

0 голосов
/ 25 февраля 2009

Если вы не можете изменить вызываемую функцию и не хотите ее переносить, значит, вы застряли в своем коде.

Я бы посоветовал обернуть его, чтобы очистить. Я бы хотел вернуть массив int.

0 голосов
/ 25 февраля 2009

Я не думаю, что это возможно, учитывая, что doStuff не возвращает значение. почему ты хочешь сделать это? ИМХО размещение этих двух вызовов функций на отдельных линиях в любом случае намного удобнее для чтения, и даже если бы это было возможно, производительность, безусловно, не увеличилась бы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...