본문 바로가기
반응형

Effective C#21

[Effective C#] Item16 생성자 내에서는 절대로 가상함수를 호출하지 마라. 객체가 완전히 생성되기전에 가상함수를 호출하면 이상동작을 일으킨다. 어떤 타입이든 생성자가 수행을 완료하기 전에는객체가 와전히 생성되었다고 할 수 어ㅃㅅ으므로 생성자 내에서 가상함수를 호출하면 개발자의 예상과는 다르게 코드가 흘러갈 수 있다. class B { protected B() { VFunc(); } protected virtual void VFunc()//가상함수 { Console.WriteLine("VFunc in B"); } } class Derived : B { private readonly string msg = "Set by Initializer"; public Derived(string msg) { this.msg = msg; } protected override void VFunc(.. 2022. 8. 30.
[Effective C#] Item15 불필요한 객체를 만들지 마라 모든 참조 타입의 객체는 지역 변수라도 동적으로 메모리를 할당하는데 일허게 할당된 객체는 이 객체를 참조하는 상위 멤버가 삭제되면 가비지가 된다. 힙에서 새로운 객체를 생성하고 삭제하는 작업은 생각보다 많은 프로세서시간을 사용하기때문에 성능에 문제를 초래할 수 있다. 참조 타입의 지역변수를 멤버변수로 선언 자주 호출되는 이벤트 핸들러에 참조 타입의 객체를 지역변수로 선언하면 가비지 콜렉터가 많은 생성/ 제거를 반복하여 성능에 문제가 발생한다. public class FirstControl : Control { public FirstControl() {} protected override void OnPaint(PaintEventArgs e) { //나쁜 예, Point 이벤트가 발생할 때 마다 동일한 폰.. 2022. 7. 13.
[Effective c#] Item11 ~ Item13 .NET 리소스 관리에 대한 이해 힙에 관한 메모리 관리는 가비지 콜렉터가 완전히 책임 진다. 이외에 비관리 리소스는 개발자가 관리해야함 더보기 비관리 리소스 - finalizer와 IDisposable 인터페이스 라는 2개의 메커니즘을 제공 => finalizer는 객체를 가비지로 판단한 경우 이 객체를 다른 큐에 삽입하여 나중에 finalizer를 호출할 준비만 수행함 가비지콜렉터의 세대 개념 0세대 : 수집 절차 이후 생서된 객체들 1새대 : 두번이상 수집절차에서 살아남은객체들 수집 절차 ? 기본적으로 0세대 객체만 검사 1세대는 대력 10번에 한번 검사 2세대는 대력 100번에 한번 검사 비관리 리소스를해제하는 좋은 방법은 IDisposable을 사용하는 것이다. [Item12] 할당 구문보다 멤.. 2022. 7. 8.
[Effective C#] Item6 ~ Item 10 [Item6] nameof 연산자를 적극 확용하라. 항상 로컬이름을 문자열로 반환하는 역할을 한다. 심볼의 이름을 평가하며 타입, 변수, 인터페이스, 네임스페이스 에 대해 사용할 수 있다. 심볼의 이름을 바꾸거나 수정할 때도 손쉽게 반영 가능하다. 항상 로컬 이름을 문자열로 반환한다. Ex) 완전 정규화된 이름이 System.Int.MaxValue 이더라도 항상 로컬이름 MaxValue를 반환 [Item7] delegate를 이용하여 콜백을 표현하라. delegate를 이용하면 타입 안정적인 콜백을 정의할 수 있다. .Net Framework 라이브러리는 Predicate, Action, Func와 같은 형태로 자주 사용되는 delegate를 정의해두고 있다. 더보기 Predicate : 조건을 검사하여.. 2022. 7. 8.
반응형