Комментарии 25
На первый вопрос в голову приходит такой ответ:
object x = new string(new char[0]);
object y = new string(new char[0]);
Console.WriteLine(x == y);
На второй — явно связано с опциональными параметрами и констрейнтами, но у меня не получилось заставить код компилироваться :-(
Неа. Строки запаковываются в объекты и будут разными объектами. А вот new bool?() подходит.
На мсдн написано что оператор == для реф тайпов сравнивает ссылки кроме string. Все верно, как и гдето было написано что стринг это реф тип ведущий себя как валю.
object x = new string("Hello");
object y = new string("Hello");
Console.WriteLine(x == y);
Тоже должно true вывести.
Нет, был неправ.
Во-первых, мой вариант не компилируется.
Во-вторых, даже следующий вариант вернёт false:
А вот следующий код вернёт true.
Во-первых, мой вариант не компилируется.
Во-вторых, даже следующий вариант вернёт false:
object x = new string(new[] {'H', 'e', 'l', 'l', 'o'});
object y = new string(new[] {'H', 'e', 'l', 'l', 'o'});
bool res = x == y;
А вот следующий код вернёт true.
string a = "Hello";
string b = "Hello";
bool res1 = a == b;
Так смысл вопроса был именно в создании новых объектов с помощью new
Не понимаю почему Ваш первый вариант не возвращает true (интернирование не работает?).
object x = new string(new[] {'H', 'e', 'l', 'l', 'o'});
object y = new string(new[] {'H', 'e', 'l', 'l', 'o'});
bool res = x == y;
Интернирование работает только для строковых литералов. В данном же случае будут созданы два разных объекта, а поскольку тип времени компиляции — object, то сравниваться будут ссылки, которые не равны. Именно поэтому результат false.
object y = new string(new[] {'H', 'e', 'l', 'l', 'o'});
bool res = x == y;
Интернирование работает только для строковых литералов. В данном же случае будут созданы два разных объекта, а поскольку тип времени компиляции — object, то сравниваться будут ссылки, которые не равны. Именно поэтому результат false.
А для особо интересующихся можно попробовать понять почему код выше выводит True, а
уже False
… ох давно я комментарии не обновлял…
object x = new String(new char[1]{'A'});
object y = new String(new char[1]{'A'});
Console.WriteLine(x == y);
уже False
… ох давно я комментарии не обновлял…
А в третьем вариенте возможно использование локальной переменной своего типа и дополнительных методов расширения из Linq.
Я видел человека с рейтингом 622к на Stackowerflow. Я растоптан
Если вдруг кому-то лень искать: John Skeet.
Отличный парень. Очень приятный в общении. На SO часто отвечает на интересные вопросы. И всегда добр и дружелюбен.
Мой секрет заключается в том, что я действительно не знаю другие языки программирования. Я достаточно знаю VB, чтобы отвечать на некоторые вопросы на StackOverflow, и я могу читать некоторые вопросы по F#, но я очень не многоязычен в этом смысле.
Отсутствие скромности — не про него. Стоит взглянуть на его теги, чтоб понять, что кругозор огромен. В частности его ответы по scala. В свое время был очень удивлен, обнаружив чей ответ по скале только что прочитал.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Интервью с Джоном Скитом