Единственный раз, когда копируется ссылочный тип, это когда вы вызываете метод или свойство, которое активно делает копию. Clone () является очевидным примером (за некоторыми исключениями, с неизменяемым типом, таким как string, для Clone () безопасно просто возвращать тот же объект и делать вид, что он новый, так как ничего не может измениться).
as
- это всегда личность. x = obj as T
эквивалентно:
if(obj is T)
x = (T)(object)obj;
else
x = null;
Причина, по которой у меня есть (T)(object)
вместо просто (T)
, заключается в том, что иногда существует неявный оператор приведения для приведения между двумя типами, и что может создать новый объект. Приведение к и из object
не будет (если кто-то не был глуп с операторами приведения - я уверен, что компилятор остановит их, если они настолько глупы, но это настолько глупый случай, что я не могу потрудиться тестировать, не пишите приведения к объекту и обратно).
Если вы хотите проверить, совпадает ли объект с другим объектом, используйте ReferenceEquals
, это сравнивается исключительно для идентичности, даже если Equals переопределено или аргументы являются типами значений в штучной упаковке.