Обязательно ли ключевое слово ref для передачи по ссылке?

Хочу я изменить объект, передав его на вход внутрь метода, соответственно, писал
private void MyMethod(ref XElement nd);

Но тут в каком-то методе случайно забыл и написал без Ref, при этом объект внутри метода изменился как надо
private void MyMethod(XElement nd);

Для значимых типов ref что ли не обязателен? Объясните, пожалуйста, тонкости.
  • Вопрос задан
  • 301 просмотр
Решения вопроса 2
@cicatrix
было бы большой ошибкой думать
Без ключевого слова ref (out), параметр всегда передаётся по значению (by value).
В языке есть ссылочные типы и значимые типы (reference type и value types) - вот тут объясняется, в чём разница.

XElement - ссылочный тип. Вы передаёте адрес объекта (в памяти), иными словами - указатель на объект, иными словами - ссылку. Разумеется, при манипуляции с этой областью памяти, изменяется и сам объект.

Отвечая на ваш вопрос, вынесенный в заголовок: для ссылочных типов - нет, не обязательно, для значимых типов - обязательно.
Ответ написан
yarosroman
@yarosroman Куратор тега C#
C# the best
С ref можно сделать так

using System;

public class SomeObj
{
	public int Id { get; set; }
	public string Name { get; set; }
}

public class Program
{
    public static void Main(string[] args)
    {
		SomeObj someObj=new SomeObj() { Id=2, Name="SomeName2" };;
		if (CreateObj(ref someObj))
		{
			Console.Write("{0} {1}", someObj.Id, someObj.Name);
		}
    }
	
	public static bool CreateObj(ref SomeObj obj)
	{
		obj = new SomeObj() { Id=1, Name="SomeName" };
		return true;
	}	
}

В консоли будет 1 SomeName, а без ref будет другой результат, c ref значимые типы по ссылке передаются, а для ссылочных типов передается ссылка на ссылку ( ибо ссылка передается по значению), которую мы можем поменять, можем в методе создать новый объект и присвоить его аргументу, без ref мы присвоим ссылку копии которая лежит в стеке, при передаче аргумента. есть еще и ключевое слово out, от ref отличается тем, что переменная не обязательно должна быть инициализирована.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы