в чем различие между ключевыми словами ref и out

в чем различие между ключевыми словами ref и out. Смотреть фото в чем различие между ключевыми словами ref и out. Смотреть картинку в чем различие между ключевыми словами ref и out. Картинка про в чем различие между ключевыми словами ref и out. Фото в чем различие между ключевыми словами ref и out

Когда мы передаем аргумент типа int, double, decimal и т.д. (базовые типы значений), мы передаем не фактическое значение, а его копию. Это означает, что наши исходные значения не меняются внутри методов, потому что мы передаем новую копию исходного значения. В результате все операции внутри метода выполняются с копируемым значением.

Мы можем показать это на примере:

в чем различие между ключевыми словами ref и out. Смотреть фото в чем различие между ключевыми словами ref и out. Смотреть картинку в чем различие между ключевыми словами ref и out. Картинка про в чем различие между ключевыми словами ref и out. Фото в чем различие между ключевыми словами ref и out

Использование ключевых слов Ref и Out

Мы можем изменить поведение по умолчанию. Если мы хотим изменить исходные значения внутри наших методов, мы можем сделать это с помощью ключевых слов ref и out внутри сигнатуры метода.

Пример для типа значения

В предыдущем примере мы видели, как ведут себя переменные типа значения, если мы не используем ключевые слова ref или out. В этом примере мы увидим поведение переменных типа значения при использовании этих ключевых слов:

в чем различие между ключевыми словами ref и out. Смотреть фото в чем различие между ключевыми словами ref и out. Смотреть картинку в чем различие между ключевыми словами ref и out. Картинка про в чем различие между ключевыми словами ref и out. Фото в чем различие между ключевыми словами ref и out

Все это предельно ясно. Если мы используем ключевое слово ref или для out переменной типа значения, ее исходное значение изменится. Но разница в том, что с ключевым словом out мы можем использовать неинициализированные переменные.

Пример для ссылочного типа

Мы узнали, что ссылочный тип не хранит свое значение в собственной ячейке памяти. Он хранит адрес того места в памяти, где хранится значение. Поэтому, когда мы отправляем аргумент в качестве ссылочного типа методу и изменяем этот параметр, исходное значение изменяется. Это потому, что мы отправляем не копию значения, а копию адреса, который указывает на исходное значение. Это то же самое, что и при использовании ключевого слова ref с типами значений.

Тем не менее, мы можем использовать ключевое слово ref со ссылочными типами, если мы хотим создать новый объект с тем же адресом.

Давайте посмотрим это на примере:

в чем различие между ключевыми словами ref и out. Смотреть фото в чем различие между ключевыми словами ref и out. Смотреть картинку в чем различие между ключевыми словами ref и out. Картинка про в чем различие между ключевыми словами ref и out. Фото в чем различие между ключевыми словами ref и out

Резюме

Теперь мы знаем, как использовать ключевые слова ref и out с типами значений и ссылок. Это довольно полезная функция в C#, поэтому знание того, как работать с этими ключевыми словами, является преимуществом для разработчиков.

В следующем посте мы поговорим о рекурсии и рекурсивных методах рекурсии и рекурсивных методах.

Источник

BestProg

Содержание

Поиск на других ресурсах:

Модификатор параметра ref используется в описании формального параметра метода. Модификатор параметра ref указывается перед типом формального параметра, как показано ниже:

Общая форма метода в классе, который получает формальный параметр ref следующая:

При вызове такого метода из другого кода, перед параметром также ставится модификатор ref :

где argument – аргумент, который передается в метод. Этого требует синтаксис C#.

2. Примеры методов, которые используют модификатор параметра ref

Вызов метода Mult5() из другого программного кода

Вызов метода из другого класса может быть таким как описан низшее

Следует заметить, что при вызове метода Calc() обязательно указываются модификаторы ref :

Модификатор параметра out используется, если необходимо выполнение двух условий:

Модификатор out для параметра с именем param типа type указывается в начале его объявления

Общая форма метода, который получает один параметр с модификатором out имеет вид

4. Примеры методов, которые используют модификатор параметра out

Пример 1. Разработать метод, который возвращает число Авогадро. Число Авогадро задается параметром метода.
Текст метода:

Вызов метода из другого программного кода

Пример 3. Разработать метод, который возвращает название цифры в строке.

Использование метода TextNumber() класса Number

Между модификаторами ref и out есть три взаимосвязанных отличия:

Результат выполнения программы

Источник

В чем разница между ключевыми словами » ref » и «out»?

Я создаю функцию, где мне нужно передать объект, чтобы он мог быть изменен функцией. В чем разница между:

какой я должен использовать и почему?

24 ответов

