C#/이펙티브 C# 13

아이템16.생성자 내에서는 절대로 가상함수를 호출하지 마라.

-객체를 완전히 생성하기전에 가상함수(virtual)를 호출하면 이상동작을 일으킨다. -어떤 타입이든 생성자가 작업을 완료할떄까지 객체가 완전히 생성되었다고 볼 수 없다. -class B는 생성자를 호출 할때 가상함수 VFunc를 호출한다. -class B를 상속 받는 Derived 클래스는 생성자가 호출될 때 msg를 쓰는 메서드를 호출한다. -Vfunc는 오버라이드 되어 런타임에 재정의한 함수가 발동한다. -msg 변수는 'Set by intializer'를 기본이고 main 객체가 만들어질 때는 'Constructed in main'를 쓰도록 작성되있다. -그렇지만 쓰여지는 것은 'Set by intializer'이다. -C#에서 생성자의 본문으로 진입하는 순간 해당 객체는 이미 초기화가 완료되었다..

C#/이펙티브 C# 2023.07.20

아이템15.불필요한 객체를 만들지 마라

1.가비지 컬렉터 -가비지 컬렉터는 사용자를 대신하여 메모리를 관리하여 사용하지 않는 객체를 제거한다. -가비지 컬렉터 효율적이라도 힙에 새로운 객체를 생성*삭제는 과정은 꽤 적지않는 비용을 소비한다. -기술적으로 몇가지만 고려하면 가비지 컬렉터의 작업을 현저히 줄일 수 있다. 2.지역변수 내의 객체 생성 자제하고 지역변수는 멤버로 선언하자. -위의 메서드가 호출 될 때마다 Font 의 객체를 만든다. -위의 메서드는 Font를 멤버변수로 만들어 재사용하도록 개선했다. -메서드 내의 객체를 생성한다면 멤버변수로 만들어 가비지를 줄일 수 있다. 3.자주 사용되는 참조타입을 정적변수로 만들자. -위 코드는 Brush.Black은 정적 속성으로 만들고 Brush.Black를 호출 할떄 객체가 생성함으로써 가비..

C#/이펙티브 C# 2023.07.19

아이템 13. 정적 클래스 멤버를 올바르게 초기화하라.

1.정적(static) 클래스 -한정자를 사용하여 특정 개체가 아니라 형식 자체에 속하는 정적 멤버를 선언할 수 있다. -정적 멤버변수를 포함하는 타입이 있으면 인스턴스를 생성하기 전에 정적 멤버 변수를 초기화 해야한다. -C# 에서는 정적 멤버 초기화구문과 정적 생성자 두 가지 기능을 제공. 2.정적멤버 초기화 -정적 멤버 선언 시 초기화를 하는 것. 일반 멤버처럼 초기화. -정적 생성자보다 이전에 실행되며 베이스 클래스의 정적생성자가 있다 해도 보다 먼저 실행된다. 3.정적 생성자 -타입내에 정의된 모든 메서드,변수,속성에 최초로 접근하기 전에 자동으로 호출 되는 메서드. -정적변수 초기화, 싱글턴 패턴을 작성할 수 있다. -정적멤버 초기화에서 예외가 발생되면 TypelnitializationExce..

C#/이펙티브 C# 2023.07.05

아이템12. 할당 구문보다 멤버 초기화 구문이 좋다.

1.할당 구문 -선언하고 본문에 초기화 하는것. 2.멤버 초기화 구문 -선언과 동시에 초기화 하는것. 3.초기화 구문의 장점 -가독성이 좋다. -변수 초기화 누락을 방지한다. 4.멤버 초기화를 하지 말아야 하는 경우 1)0이나 null 값으로 초기화 할 때 -두 개의 변수 모두 0으로 초기화 한다. -myval1은 변수 모두에 대해서 0으로 설정한다. -myval2은 initobj라는 IL명령을 수행하는데 추가시간이 소요된다. -0으로 초기화를 할 경우 첫번째 구문이 낫다. *initobj:지정된 주소에서 값 형식의 각 필드를 null 참조 또는 적절한 기본 형식의 0으로 초기화합니다. 2)객체를 반복해서 초기화하는 경우 -labels은 본문의 객체만 남고 먼저 선언되었던 초기확 구문은 가비지가 된다. ..

C#/이펙티브 C# 2023.07.03

아이템11. NET 리소스 관리에 대한 이해

1.가비지 컬렉터 -C#에서 제공하는 메모리 관리 시스템 -더 이상 사용하지 않는 객체(접근 불가능한)를 메모리에서 자동으로 해제 시켜주는 기능. - 메모리 신경을 덜 쓸 수 있어 프로그램 구조가 단순해진다. 2.콤팩트 작업 -사용 중인(혹인 도달 가능한) 객체들을 한쪽으로 차곡차곡 옮겨서 조각난 메모리를 큰 메모리로 만드는 일. 3.finalizer(종료자) -가비지컬렉터가 있다고 하지만 데이터베이스연결,GDI+객체,COM객체,시스템객체는 비 관리 소스는 개발자가 직접 관리 해야 한다. -그래서 C#은 메모리 관리에 필요한 finalizer 및 IDisposable 인터페이스를 제공한다. 1)finalizer(종료자) -하지만 종료자는 많은 단점을 가진다. -종료자가 사용됐지만 우리가 원하는 시점에 객..

