2016-11-19 8 views
0

Я могу попросить здесь невозможное, но мне интересно, могу ли я каким-либо образом обновить переменную по ссылке.Как обновить переменную за ссылкой?

пример кода (C#) говорит больше, чем странное объяснение:

var actual = "world"; 
var reference = actual; 

reference = "you"; 

Console.WriteLine("Hello {0}", actual); 

Выходы "Hello world" и не "Hello you".

https://dotnetfiddle.net/3yERkY

+0

Строки ведут себя как тип значения в C#. Хотя C# 7, улучшенная поддержка ссылок, я не думаю, что можно иметь ссылку на локальную переменную. – Phil1970

+0

@ Phil1970 Нет, они не струны действуют как рефренсы. Если вы делаете 'var actual = new Foo (1);', 'var reference = actual;', 'reference = new Foo (2);' вы не ожидаете, что 'actual' будет обновлен до' Foo (2) ' или. Вам просто нужно помнить, что выполнение «вы» за кулисами такое же, как «новая строка» («вызов». –

+0

@ScottChamberlain. Поведение некоторых операций - это тип значения (например, оператор ==). См. Также [В C#, почему String является ссылочным типом, который ведет себя как тип значения?] (Http://stackoverflow.com/questions/636932/in-c-why-is-string-a-reference-type-that -behaves-like-a-value-type), поэтому они имеют значение semantic. Если вы сравниваете язык с C++, поведение будет более похоже на 'std :: string', чем на' std :: string & '. .. – Phil1970

ответ

1

Вы можете, если вы используете ссылочный тип, но не с string
string является ссылочный тип, но исключительно она неизменна -> каждый раз, когда вы «обновление» его, будет создан новый экземпляр string.

var actual = "world"; 
    var reference = actual; 

    var isSame = ReferenceEquals(actual, reference); 
    Console.WriteLine(isSame); // True 

    reference = "you"; 
    Console.WriteLine("updated..."); 

    isSame = ReferenceEquals(actual, reference); 
    Console.WriteLine(isSame); // False 

Вы можете создать и использовать собственный тип

public class MyValue 
{ 
    public string Value { get; set; } 
} 

var actual = new MyValue { Value = "world" }; 
var reference = actual; 

reference.Value = "you"; 

Console.WriteLine($"Hello {actual.Value}"); // Hello you 
+0

Полностью ответил на мой вопрос. Спасибо, @Fabio! – Tom

Смежные вопросы