2012-01-31 3 views
-2

создать 2 переменные с именами и б я инициализировать переменную со значением «старт», а затем я задаю переменную a до переменной b и, наконец, меняю значение переменной к конца но переменная б не изменяются, в то время как и б ссылочные типы!строка не изменяется по ссылке

string a = "start"; // Declare and initialize a variable 
string b = a; // Copy the variable's value to a new variable 
a = "end"; // Modify the value of the original variable 
//variable b don't change!! 

Почему это не работает должным образом?

ответ

6

Это не то, как строки работают на C#, они не указатели. Более того, строки неизменяемы, поэтому вы не можете изменить их значение в любом случае, просто назначьте новый. Поэтому, что бы вы ни пытались сделать, вам нужно учитывать это.

Тот факт, что оператор сравнения преуспевает, заключается в том, что вы выполняете буквальное сравнение между символами, содержащимися в каждой строке, а не потому, что они «равны» в памяти.

+2

Сравнение работает, потому что C# переопределяет этот оператор http://msdn.microsoft.com/en-us/library/aa664728(v=vs.71).aspx, но вы действительно говорили об этом. – Joe

+2

Здесь нет никакого сравнения. –

+0

@Ron Warholic Спасибо, что отказались от ответа. Возможно, вы захотите проверить первоначальный вариант вопроса, чтобы понять, почему было упомянуто сравнение. Возможно, вы захотите сделать это часто, когда увидите комментарии, которые не всегда соответствуют тому, что вы видите в вопросе. – kprobst

1

Если вам нужно изменить строки по ссылке (с помощью функции), вы можете поместить ref слева от типа аргумента. В противном случае вы можете сделать класс MutableString, но у меня лично не было необходимости в изменяемой строке.

Вы также можете попробовать StringBuilder, но это не настоящая строка.

18

Вы не понимаете, что означает «ссылочный тип».

Подумайте об этом таким образом. Представьте себе два дома, один по улице Улицы Сезам Улицы 123, и один на проспекте Пеннильвания на 1600 год. Это объектов справочного типа.

Теперь представьте, что у вас есть два листа бумаги. Один говорит «Улица Улицы 123». Один говорит: «Пенсильванская проспект 1600». Это не дома; вы не можете переместиться на эти листы бумаги. Это ссылки к домам.

Теперь представьте, что у вас есть два ящика с надписью «a» и «b». Это переменные ссылочного типа.

Вы помещаете бумагу «123 Улица Сезам» в ящик «a». Вы не ставите дом в ящик. Вы положили ссылку на дом в ящик. Переменная ссылочного типа хранит ссылку на объект.Вот почему он называется переменной эталонного типа.

Затем вы делаете фотокопию бумаги в ящике «a» и помещаете ее в ящик «b». «b» теперь содержит копию справки. Ящики "a" и "b" сейчас ссылаются на этот же дом. Если вы нарисуете этот дом красным, дом, на который ссылаются бумаги в обоих ящиках, красный, потому что есть только один дом, на который ссылаются обе бумаги. В одном доме есть две ссылки и две переменные, каждая из которых содержит по одной ссылке.

Затем вы берете бумагу из ящика «a» и уничтожаете ее. Вы заменяете его бумагой, в которой говорится «1600 Пенсильванская авеню».

Выполнение этого ничего не изменило в отношении ящика «b»! Когда вы сказали «b = a», это означает «сделать фотокопию ссылки, которая находится в ящике a, и поместить ее в ящик b». Это не Средние «ящики a и b теперь представляют собой два разных имени для одного и того же ящика».

Это имеет смысл?

+0

Разумеется, сложная часть заключается в различии между «System.String» и другими ссылочными типами IMHO: ссылочные типы обычно сравниваются * бумагой в ящике *, но строки ведут себя как типы значений в этом отношении и действительно проверьте, окрашены ли оба дома красным. –

+5

@gdoron: С чем связана неизменность? Предположим, что мы заменили вопрос пользователя «var a = new [] {1, 2, 3}; var b = a; a = new [] {4, 5, 6};" и hey, b не изменились, хотя a и b являются ссылочным типом. В этом отношении, что по сравнению с чем-то связано? Речь идет о характере копирования по ссылке, а не о неизменности или сопоставлениях. –

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