ref сообщает компилятору, что объект инициализируется до входа в функцию, в то время как out сообщает компилятору, что объект будет инициализирован внутри функции.

пока ref две стороны, out не только.

на ref модификатор означает, что:

на out модификатор означает, что:

предположим, дом появляется в кабине Питера по поводу записки о отчетах TPS.

Если бы дом был аргументом ref, у него была бы печатная копия записки.

Я собираюсь попробовать свои силы в объяснения:

Я думаю, что мы понимаем, как типы значений работает? Типы значений (int, long, struct и т. д.). Когда вы отправляете их в функцию без команды ref, она копирует данные. Все, что вы делаете с этими данными в функции, влияет только на копию, а не на оригинал. Команда ref отправляет фактические данные, и любые изменения повлияют на данные вне функции.

» ок » в запутанной частью, ссылочные типы:

позволяет создать ссылку типа:

когда вы новый someobject, создал две части:

теперь, когда вы посылаете в someobject в метод без ref он копирует ссылка указатель, а не данные. Так вы теперь вот что:

две ссылки, указывающие на один и тот же объект. Если вы измените свойство someobject использование reference2 повлияет на те же данные, на которые указывает reference1.

если вы нуль из reference2 или указать новые данные это не повлияет на reference1 ни reference1 точек данных.

теперь, что происходит, когда вы отправляете someobject по реф методу? The фактическое ссылка to someobject передаются в метод. Итак, у вас есть только одна ссылка на данные:

но что это значит? Он действует точно так же, как отправка someobject не ref за исключением двух основных вещей:

1) Когда вы обнуляете ссылку внутри метода, она будет обнулять ссылку вне метода.

2) Теперь вы можете указать ссылку на совершенно другое местоположение данных и ссылку вне функции теперь будет указывать на новое местоположение данных.

вы должны использовать out в предпочтении везде, где это достаточно для ваших требований.

В C#, метод может возвращать только одно значение. Если вы хотите вернуть более одного значения, вы можете использовать ключевое слово out. Модификатор out возвращается как return-by-reference. Самый простой ответ заключается в том, что ключевое слово «Выход» используется для получения значения из метода.

В C#, когда вы передаете тип значения, такой как int, float, double и т. д. в качестве аргумента параметра method он передается по значению. Поэтому при изменении значения параметра он не влияет на аргумент в вызове метода. Но если вы пометите параметр ключевым словом» ref», он отразится в фактической переменной.

расширение примера собаки, кошки. Второй метод с ref изменяет объект, на который ссылается вызывающий объект. Отсюда И «Кот».

поскольку вы передаете в ссылочный тип (класс) нет необходимости использовать ref потому что по умолчанию только ссылка к фактическому объекту передается, и поэтому вы всегда меняете объект за ссылкой.

пока вы проходите в классе, вам не нужно использовать ref Если вы хотите изменить объект внутри метода.

ref и out ведут себя аналогично, за исключением следующих отличий.

это потому, что первый изменяет вашу строку-ссылку на точку «Baker». Изменение ссылки возможно, потому что вы передали ее через ключевое слово ref (=> ссылка на ссылку на строку). Второй вызов получает копию ссылки на строку.

тогда s-это ссылка на класс string, который содержит текст «возможность»! Другое назначение той же переменной через

не изменяет исходную строку, а просто создает новый экземпляр и пусть s-точка на этот экземпляр!

вы можете попробовать его со следующим небольшим примером кода:

чего вы ждете? То, что вы получите, все еще «в состоянии», потому что вы просто устанавливаете ссылку в s на другой экземпляр, а s2 указывает на исходный экземпляр.

изменить: строка также неизменяема, которая означает, что просто нет метода или свойства, которое изменяет существующий экземпляр строки (вы можете попытаться найти его в документах, но вы не будете fins any 🙂 ). Все методы манипуляции строками возвращают новый экземпляр string! (Вот почему вы часто получаете лучшую производительность при использовании класса StringBuilder)

Out: Оператор return может использоваться для возврата только одного значения из функции. Однако, используя выходные параметры, можно вернуть два значения из функции. Выходные параметры похожи на опорные параметры, за исключением того, что они передают данные из метода, а не в него.

следующий пример иллюстрирует это:

в C# вы объявляете ссылочные параметры с помощью ключевого слова ref. Следующий пример демонстрирует это:

ref и out работают так же, как передача ссылок и передача указателей, как в C++.

для ref аргумент должен быть объявлен и инициализирован.

для out аргумент должен быть объявлен, но может быть или не быть инициализирован

для тех, кто учится на примере (как я) вот что говорит Антоний Колесов.

Я создал некоторые минимальные примеры ref, out и другие, чтобы проиллюстрировать эту точку. Я не освещаю лучшие практики, просто примеры, чтобы понять различия.

