문제

이것은 멍청한 실수입니다.

List<Foo> fooList = new List<Foo>();
Foo f = new Foo();
while (something.Read()) {
    f.Fill(something.GetRecord());
    fooList.Add(f);
}

물론, 나는 루프 내부에 새로운 foo를 인스턴스화해야합니다.

컴파일링 시간에 컴파일러가 이러한 종류의 실수를 감지 할 수 있습니까?

시선을 순진하려면이 동작을 감지 할 수 있어야합니다 (루프에서 동일한 객체의 인스턴스로 목록을 작성). 그런 다음 "동일한 인스턴스를 두 번 이상으로 채우고 있습니다."와 같은 경고를 발행해야합니다.

그래서, 내가 얼마나 순진한가? 이런 것이 존재하는 언어를 알고 있습니까?

도움이 되었습니까?

해결책

예, 가능합니다.

그러나 도구 나 컴파일러가 이것에 대해 경고 할 것이라고 생각하지 않으므로 자신의 분석으로 확장 할 수있는 도구를 사용해야합니다. Java, FindBugs 그런 도구입니다. C, C ++ 등의 경우 GCC 4.5는 플러그인을 허용합니다 사람들이 자신의 확장을 작성하고 그 소리 LLVM에서도이를 위해 설계되었습니다. 도 있습니다 데 하이드라 Mozilla에서 다시 C ++를 위해. MS 언어에는 다음이 있습니다 피닉스 프레임 워크.

문제는이 분석을 어떻게 작성합니까? 조금 더 까다 롭고 도구에 따라 다릅니다. 그러나 기본적으로 :

  • 루프를 상당히 쉽게 감지 할 수 있습니다 ( "강하게 연결된 구성 요소"),
  • 별명 분석은 특정 변수 또는 매개 변수가 하나의 객체 또는 많은 객체 만 지칭하는지 여부를 알 수 있습니다 (아마도 "추상 개체"를 찾으십시오)
  • 정적 유형의 객체 또는 변수를 사용하여 올바른 컨테이너를 찾을 수 있습니다.

따라서 전화를 쉽게 감지 할 수 있습니다 List<>.append(x) 루프에서 x는 하나의 객체 만 참조 할 수 있습니다.

다른 팁

객체의 여러 인스턴스로 목록 <>을 채우려면 어떻게해야합니까? 코드를 장식해야합니까? #pragma 그래서 컴파일러가 당신을 홀로 남겨 두나요?

이런 종류의 제한 사항을 가지고 있다고 클래스를 어떻게 선언 하시겠습니까? List <>은 C# 클래스에 지나지 않습니다. mscorlib.dll을 디 컴파일하고 전체 구현을 볼 수 있습니다. 따라서 이런 종류의 지식을 갖기 위해서는 어딘가에 하드 코딩되어야합니다. 속성? 그것은 엄청나게 제한 될 것입니다. 코드를 검증하는 특별한 방법? 객체에 오버 헤드를 추가합니다.

이런 종류의 물건은 결코 이유 때문에 결코 사용되지 않습니다 (결코 의미하지 않습니다). 방해보다 도움이되는 매우 적은 수의 사례는 두 구현 난이도에서 필요한 실제 비용을 능가하는 데 가까워지지 않습니다. 프레임 워크 자체와 코드) 및 성능은 (GC가 수행 할 때 메모리 주위를 이동 해야하는 과도한 객체에서) 히트합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top