C#/이펙티브 C# 2023.07.02

아이템9.박싱과 언박싱을 최소화하라.

C#이 사용하는 메모리 형식 1.값 형식(value) -메모리에 값을 담는 형식 -스택에 할당 -기본데이터 형식과 구조체가 해당 2.참조(Referce) 형식 -메모리에 다른 변수의 주소를 담음 -힙에 할당(가비지컬렉터가 자동으로 제거) -복합데이터 형식과 클래스가 여기에 해당 데이터 형식 1.object 형식 -상속으로 어떤 데이터든 다룰 수있는 형식 -C#은 모든 데이터형식이 object형식을 받을 수 있도록 되어 있다. -모든 데이터형식은 object 타입의 자식이다. -박싱: 값 형식을 object 형식에 담아 형식 힙에 올리는 것 -언박싱 : 힙에 올라간 데이터를 object에 꺼내 값 형식으로 옮기는것. - 박싱과 언박싱을 수행하는 과정에서 복사가 일어나 임시 객체가 생성되기도 하며, 객체를 ..

C#/이펙티브 C# 2023.06.30

아이템8.이벤트 호출 시에는 null 조건 연산자를 사용하라.

1.이벤트(Event) -C#에서 객체의 사건을 표현하는 방식 -이벤트 처리기(Event Handler): 이벤트 발생 시 실행되는 메소드 -외부에서 호출 불가(은닉성) 2.null 조건 연산자 (C# 6.0에 추가됨) -객체의 맴버에 접근 하기 전에 해당 객체가 null인지 검사하는 형식 -객체가 null 이면 null을 반환 그렇지 않으면 지정된 멤버를 반환 3.예제 -이벤트를 호출 할 때 이벤트 핸들러에 등록된 정보가 없다면 nullreference를 띄운다. -그래서 if문으로 null값을 검사한다. -하지만 이렇게 되면 멀티스레드 환경해서 문제가 생긴다. -다른 스레드 환경에서에서 이벤트를 취소하게 된다면 nullreference를 띄우게 된다. -위 코드는 멀티스레드 환경에서의 문제를 해결한 ..

C#/이펙티브 C# 2023.06.29

아이템7. 델리게이트를 이용하여 콜백을 표현하라.

1.콜백 1)정의: -피호출자가 호출자를 다시 호출하는 것. -다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 말한다. 2.델리게이트(대리자) 1)정의 -코드(메소드)를 대신 실행하는 객체 -메소드를 호출하듯 사용(즉, 인수를 입력하고 결과를 반환받음) -단, 대리자가 실행할 코드는 컴파일이 아닌 실행 시점에 결정 2)Func과 Action Func과 Action은 마이크로소프트가 미리 선언해둔 대리자이다. -Func은 결과를 반환하는 메소드 (반환값 있음) -Action은 결과를 반환하지 않는 메소드 (반환값 없음) 3)델리게이트의 장점 -타입 안정적인 콜백을 정의할 수 있다. -인터페이스보다 결합도를 낮출 수 있다. -런타임에 설정할 수 있고 다수의 클라이언트에 보낼 수 있다. 4)주의점 -델리게이..

C#/이펙티브 C# 2023.06.25

아이템6.nameof 연산자를 적극 활용하라.

1.nameof 연산자 1)개요 서로 다른 시스템 및 서로 다른 언어에서 데이터를 주고 받는데 문자열에 의존하는 경우가 많았다. 문자열은 타입 정보를 손실한다는 것이 단점이다. 이러한 점은 타입 정보를 가지고 추가기능을 제공하는 개발도구(IDE)의 장점을 잃어버린다. 문제해결을 위해 C#6.0에서 추가된 게 nameof연산자다. 2)정의 -변수, 인터페이스,타입,네임스페이스 등의 이름을 문자열 상수로 생성한다. -nameof식은 컴파일시간에 계산되며 런타임에 영향을 주지 않는다. - 제네릭 타입을 사용할 경우 매개변수의 타입이 확정된 경우(닫힌제네릭)만 사용할 수 있다. *닫힌제네릭:매개변수의 타입이 확정된 경우 *열린제네릭: 타입이 확정되지 않은 매개변수가 남아있을 경우 -정규화된 이름도 비정규화된 이..

C#/이펙티브 C# 2023.06.24

아이템5.문화권별로 다른 문자열을 생성하려면 FormattableString을 사용하라.

1.FormattableString 클래스 1)정의 : 서식을 지정할 인수와 함께 복합 형식 문자열을 나타낼 수 있게 하는 클래스. -여러가지 문화권과 다양한 언어를 다룰려면 세부적인 제어가 필요하다. -FormattableString 타입 객체를 이용하면 문화권과 언어를 가진 문자열을 생성할 수 있다. 매개변수로 FormattableString 타입을 하나를 취한다. 메서드 내에 언어와 문화권을 지정하여 FormattableString을 최종적으로 문자열로 변경한다. 그리고 string.Format()으로 문자열을 반환한다. *주의점 Var키워드를 사용하거나 문자열 보간법을 사용할 때 생성결과로 컴파일러가 string 또는 FormattableString의 객체가 반환될 수도 있다. 결론: 여러 문화권..

C#/이펙티브 C# 2023.06.23