Как стать автором
Поиск
Написать публикацию
Обновить

Комментарии 5

В первом случае с ReferenceEquals, может это из-за интерирования сделано?

var a = "abc";

var b = "abc";

Вот здесь для двух переменных может использоваться одна строка в памяти и referenceEquals будет давать true

Не. Там struct передается в object, то есть будет выполняться boxing. Нет смысла сравнивать ссылки объектов, если для одного объекта будет выделяться новое место в куче при каждом вызове этой функции. Результат всегда будет false.

В некоторых проектах (например DnSpy) некоторые структуры боксятся и кешируются в статичных полях, чтобы не выделять их в памяти по 100500 раз для использования в методах, принимающих object вместо struct. Также с учётом CommunityToolkit.HighPerformance.Box<T> где T: struct (использует тот же layout, что и обычный box. Черная unsafe магия с Unsafe.As<T, X>(ref T t)), можно object один раз выделить и переиспользовать для структуры.

А так этот шаблон с Equals(object) везде одинаковый и автоматически создаётся IDE без разбора struct или class. А дальше никто его не правит.

Технически, рантайм мог бы кэшировать боксинги сам, аля

object o1 = (object)1;
object o2 = (object)1;
ReferenceEqual(o1, o2) // true

но пока такой "оптимизации" нету (-:

Зарегистрируйтесь на Хабре, чтобы оставить комментарий