Задать вопрос

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

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

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

Для значимых типов ref что ли не обязателен? Объясните, пожалуйста, тонкости.
  • Вопрос задан
  • 313 просмотров
Подписаться 3 Простой 1 комментарий
Решения вопроса 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 отличается тем, что переменная не обязательно должна быть инициализирована.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы