Я использовал Java, C++, .Net. (в этой последовательности). Когда меня спрашивали о побочных значениях по сравнению с анкерами на интервью, я всегда хорошо справлялся с этим вопросом ... возможно, потому что никто не углублялся в него. Теперь я знаю, что я не вижу всей картины.Если аргумент передается по ссылке в этом примере .net?
Я смотрел на этот раздел кода, написанного кем-то другим:
XmlDocument doc = new XmlDocument();
AppendX(doc); // Real name of the function is different
AppendY(doc); // ditto
Когда я увидел этот код, я подумал: погоди, я не должен использовать ref
перед doc
переменной (и изменить AppendX/Y
соответственно? Он работает так, как написано, но поставил вопрос, действительно ли я понимаю ключевое слово ref
в C#.
Как я думал об этом больше, я вспомнил ранние Java-дни (вступительный язык колледжа). в некотором коде, который я написал, и у него был умственный b замок - он все время спрашивал меня, какие вещи передаются по ссылке и когда по стоимости. Мой неосведомленный ответ был чем-то вроде: Чувак, на Java есть только один вид перехода, и я забыл, какой из них есть :). Чил, не переусердствуйте и просто закодируйте.
Java все еще не имеет ref
, не так ли? Тем не менее, хакеры Java кажутся продуктивными. Во всяком случае, кодирование на C++ разоблачило меня по всему эталонному делу, и теперь я смущен.
Следует ли использовать ref
в примере выше?
Я предполагаю, что когда ref
применяется к типам значений: примитивам, перечислениям, структурам (есть ли что-нибудь еще в этом списке?), Это имеет большое значение. И ... когда применяется к объектам, это не потому, что это все по ссылке. Если все было так просто, то почему компилятор не ограничил использование ключевого слова ref
подмножеством типов.
Что касается объектов, подходит ли ref
как комментарий? Ну, я помню, что могут быть проблемы с null
, а ref
также полезен для инициализации нескольких элементов внутри метода (поскольку вы не можете возвращать несколько вещей с тем же легкостью, что и в Python).
Спасибо.
Добавление параметра 'ref' к методу - это то, что вы должны использовать только тогда, когда оно вам нужно. По умолчанию вы должны избегать параметров 'ref'. Если он работает так, как написано, не добавляйте 'ref'. В стороне, часто можно избежать отказа от ref, так как следующие два фрагмента, как правило, будут давать одинаковые результаты (учитывая правильные реализации 'foo'):' foo (ref x); 'и' x = foo (х); '. Лично, когда я даю выбор, я буду реализовывать foo на втором пути. Поэтому неудивительно, что Java-программисты могут выжить без него. – Brian
@Brian, когда у вас есть 'x = foo (x);', ваш 'x' также может быть неизменным (например,' string'). Теперь ... когда один метод должен «возвращать» несколько переменных, и лучше всего их вычислить, потому что они связаны ... тогда вы хотели бы использовать ref или все еще нет? Изменяется ли ответ в зависимости от того, являются ли аргументы неизменными или нет? Думаю, так и будет. –
Если вам нужно вернуть несколько переменных, вы можете использовать 'ref' для этого. Альтернативой является возвращение экземпляра класса, который содержит все материалы, которые вы хотите вернуть. Это часто, но не всегда, лучше. Имейте в виду, что вы также можете использовать параметр 'out' вместо' ref'. Если вы хотите возвратить несколько переменных, но на самом деле их не нужно передавать, «out» лучше. Например, 'foo (out x);' как 'foo (ref x);', но должен использоваться с неинициализированным x. – Brian