2017-12-01 20 views
0

언제 다른쪽으로 갈 지에 대한 경험적 규칙이 있습니까?로컬 변수 대 사유 필드 효과

나는 여기서 딜레마를 겪고 있기 때문에 호기심이 많습니다. 여기서는 매우 자주 사용되는 메서드가 있는데, 커스텀 클래스 타입을 반환합니다. 만약 그것이 새로운 클래스를 가지고 있다면 필자는 완전히 새로운 객체를 만드는 것보다는 매번 필드에서이 커스텀 클래스의 인스턴스를 유지하는 것이 더 낫지 않겠는가 궁금 하여요. 메소드에서 매번 생성되는 인스턴스.

+6

예, 규칙이 있으며 매우 간단합니다. 로컬 변수가 필요한 경우 로컬 변수를 사용하십시오. 필드가 필요하면 필드를 사용하십시오. – dasblinkenlight

+0

두 사람이 기능적으로 다른 일을 할 것이므로 먼저 행동의 변화가 괜찮은지 확인해야합니다. –

+2

클래스의 * 인스턴스 *를 반환하면 (클래스를 반환 할 수 없음) 참조를 반환합니다. 개체는 로컬 변수 또는 필드에 관계없이 힙에 남아 있습니다. 그리고 현장 변수와 지역 변수 간의 선택은 효율성의 문제가 아니라 기능성의 문제입니다. – Sefe

답변

0

당신이 요구하는 것, 이른바 게으른 필드입니다. 당신은 너무

private System.Lazy<YourClass> mYourClassInstance; 

... 

mYourClassInstance = new System.Lazy<YourClass>(() => new YourClass()); 

처럼 System.Lazy<>로 선언 한 다음이

mYourClassInstance.Value 

어디서든 당신이 원하는하지만 값 (인스턴스) 한 번만 작성을 통해 인스턴스를 얻을 수 있습니다.

1

새로 생성 된 클래스 인스턴스를 반환하고 필드를 반환하는 것의 주된 차이점은 엄청납니다. 후자의 경우 모든 클라이언트가 동일한 인스턴스에 대한 포인터를 받기 때문에 인스턴스가 공유됩니다. 즉, 클라이언트 (또는 인스턴스의 원래 작성자)가 인스턴스에서 변경 될 때마다 모든 클라이언트가 모든 변경 사항을 볼 수 있습니다. 전자의 경우 모든 인스턴스가 다르고 변경 사항은 현재 클라이언트에만 영향을 미칩니다.

요구 사항을 자세히 살펴보고 어떤 동작이 필요한지 알아보십시오. 그 (것)들을 잘못하면 치명적인 결과를 초래할 수 있습니다.

+0

이 중요한 문제를 해결하기위한 첫 번째 대답으로 upvote ! –