Eric Lippert가 자신의 답변에서 한 특정 요점에 대해 자세히 설명하고 다른 사람이 전혀 다루지 않은 특정 상황에 주목하고 싶습니다. 에릭은 말했다 :
[...] 할당은 거의 항상 레지스터에 할당 된 값 뒤에 남습니다.
과제는 항상 왼쪽 피연산자에 할당하려고 시도한 값을 남겨두고 싶습니다. "거의 항상"만이 아닙니다. 그러나이 문제를 문서에서 언급하지 않았기 때문에 모르겠습니다. 이론적으로 "뒤로"남겨두고 왼쪽 피연산자를 다시 평가하지 않는 매우 효과적인 구현 절차 일 수 있지만 효율적입니까?
이 스레드의 답변으로 지금까지 구성된 모든 예제에 대해 '효율적'입니다. 그러나 get 및 set 접근자를 사용하는 속성 및 인덱서의 경우 효율적입니까? 전혀. 이 코드를 고려하십시오.
class Test
{
public bool MyProperty { get { return true; } set { ; } }
}
여기에 개인 변수의 래퍼가 아닌 속성이 있습니다. 부름을받을 때마다, 그는 자신의 가치를 설정하려고 할 때마다 아무 것도하지 않을 것입니다. 그러므로이 재산이 평가 될 때마다 그는 진실 할 것이다. 어떻게되는지 보자 :
Test test = new Test();
if ((test.MyProperty = false) == true)
Console.WriteLine("Please print this text.");
else
Console.WriteLine("Unexpected!!");
그것이 무엇을 인쇄하는지 맞춰보세요? 인쇄합니다 Unexpected!!
. 결과적으로, set 접근자는 실제로 호출되지만 아무것도하지 않습니다. 그러나 그 후에 get 접근자는 전혀 호출되지 않습니다. 배정은 단순히 false
우리가 재산에 배정하려고 한 가치 를 남깁니다 . 그리고이 false
값은 if 문이 평가하는 것입니다.
이 문제를 연구 할 수 있는 실제 사례로 마무리 하겠습니다. List<string>
내 클래스가 개인 변수로 가지고 있는 컬렉션 ( ) 의 편리한 래퍼 인덱서를 만들었습니다 .
인덱서로 전송 된 매개 변수는 문자열이며 내 콜렉션의 값으로 처리되었습니다. get 접근자는 해당 값이 목록에 존재하는지 여부 만 true 또는 false를 반환합니다. 따라서 get 접근자는 List<T>.Contains
메소드 를 사용하는 또 다른 방법이었습니다 .
인덱서의 set 접근자가 문자열을 인수로 사용하여 호출되었고 오른쪽 피연산자가 bool 인 true
경우 해당 매개 변수를 목록에 추가합니다. 그러나 동일한 매개 변수가 접근 자에게 전송되고 오른쪽 피연산자가 bool 인 false
경우 대신 목록에서 요소를 삭제합니다. 따라서 세트 접근자는 List<T>.Add
및 의 편리한 대안으로 사용되었습니다 List<T>.Remove
.
게이트웨이로 구현 된 자체 로직으로 목록을 래핑하는 깔끔하고 컴팩트 한 "API"가 있다고 생각했습니다. 인덱서 만 사용하면 몇 번의 키 입력으로 많은 작업을 수행 할 수 있습니다. 예를 들어, 목록에 값을 추가하고 그 값이 있는지 어떻게 확인할 수 있습니까? 나는 이것이 유일한 코드 줄이라고 생각했다.
if (myObject["stringValue"] = true)
; // Set operation succeeded..!
그러나 이전 예제에서 알 수 있듯이 값이 실제로 목록에 있는지 확인 해야하는 get 접근자는 호출되지 않았습니다. true
값은 항상 뒤에 효과적으로 내 get 접근에서 구현 한 어떤 논리를 파괴 남아 있었다.