Я согласен с ответами Джона Скита и соавт. о том, как использование методов расширения «ref this» может сделать код более неясным. Но если вы посмотрите на некоторые пространства имен в .Net Framework, то метод, вызываемый в структуре, обычно изменяет ее.
Возьмем, например, структуры System.Drawing (точка, прямоугольник и т. Д.). У каждого из них есть методы (например, Offset, Inflate и т. Д.), Которые изменяют саму структуру. Я не говорю, что это хорошая идея, на самом деле меня лично очень раздражает, что Offset, Inflate и т. Д. Изменяют сами структуры вместо того, чтобы возвращать новые, и я знаю, что некоторые из вас выступают против идеи изменяемых структур в общий.
Я сомневаюсь, что есть случаи, когда вызов метода ссылочного типа изменит ссылку (если только это не класс String
, где я могу представить, что может быть какая-то магия компилятора для переключения ссылок для выполнения интернирования и т. Д.) , Поэтому имеет смысл не использовать «этот ref» с ссылочными типами, потому что изменение ссылки было бы совершенно нестандартным побочным эффектом вызова метода.
Но что касается структур, то использование «этого ref» не будет значительно снижать читаемость кода больше, чем Rectangle.Inflate и т. Д., И это обеспечит единственное средство для «моделирования» такого рода поведения с помощью функции расширения.
Так же, как примечание, вот один пример, где «этот ref» может быть полезным, и ИМХО по-прежнему читаемым:
void SwapWith<T>(this ref T x, ref T y) {
T tmp = x; x = y; y = tmp;
}