나는 Jon Skeet 외의 답변에 동의한다. "ref this"확장 메서드를 사용하면 코드가 더 모호해질 수 있습니다. 그러나 .Net Framework에서 일부 네임 스페이스를 살펴보면 구조체에서 호출되는 메서드에서 해당 메서드를 변경하는 것이 일반적입니다.
예를 들어 System.Drawing 구조체 (Point, Rectangle 등)를 사용하십시오. 각 메소드에는 구조체 자체를 변경하는 메소드 (예 : 오프셋, 팽창 등)가 있습니다. 나는 이것이 좋은 생각이라는 것을 말하지 않고있다. 사실 개인적으로 Offset, Inflate 등이 구조체 자체를 돌연변이시키는 것을 매우 짜증나게한다. 나는 여러분 중 일부가 가변 구조체의 아이디어에 반대한다. 일반.
레퍼런스 유형의 메소드를 호출하면 레퍼런스가 변경되는 경우가 의심 스럽습니다 (String
클래스가 아닌 한, 인터뷰 수행을위한 참조를 전환하는 일부 컴파일러 마법이 있다고 생각할 수 있습니다). 따라서 참조를 변경하는 것이 메서드 호출의 완전히 비표준적인 부작용이 될 수 있으므로 "this ref"가 참조 형식과 함께 사용되는 것을 방지하는 것이 좋습니다.
구조체와 관련하여 "this ref"를 사용하면 코드 가독성이 Rectangle.Inflate 등보다 크게 감소하지 않으며 확장 기능을 사용하여 그러한 종류의 동작을 "시뮬레이트"하는 유일한 방법을 제공합니다.그냥 사이드 참고로
, 여기에 "이 심판"이 유용 할 수 있습니다, 여전히 읽을 이럴 하나의 예입니다
void SwapWith<T>(this ref T x, ref T y) {
T tmp = x; x = y; y = tmp;
}
확실한'ref'가 필요합니까? 나는 그것이 "this"에 의해 "자동 생성"될 것이라고 기대할 것이다 - 비표준 확장 메소드는 의미가 없다. –
그러나 내가 실수하지 않으면 그들은 참조가 아닙니다. – Hun1Ahpu
@MarcelJackwerth ref 매개 변수는 참조 유형 매개 변수와 다릅니다. ref 매개 변수는 호출자의 참조 (또는 포인터) 자체를 전달합니다. ref를 사용하면 다른 객체를 가리 키도록 참조를 업데이트 할 수 있습니다. 이를 사용하지 않으면 (참조 유형의 경우) 객체 자체는 업데이트 할 수 있지만 참조는 참조 할 수 없습니다. – xr280xr