Что такое out в c

от admin

ref в сравнении с out в C#

Ключевые слова Ref и out в C# используются для передачи аргументов внутри метода или функции. Оба слова указывают на то, что аргумент/параметр передается по ссылке. По умолчанию параметры передаются в метод по значению. Используя эти ключевые слова ( ref и out ), мы можем передать параметр по ссылке.

Ключевое слово ref

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

Пример кода

Вывод

Ключевое слово out

Ключевое слово out передает аргументы по ссылке. Это очень похоже на ключевое слово ref .

Пример кода

Вывод

Ref в сравнении с Out

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

Инициализация параметра или аргумента перед передачей его в out не является обязательной.

Не требуется присваивать или инициализировать значение параметра (который передается по ref ) перед возвратом в вызывающий метод.

Вызываемый метод обязан присвоить или инициализировать значение параметра (который передается в out ) перед возвратом в вызывающий метод.

Передача значения параметра по Ref полезна, когда вызываемый метод также должен модифицировать передаваемый параметр.

Объявление параметра в методе out полезно, когда из функции или метода необходимо вернуть несколько значений.

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

Значение параметра должно быть инициализировано в вызывающем методе перед его использованием.

Когда мы используем REF , данные могут передаваться двунаправленно.

Когда мы используем OUT , данные передаются только однонаправленно (от вызываемого метода к вызывающему методу).

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

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

Ключевое слово Ref / Out и перегрузка методов

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

Пример кода

Вывод при компиляции кода:

Однако перегрузка методов возможна, когда один метод принимает аргумент ref или out , а другой принимает тот же аргумент без ref или out .

Пример кода

Резюме

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

Материал подготовлен в рамках специализации «C# Developer». Если вам интересно узнать подробнее о формате обучения и программе, познакомиться с преподавателем курса — приглашаем на день открытых дверей онлайн. Регистрация здесь.

Модификаторы параметров

Mетоды могут как принимать, так и не принимать параметров, а также возвращать или не возвращать значения вызывающей стороне. Хотя определение метода в C# выглядит довольно понятно, существует несколько ключевых слов, с помощью которых можно управлять способом передачи аргументов интересующему методу:

Модификаторы параметров

Модификатор параметра Описание
(отсутствует) Если параметр не сопровождается модификатором, предполагается, что он должен передаваться по значению, т.е. вызываемый метод должен получать копию исходных данных
out Выходные параметры должны присваиваться вызываемым методом (и, следовательно, передаваться по ссылке). Если параметрам out в вызываемом методе значения не присвоены, компилятор сообщит об ошибке
ref Это значение первоначально присваивается вызывающим кодом и при желании может повторно присваиваться в вызываемом методе (поскольку данные также передаются по ссылке). Если параметрам ref в вызываемом методе значения не присвоены, компилятор никакой ошибки генерировать не будет
params Этот модификатор позволяет передавать в виде одного логического параметра переменное количество аргументов. В каждом методе может присутствовать только один модификатор params и он должен обязательно указываться последним в списке параметров. В реальности необходимость в использовании модификатора params возникает не особо часто, однако он применяется во многих методах внутри библиотек базовых классов

Нередко требуется, чтобы метод оперировал теми аргументами, которые ему передаются. Характерным тому примером служит метод Swap(), осуществляющий перестановку значений своих аргументов. Но поскольку аргументы простых типов передаются по значению, то, используя выбираемый в C# по умолчанию механизм вызова по значению для передачи аргумента параметру, невозможно написать метод, меняющий местами значения двух его аргументов, например типа int. Это затруднение разрешает модификатор ref.

Как вам должно быть уже известно, значение возвращается из метода вызывающей части программы с помощью оператора return. Но метод может одновременно возвратить лишь одно значение. А что, если из метода требуется возвратить два или более фрагментов информации, например, целую и дробную части числового значения с плавающей точкой? Такой метод можно написать, используя модификатор out.

Давайте отдельно рассмотрим роль каждого из вышеуказанных ключевых слов.

