Как я могу использовать Tuple <> для возврата значения вместо использования аргумента 'out' в методе?

1

Я хочу получить полученное значение из метода void с помощью Tuple<>.

Пример небольшого кода:

XElement xRoot;
DirectoryInfo di;
XElement xResult;
AddXmlNode(xRoot, di, xResult);

void AddXmlNode(Tuple<XElement, DirectoryInfo, XElement> task)
{
    var xNode = (XElement)task.Item3;
    xNode = new XElement("dir1");
}

Исправьте меня, если я ошибаюсь: новая переменная xNode теперь указывает на ту же область памяти "управляемой кучи", что и xResult? Поэтому, если значение изменения xNode влияет на xResult. Правильно?

Если я ошибаюсь, объясните, как я могу вернуть значение через Tuple<>

  • 1
    @ Саванна, можешь проверить? Тем не менее, концепции, лежащие в его основе, не всегда легко понять, и не является решением, которое получает то, что он пытается сделать.
Теги:
tuples
heap-memory

1 ответ

2
Лучший ответ

Прежде всего, да, эта строка:

var xNode = (XElement)task.Item3;

Заставляет оба элемента указывать на один и тот же элемент в памяти. Это означает, что если вы это сделали:

xNode.SomeProperty = "Bob";

Обе ссылки получат "Боб", если впоследствии они получат доступ к "SomeProperty". Однако вы пишете это:

xNode = new XElement("dir1");

Это переназначает только переменную xNode новому объекту. Теперь они указывают на два разных объекта. Чтобы получить то, что вы хотите, вам нужно передать xResult по xResult, что я не думаю, что вы можете сделать с Tuple. Даже если это возможно, это будет путать, и я бы не сделал это лично. Код, в котором вы нуждаетесь:

AddXmlNode(new Tuple<XElement, DirectoryInfo>(xRoot, di), ref xResult);

void AddXmlNode(Tuple<XElement, DirectoryInfo> task, ref XElement result)
{
    var xNode = (XElement)task.Item3;
    xNode = new XElement("dir1");
}

Кстати, так как Tuple строго типизирован, вам не нужно xNode первоначальном назначении переменной xNode, он должен автоматически подбирать его.

  • 0
    спасибо за объяснение! Но мне нужно передать только один аргумент методу (потому что я запускаю его в другом потоке), поэтому я использую Tuple<> . Любые советы?
  • 0
    @ Андрей да, не делай этого! Передача ссылки в ветке просто напрашивается на неприятности. Теперь у вас есть высокая вероятность того, что эта переменная будет «сражаться» обоими потоками, потенциально назначая ее и т. Д. Я бы переосмыслил то, что вы делаете, потому что у вас есть ночной кошмар, ожидающий своей настройки.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню