Вопрос о ссылочных типах - PullRequest
2 голосов
/ 28 февраля 2009

Это взято с превосходного личного сайта Джона Скита на C # (http://www.yoda.arachsys.com/csharp/):

StringBuilder first = new StringBuilder();
StringBuilder second = first;
first.Append ("hello");
first = null;
Console.WriteLine (second);

1) Изменение значения первого не изменит значения второго -

2) хотя их значения все еще являются ссылками на тот же объект, любые изменения, внесенные в объект через первую переменную, будут видны через вторую переменную.

Это взято из того же предложения. Что подразумевается под изменением значения? Я предполагаю значение переменной (например, int x = 4, или 5, или 45, и т. Д.).

Означает ли это, что если сначала указать на другой совместимый объект, это не повлияет на два?

Все на этой странице имеет смысл, я думаю, что это просто проблема с моим переводом на английский.

Спасибо

Ответы [ 2 ]

4 голосов
/ 28 февраля 2009

first является ссылкой на объект типа StringBuilder. То есть first хранит значение, которое можно использовать для ссылки на объект в куче, тип Stringuilder. second - это еще одна ссылка на объект типа StringBuilder, и его значение изначально установлено как ссылка на тот же объект, на который ссылается first.

Если вы измените значение first, то, что вы делаете, это изменит референт. То есть вы используете first для ссылки на другой объект. Это не влияет на second; на его значение не влияют изменения значения first. (Помните: значения first и second являются ссылками, которые изначально имеют один и тот же референт. Но так же, как с

int x = 1;
int y = x;
x = 2;

не меняет значение y, изменение значения first не меняет значение second.

С другой стороны, когда first и second относятся к одному и тому же объекту, любые изменения этого объекта будут видны как через first, так и second.

Думайте об этом так. Допустим, я создаю текстовый файл first.html, содержимое которого

<a href="http://stackoverflow.com">Stack Overflow</a>

и я выдаю команду copy first.html second.html. Тогда обе страницы могут быть использованы для ссылки на одну и ту же веб-страницу; перейдя по ссылке, мы приходим к тому же референту. Если в домашнюю страницу Stack Overflow внесены изменения, то доступ к домашней странице через first.html или second.html позволит мне увидеть эти изменения. Но если я тогда изменю содержимое first.html на

<a href="http://www.thedailywtf.com>The Daily WTF</a>

, тогда я больше не могу использовать first.html для ссылки на домашнюю страницу переполнения стека. Более того, это изменение не влияет на значение second.html. Это все еще

<a href="http://stackoverflow.com>Stack Overflow</a>

Думайте о содержимом этих файлов как о значениях ссылочного типа, а конечное назначение - как о ссылочном объекте.

0 голосов
/ 28 февраля 2009

Разница между стоимостью самого объекта и содержанием объекта неясна.

Например, можно изменить содержимое second, вызвав методы first, как при вызове Append в примере. Однако установка для first значения null не устанавливает для секунды значение null.

Это легко увидеть, написав этот код и пройдя по нему в отладчике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...