ref означает, что значение в параметре ref уже установлено, метод может считывать и изменять его. Используя ключевое слово ref означает, что абонент отвечает за инициализацию значением параметра.

out сообщает компилятору, что инициализация объекта является обязанностью функция, функция должна назначить параметру out. Нельзя оставлять его без назначения.

Время Создания:

(1) Мы создаем вызова метода Main()

Во Время Выполнения:

(4) Среда выполнения создает объект списка в куче в местоположении памяти #FF (все эти адреса, например, sakes)

(5) среда выполнения будет хранить начальный адрес #FF объекта в #00(или, другими словами, сохраняет ссылку на объект списка в указателе myList )

назад к авторскому времени:

(6) Затем мы передаем объект List в качестве аргумента myParamList к вызываемому методу modifyMyList и назначить новый объект списка это

Во Время Выполнения:

(7) среда выполнения запускает процедуру вызова для вызываемого метода и в ее составе проверяет тип параметров.

(9) затем он также сохраняет в нем значение #FF.

(10) среда выполнения создает объект списка в куче в местоположении памяти #004 и заменяет #FF в #04 с этим значением (или разыменовал исходный объект списка и указал на новый объект списка в этом методе)

адрес в #00 не изменяется и сохраняет ссылку на #FF (или оригинал myList указатель не нарушается).

на ref ключевое слово-это директива компилятора для пропуска генерации кода времени выполнения для (8) и (9), что означает, что для параметров метода не будет выделения кучи. Он будет использовать исходный указатель #00 для работы с объектом в #FF. Если исходный указатель не инициализирован, среда выполнения перестанет жаловаться, что не может продолжить, так как переменная не инициализирована

на из ключевое слово-это директива компилятора, которая в значительной степени совпадает с ref с небольшой модификацией в (9) и (10). Компилятор ожидает, что аргумент будет неинициализирован и продолжит работу с (8), (4) и (5) для создания объекта в куче и сохраняет свой начальный адрес в переменной argument. Неинициализированная ошибка не будет выброшена, и любая сохраненная предыдущая ссылка будет потеряна.

вы можете проверить этот код, он опишет вам его полную разницу когда вы используете «ref», это означает, что u уже инициализирует этот int/string

но когда вы используете «из» он работает в обоих условиях wheather u инициализирует, что int / string или нет но u должен инициализировать эту int / string в этой функции

Ref: Ключевое слово ref используется для передачи аргумента в качестве ссылки. Это означает, что при изменении значения этого параметра в методе он получает отражение в вызывающем методе. Аргумент, передаваемый с помощью ключевого слова ref, должен быть инициализирован в вызывающем методе до его передачи вызываемому методу.

Out: Ключевое слово out также используется для передачи аргумента, такого как ref keyword, но аргумент может быть передан без присвоения ему значения. Аргумент, который передаваемое с помощью ключевого слова out должно быть инициализировано в вызываемом методе, прежде чем оно вернется к вызывающему методу.

Ref и out в методе перегрузки

оба ref и out не могут использоваться в перегрузке метода одновременно. Однако ref и out обрабатываются по-разному во время выполнения, но они обрабатываются одинаково во время компиляции (CLR не дифференцируется между ними, пока он создавал IL для ref и out).

ниже я показал пример использования как Ref и из. Теперь, вы все будете очищены о ref и out.

в приведенном ниже примере, когда я комментирую / / myRefObj = новый myClass < Name = " ref outside called!! ">; line, получит сообщение об ошибке «использование неназначенной локальной переменной «myRefObj»», но нет такой ошибки в из.

где использовать Ref: когда мы называем процедура с параметром in и тем же параметром будет использоваться для хранения выходных данных этого proc.

где использовать: когда мы вызываем процедуру без параметра in, и тот же параметр будет использоваться для возврата значения из этого proc. Также обратите внимание на выход

С точки зрения метода, который получает параметр, разница между ref и out это то, что C# требует, чтобы методы должны писать каждому out параметр перед возвратом и не должен ничего делать с таким параметром, кроме передачи его как out параметр или запись в него, пока он не будет передан как out параметр к другому методу или написанный сразу. Обратите внимание, что некоторые другие языки не предъявляют таких требований; виртуальный или метод интерфейса, который объявлен в C# с

Если вы хотите передать свой параметр как ref, то вы должны инициализировать его перед передачей параметра функции, иначе компилятор сам покажет ошибку.Но в случае параметра out вам не нужно инициализировать параметр object перед передачей его в метод.Можно инициализировать объект в самом вызывающем методе.

