With...End With 연산자는 단일 객체의 속성과 메소드에 대한 접근을 단순화하여 각 표현식에서 객체 이름을 반복하지 않도록 합니다. 블록 내부의 모든 참조는 지정된 객체를 참조합니다.
사용 예:
With myCustomer .Name = "Иванов" .Balance += 1000 .LastPurchase = Now End With
장점:
질문: 하나의 With 블록을 다른 블록 안에 넣을 수 있습니까? 내부 블록에서 속성과 메소드에 대한 호출은 어떻게 처리됩니까?
답변: 네, 중첩이 가능하다. 그러나 내부 블록에서는 점(.)으로 접근하는 것이 내부 객체에 대해 해석됩니다. 동일한 속성 이름을 사용할 경우 애매함이 발생할 수 있습니다.
With obj1 .Value = 10 With obj2 .Value = 20 ' 이것은 obj2.Value이고 obj1.Value가 아닙니다. End With End With
이야기
중첩된 With 블록에서 다양한 객체의 동일한 이름의 속성이 사용되었고, 개발자는 할당이 외부 객체에 영향을 미칠 것이라고 예상했습니다. 결과적으로 데이터가 잘못 기록되었고, 이 문제는 복잡한 보고서를 생성할 때 나타나면서 값이 뒤섞이게 되었습니다.
이야기
코드 리팩토링 중에 End With 블록의 종료 시점을 잘못 섞었습니다. 큰 코드 조각에서 표현식이 예상한 객체가 아닌 이미 닫힌 객체의 다른 인스턴스를 참조하기 시작하여 실행 오류와 잡기 어려운 버그를 초래했습니다.
이야기
비즈니스 논리에서 중첩된 컬렉션에 With가 사용되었습니다. 클래스 구조가 업데이트 된 후 내부 객체의 속성과 일치하는 이름의 새 속성이 추가되어 충돌과 컴파일 오류가 발생했고, 단위 테스트가 없어 이를 간과했습니다.