Модификатор ref

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

Параметры, сопровождаемые таким модификатором, называются ссылочными и применяются, когда нужно позволить методу выполнять операции и обычно также изменять значения различных элементов данных, объявляемых в вызывающем коде (например, в процедуре сортировки или обмена). Обратите внимание на следующие отличия между ссылочными и выходными параметрами:

Выходные параметры

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

Ссылочные параметры

Эти параметры нужно обязательно инициализировать перед передачей методу. Причина в том, что они подразумевают передачу ссылки на уже существующую переменную. Если первоначальное значение ей не присвоено, это будет равнозначно выполнению операции над неинициализированной локальной переменной.

Давайте рассмотрим пример использования модификатора ref:

Модификатор ref

В отношении модификатора ref необходимо иметь в виду следующее. Аргументу, передаваемому по ссылке с помощью этого модификатора, должно быть присвоено значение до вызова метода. Дело в том, что в методе, получающем такой аргумент в качестве параметра, предполагается, что параметр ссылается на действительное значение. Следовательно, при использовании модификатора ref в методе нельзя задать первоначальное значение аргумента.

Модификатор out

Модификатор параметра out подобен модификатору ref, за одним исключением: он служит только для передачи значения за пределы метода. Поэтому переменной, используемой в качестве параметра out, не нужно (да и бесполезно) присваивать какое-то значение. Более того, в методе параметр out считается неинициализированным, т.е. предполагается, что у него отсутствует первоначальное значение. Это означает, что значение должно быть присвоено данному параметру в методе до его завершения. Следовательно, после вызова метода параметр out будет содержать некоторое значение.

Использование модификатора out

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

Модификатор params

В C# поддерживается использование массивов параметров за счет применения ключевого слова params. Ключевое слово params позволяет передавать методу переменное количество аргументов одного типа в виде единственного логического параметра. Аргументы, помеченные ключевым словом params, могут обрабатываться, если вызывающий код на их месте передает строго типизированный массив или разделенный запятыми список элементов.

Число элементов массива параметров будет равно числу аргументов, передаваемых методу. А для получения аргументов в программе организуется доступ к данному массиву:

Использование модификатора params

В тех случаях, когда у метода имеются обычные параметры, а также параметр переменной длины типа params, он должен быть указан последним в списке параметров данного метода. Но в любом случае параметр типа params должен быть единственным.

what is use of out parameter in c#

Can you please tell me what is the exact use of out parameter?

9 Answers 9

The best example of a good use of an out parameter are in the TryParse methods.

Using TryParse instead of ParseInt removes the need to handle exceptions and makes the code much more elegant.

The out parameter essentially allows for more than one return values from a method.

Kirtan's user avatar

The out method parameter keyword on a method parameter causes a method to refer to the same variable that was passed into the method. Any changes made to the parameter in the method will be reflected in that variable when control passes back to the calling method.

Declaring an out method is useful when you want a method to return multiple values. A method that uses an out parameter can still return a value. A method can have more than one out parameter.

To use an out parameter, the argument must explicitly be passed to the method as an out argument. The value of an out argument will not be passed to the out parameter.

A variable passed as an out argument need not be initialized. However, the out parameter must be assigned a value before the method returns.

An Example:

Читать:
Youwillbemined 2 что это

Kirtan's user avatar

Out parameters are output only parameters meaning they can only passback a value from a function.We create a «out» parameter by preceding the parameter data type with the out modifier. When ever a «out» parameter is passed only an unassigned reference is passed to the function.

Output of the above program would be 100 since the value of the «out» parameter is passed back to the calling part. Note

The modifier «out» should precede the parameter being passed even in the calling part. «out» parameters cannot be used within the function before assigning a value to it. A value should be assigned to the «out» parameter before the method returns.