Я играл с ref и нашел этот пример довольно интересные. Я думал, зов RefEater(ref s1); вызовет ошибку сборки, как во втором прокомментированном случае, но s1 поле инициализируется значением по умолчанию перед вызовом конструктора (https://stackoverflow.com/a/1920659/5612780).

возможно, я не так хорош в этом, но, конечно, строки (даже если они являются технически ссылочными типами и живут в куче) передаются по значению, а не по ссылке?

вот почему вам нужен ref если вы хотите, чтобы изменения существовали за пределами области действия функции, вы не передаете ссылку иначе.

насколько я знаю, вам нужно только ref для структур / типов значений и самой строки, поскольку string является ссылочным типом, который притворяется, что он есть, но не является тип значения.

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

имейте в виду, что ссылочный параметр, который передается внутри функции, непосредственно обрабатывается.

Это собака, а не кошка. Следовательно, вы должны напрямую работать на someObject.

Источник

Ключевые слова in, out и ref в методах C#

Зачем нужны ключевые слова in, out и ref?

Теперь вызовем наш метод в основной программе, например, вот так:

Что выведет на экран наша программа. Смотрим:

Передача параметров по ссылке. Ключевое слово ref

Ключевое слово ref позволяет передавать аргумент (параметр) по ссылке, а не по значению. Если мы передаем параметр по ссылке, то этот параметр (переменную) можно изменить внутри метода, например, перепишем наш метод Addition :

Теперь результат работы программы будет следующий:

Результат выполнения метода: 6. Значение переменной после выполнения метода: 6

Как видите, передача параметра по ссылке позволяет изменять значение переменной в теле метода.

Передача параметров по ссылке. Ключевое слово out

то компилятор сообщит нам об ошибке:

так как переменная b объявлена не не инициализирована. С ключевым словом out инициализацию переменной можно не проводить перед её передачей в метод и вот такой код не вызовет ошибки:

Передача параметров по ссылке. Ключевое слово in

Необязательные параметры в методах

До сих пор мы использовали в описании методов параметры, которые обязательно было передавать при вызове метода. Однако, C# позволяет также определять в методах необязательные параметры, которые по умолчанию имеют какое-то значение, например, объявим в нашем метода Addition необязательный параметр — значение на которое необходимо увеличить переменную:

В вызове метода мы можем не указывать параметр d и при его использовании в теле метода он будет равен 1:

А можем вызвать метод вот так:

Именованные параметры

По умолчанию в C# параметры в методы должны передаваться ровно в том порядке, в котором они стоят в описании метода. Однако, используя именованные параметры мы можем нарушить порядок по умолчанию, вызвав метод, например, вот так:

Итого

Источник

Есть ли у Java что-то вроде ключевых слов ref и out C#?

что-то вроде следующего:

7 ответов

нет, Java не имеет чего-то вроде C#’S ref и out ключевые слова для передачи по ссылке.

можно передавать только по значению в Java. Даже ссылки передаются по значению. См.Джон Скитпажа о передача параметров в Java для получения более подробной информации.

сделать что-то похожее на ref или out вы должны обернуть свои параметры внутри другого объекта, и передать ссылку на объект в качестве параметра.

но вы можете имитировать ссылка с фантиками.

и сделайте следующее:

и в основном любой другой тип, такой как:

Java передает параметры по значению и не имеет какого-либо механизма для разрешения pass-by-reference. Это означает, что всякий раз, когда параметр передается, его стоимостью копируется в стек обработки вызова.

на самом деле нет ни ref, ни из эквивалент ключевого слова в Java язык насколько я знаю. Однако я только что преобразовал C# код Java использует из параметр и посоветует, что я только что сделал. Вы должны обернуть любой объект в класс-оболочку и передать значения, завернутые в экземпляр объекта-оболочки следующим образом;

Простой Пример Использования Обертка

здесь Класса;

и вот тестовый код;

Пример Реального Мира

A C#.NET метод, использующий параметр

здесь есть C#.NET метод, который использует из ключевое слово;

Java эквивалент кода C#, который использует параметр out

и Java эквивалент этой метод с помощью класса следующее:

Класса

и класса используется в этом коде Java, как показано ниже;

Как и многие другие, мне нужно было преобразовать проект C# в Java. Я не нашел полного решения в интернете относительно из и ref модификаторы. Но я смог взять информацию, которую нашел, и расширить ее, чтобы создать свои собственные классы для выполнения требований. Я хотел провести различие между ref и из параметры для ясности кода. С нижеприведенными классами это возможно. Может ли эта информация сэкономить другим время и усилие.

пример включен в код ниже.

три решения не официально, упоминается:

java не имеет стандартного способа сделать это. Большинство свопов будет сделано в списке, который упакован в классе. но есть неофициальный способ сделать это:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *