DEV Community

Cover image for Ref vs Out C#: Which is the Better Choice when?
ByteHide
ByteHide

Posted on • Edited on • Originally published at bytehide.com

Ref vs Out C#: Which is the Better Choice when?

If you’ve ever written code in C#, chances are you have come across the ref and out keywords, but what exactly do they mean? Both of these keywords are used to pass data from one function or method to another.

While their purposes are similar, there are several key differences between the two that you should understand before deciding which one to use in your next project. Let’s take a closer look at the difference between ref and out in C# and see how each keyword might be used in your next project.

What is the difference between Ref and Out C#?

To start analyzing the differences between the two keywords, the ref keyword is used to pass a variable by reference. This means that the variable can be modified inside of the method.

The out keyword is also used to pass a variable by reference, but the variable does not have to be initialized before it is passed into the method. Additionally, the out keyword can only be used on variables that are declared inside of the method.

I felt it necessary to make this small nuance or spoiler before going into depth because I wanted to make clear the differences between the two in general terms. Let’s go straight to understanding each one separately.


What is Ref keyword in C#?

Ref is a keyword that indicates when a variable is an alias of another object or reference. These are the 5 scenarios (according to Microsoft) in which the keyword ref is used:

  • Declare a ref struct or maybe a readonly ref struct in a struct declaration.
  • To declare that a field is a reference in a ref struct declaration.
  • To give an argument to a method via reference in both a method signature and a method call.
  • To return a value to a caller via reference in a method signature.
  • To specify that a reference return value is kept locally as a reference that the caller wants to alter in a member body. Or even to specify that a local variable refers to another value.

If you are wondering how to use ref, we must use the keyword ref explicitly for the method and for its (the method’s) definition. Let’s see an example from Microsoft:

void Method(ref int refArgument)
{
    refArgument = refArgument + 44;
}

int number = 1;
Method(ref number);
Console.WriteLine(number);
// Output: 45
Enter fullscreen mode Exit fullscreen mode

Although it is true that the arguments of the out parameters do not have to be explicitly initialized before passing them, we must take into account that in the case of passing an argument to a ref parameter, this must be previously initialized.


What is Out keyword in C#?

Out is a keyword that passes arguments by reference. To understand, all actions performed on the parameter are always performed on the argument.

It is generally used in methods that must return several values, although this parameter does not pass the property.

To use this parameter we must explicitly use the keyword out when defining the method and also in the called method. Let’s look at the example:

int initializeInMethod;
OutArgExample(out initializeInMethod);
Console.WriteLine(initializeInMethod);     // value is now 44

void OutArgExample(out int number)
{
    number = 44;
}
Enter fullscreen mode Exit fullscreen mode

The main difference between the two keywords is that ref requires the variable to be initialized before it is passed into the method, while out does not. Additionally, out can only be used on variables declared inside the method.


Main out and ref differences in C#

Now that the function of each keyword is clear, let’s look at the differences between the two:

  • With ref the argument must be initialized before passing it to ref. With out it is not necessary to initialize it before.
  • With out it is necessary to assign a value to the parameter before returning it to the calling method. With ref this is not necessary.
  • With ref the data can be passed in a bi-directional way. With out this is not possible, it can only be done from the called method to the calling method.
  • ref is useful when the called method needs to modify the pass parameter as well.
  • out is useful when you need to return several values from a method.

Why is one better than the other?

There is no clear advantage of using ref over out, or vice versa. It really depends on the situation and what you are trying to achieve with your code. In general:

  • ref is a good choice when you need to pass a variable into a method and you want to be able to modify the variable inside of the method.
  • Out is a good choice when you need to pass a variable into a method and you want to initialize the variable inside of the method.

Another thing to consider is that ref parameters must be initialized before they are passed into a method, while out parameters do not have to be initialized. This means that out parameters can be used when the exact value of the parameter is not known before the method is called.


What are the benefits of using Ref?

Although some benefit we have seen a moment ago, let’s do a recap here of the ref keyword:

  • Allows you to pass a variable by reference, which means that the variable can be modified inside of the method.
  • Is a good choice when you need to pass a variable into a method and you want to be able to modify the variable inside of the method.

Another benefit of using ref is that it can improve the performance of your code. When you pass a variable by reference, the method can access the variable directly, instead of having to make a copy of the variable. This can save time and memory, especially if the variable is large.


What are the benefits of using Out?

There are also several benefits of using the out keyword:

  • Allows you to pass a variable by reference, but the variable does not have to be initialized before it is passed into the method.
  • Can only be used on variables that are declared inside of the method.
  • Is a good choice when you need to pass a variable into a method and you want to initialize the variable inside of the method.

Another benefit of using out is that it can help reduce the amount of code you need to write. For example, if you have a method that needs to return two values, you can use out to return both values without having to create a separate method for each value.

Top comments (4)

Collapse
 
raibtoffoletto profile image
Raí B. Toffoletto

Would it be better to return a tuple instead of using the out parameter if you need to return more than one value!?

Collapse
 
michelsylvestre profile image
Michel Sylvestre

I think it wasn't well worded. A good example of what he's talking about is a TryParse method which returns true or false if the parsing worked and the converted value in an out parameter.


string s = "1";
bool itWorked = int.TryParse(s, out int i);
if (itWorked) Console.WriteLine(i);

Oh and while the documentation presented here from Microsoft declare the variable before using it as a parameter, it is no longer needed!

Collapse
 
raibtoffoletto profile image
Raí B. Toffoletto

I see. I don't write c# often and I always found weird those parsing methods using out. Specially declaring the variable before... now if it supports no previous declaration it makes more sense! Thanks for the explanation 🙌

Thread Thread
 
michelsylvestre profile image
Michel Sylvestre • Edited

I understand the confusion. Previously you had to declare it beforehand but it changed in C# 7 (2017).

Obviously it shouldn't be something you use all the time because like you said, a tuple or an object would be better suited for a complex return value.

I see it as a shortcut for needless and ugly logic. Without it, my previous example would look ugly like


int i = default;
if (int.CanParse("1")) // doesn't exist but would need to acheive the same result
i = int.Parse("1");

or even worse


int i = default;
try
{
int.Parse("1");
}
catch {}