Besides allowing you to have multiple return values, another use is to reduce overhead when copying a large value type to a method. When you pass something to a method, a copy of the value of that something is made. If it’s a reference type (string for example) then a copy of the reference (the value of a reference type) is made. However, when you copy a value type (a struct like int or double ) a copy of the entire thing is made (the value of a value type is the thing itself). Now, a reference is 4 bytes (on 32-bit applications) and an int is 4 bytes, so the copying is not a problem. However, it’s possible to have very large value types and while that’s not recommended, it might be needed sometimes. And when you have a value type of say, 64 bytes, the cost of copying it to methods is prohibitive (especially when you use such a large struct for performance reasons in the first place). When you use out , no copy of the object is made, you simply refer to the same thing.

A second use directly in line with this is that, because you don’t make a copy of the struct, but refer to the same thing in the method as you do outside of the method, any changes made to the object inside the method, are persisted outside the method. This is already the case in a reference type, but not in value types.

Now, you may have noticed that inside ValueTypeExampleOut I made a new instance of BigStruct . That is because, if you use out , you must assign the variable to something before you exit the method.

There is however, another keyword, ref which is identical except that you are not forced to assign it within the method. However, that also means you can’t pass in an unassigned variable, which would make that nice Try.. pattern not compile when used with ref .

That works because TrySomething is forced to assign something to a .

This won’t work because a is unassigned (just declared) and ref requires that you only use it with an assigned variable.

This works because a is assigned:

However, in both cases ( ref and out ) any changes made to a within the TrySomething method are persisted to a .

As I already said, changes made to a reference type are persisted outside the method in which you make them, because through the reference, you refer to the same thing.

However, this doesn’t do anything:

Here, you just set the copy of a reference to s to null, which only exists within the scope of the method. It has zero effect on whatever you passed into the method.

Что такое out в c

The out is a keyword in C# which is used for the passing the arguments to methods as a reference type. It is generally used when a method returns multiple values.

Important Points:

  • It is similar to ref keyword. But the main difference between ref and out keyword is that ref needs that the variable must be initialized before it passed to the method. But out parameter doesn’t require the variables to be initialized before it passed to the method. But before it returns a value to the calling method, the variable must be initialized in the called method.
  • It is also similar to the in keyword but the in keyword does not allow the method that called to change the argument value but ref allows.
  • For using out keyword as a parameter both the method definition and calling method must use the out keyword explicitly.
  • The out parameters are not allowed to use in asynchronous methods.
  • The out parameters are not allowed to use in iterator methods.
  • There can be more than one out parameter in a method.
  • At the time of method call, out parameter can be declared inline. But the inline out parameters can be accessed in the same block of code where it calls.
  • Method overloading can also be done using out parameters.
  • Properties cannot be passed as out parameters as these are not variables.
  • Up to C# 6.0, a user first declares the variable then it can only pass as an out argument. But from C# 7.0, excepting a separate variable declaration, the user can also declare the out variable in the argument list of the method call.

Declaration of out Parameter:

Here the value of variable_name must be initialized in the called method before it returns a value.

Example:

Multiple out Parameters: In C#, a user is allowed to pass multiple out parameters to the method and the method returns multiple values.

Example: In the below code, we declared two value variables without initializing i.e int i, j;. Now we pass these parameters to the Addition method using out keyword like Addition(out i, out j);. The value of these variables is assigned in the method in which they passed.

Enhancement of Out Parameter in C# 7.0 : In C# 7.0, there are some new features added to the out parameter and the features are:

  • In C# 7.0, the out parameter can pass without its declaration and initialization which is termed as the In-line declaration of Out parameter or Implicit Type Out Parameter. Its scope is limited to the method body i.e. local scope.
  • The out parameter is allowed to use var type in the method parameter list.
  • In out parameter, it is not compulsory that the name of the out parameter is same in both definition and call.
  • It can also be used in Try Pattern.

Example: Below programs demonstrate the inline declaration of Out parameter. Here the line of code i.e Area(out int length, out int width, out int Rarea); contains the inline declaration of Out parameter as these variables are directly declared inside the method calling. The value of the variables is initialized in the method in which they passed.

Note: You need to require C# 7.0 version to run this example.

Похожие статьи