Trusted answers to developer questions
Trusted Answers to Developer Questions

Related Tags

What is the ref keyword in C#?

Educative Answers Team

Grokking Modern System Design Interview for Engineers & Managers

Ace your System Design Interview and take your career to the next level. Learn to handle the design of applications like Netflix, Quora, Facebook, Uber, and many more in a 45-min interview. Learn the RESHADED framework for architecting web-scale applications by determining requirements, constraints, and assumptions before diving into a step-by-step design process.

The ref keyword allows us to pass variables and objects to a method by reference.

ref with variables

If a variable is normally passed to a method, its value will be copied into the function for further use. Therefore, altering the value in a method will not affect the value of the original variable.

However, if we pass the variable by reference using ref, then the ​original variable will be used in the method.

Note: To use a variable’s reference, ref must be written before the variable. Similarly, a reference parameter in a function must have ref written in its data type.

Here’s a simple example:

class Simple
{
static void Main()
{
int num = 10;
Simple s = new Simple();
s.MultiplyByTwo(num);
System.Console.WriteLine("num outside method: " + num);
}
public void MultiplyByTwo(int num)
{
num = num * 2;
System.Console.WriteLine("num inside method: " + num);
}
}

In the with_ref tab, the MultiplyByTwo method contains a reference to the num variable; hence, any modifications in the method will affect the actual variable.

ref with objects

Unlike variables, the fields/properties of an object are automatically passed by reference, which means that the ref keyword is not required to alter them.

In the code below, a Superhero class has been created.

The ChangeHero() method will modify a Superhero object’s properties without ref.

class Program
{
static void Main()
{
Superhero hero = new Superhero("Wolverine", "Claws");
System.Console.WriteLine(hero.Name + ", " + hero.Power);
ChangeHero(hero);
System.Console.WriteLine(hero.Name + ", " + hero.Power);
// The values of the properties have been changed
}
public static void ChangeHero(Superhero s){
s.Name = "Wonder Woman";
s.Power = "Super strength";
}
}
public class Superhero
{
public Superhero(string n, string p)
{
this.Name = n;
this.Power = p;
}
public string Name {get; set;}
public string Power {get; set;}
}

So … is there an instance where ref comes in handy with objects? The answer is yes!

The ref keyword allows us to change the object that a variable holds. Take a look:

class Program
{
static void Main()
{
Superhero hero = new Superhero("Wolverine", "Claws");
System.Console.WriteLine(hero.Name + ", " + hero.Power);
ChangeHero(ref hero);
System.Console.WriteLine(hero.Name + ", " + hero.Power);
// The values of the properties have been changed
}
public static void ChangeHero(ref Superhero s){
Superhero newS = new Superhero("Wonder Woman", "Super strength");
s = newS; // s now refers to a new object
}
}
public class Superhero
{
public Superhero(string n, string p)
{
this.Name = n;
this.Power = p;
}
public string Name {get; set;}
public string Power {get; set;}
}

After the ChangeHero() method call, the hero variable refers to a new object that was created within the method. The original object is still in the memory, but there is no way to access it.

1 of 4

ref is rarely used with objects since there is a possibility of causing memory leaks. Objects can become inaccessible and still occupy space in the memory.

RELATED TAGS

Copyright ©2022 Educative, Inc. All rights reserved

Grokking Modern System Design Interview for Engineers & Managers

Ace your System Design Interview and take your career to the next level. Learn to handle the design of applications like Netflix, Quora, Facebook, Uber, and many more in a 45-min interview. Learn the RESHADED framework for architecting web-scale applications by determining requirements, constraints, and assumptions before diving into a step-by-step design process.

Keep Exploring