Вы не одиноки, когда вас смущают и кодируют на c ++ и c #. Я могу понять, почему (не как критика, а как комментарий, потому что это мир, в котором я тоже живу) в c ++, когда вы используете & для аргумента для передачи ссылка, которую вы в основном говорите, это псевдоним, который я буду использовать внутри метода для аргумента, передаваемого методу. Все, что вы сделаете с этим аргументом , будет иметь такой же эффект, как если бы вы использовали саму переменную.
так что в коде вы можете сделать:
void Foo (MyClass & arg)
{
arg = новый MyClass (1);
}
int x = new MyClass(0);
Foo(x);
или
int x = new MyClass(0);
void Foo()
{
x = new MyClass(1);
}
в любом случае x теперь равно MyClass (1) (и у вас есть утечка, потому что нет способа добраться до оригинала, но это не моя точка зрения). Я думаю, от вас вопрос, который вы уже знали, но он все равно будет служить цели:)
Если вы передаете ссылку в стандарте, это означает, что ссылка передается по значению. Это больше не является псевдонимом всего, что вы делаете с объектом, на который ссылаетесь, будет влиять на объект, но если вы сделаете что-нибудь с переменной, ссылающейся на объект (например, назначив новый объект), то это повлияет только на копию ссылки. Давайте еще немного кода
с #
MyClass x = MyClass(0);
void Foo(MyClass arg) //reference being passed by val
{
arg = new MyClass(1);
}
Foo(x);
x по-прежнему равен MyClass (0)
MyClass x = MyClass(0);
void Foo(ref MyClass arg) //passing by ref
{
arg = new MyClass(1);
}
Foo(ref x);
x равно MyClass (1)
Таким образом, стандартная передача аргумента в C # отличается от передачи ссылки в C ++, но использование ключевого слова ref (что не приветствуется) дает вам почти такую же механику, как и в c ++
& в C ++ обычно поощряется из-за оптимизации / отсутствия копирования, поскольку, поскольку вы копируете только ссылку в C #, это не имеет значения, и ref следует использовать только тогда, когда вам действительно нужен псевдоним для переменной, передаваемой методу aka, когда вы потенциально необходимо назначить новый экземпляр объекта переменной, а не использовать / изменять состояние объекта