c# 14

.Net Framework Guideline - Naming Rule(.net 프레임워크 디자인 지침 - 명명 지침) 정리

대/소문자 표기법 식별자용 대/소문자 규칙 식별자 내 단어를 구분하기 위해서 식별자 각 단어의 첫 글자는 대문자를 사용, 밑줄을 사용하여 단어를 구분하지 않는다. - PascalCasing : 파스칼 표기법 - camelCasing : 카멜 표기법 1) 매개 변수 이름을 제외한 모든 식별자에 사용하는 파스칼 표기법은 아래와 같이 각 단어의 첫 번째 글자를 대문자로 표기 - PropertyDescriptor, HtmlTag 아래와 같이 두 글자 머리글자어(two-letter acronyms)를 모두 대문자로 표기하기도 함. - IOStream 2) 매개 변수 이름에만 사용하는 카멜 표기법은 아래 예제와 같이 첫 단어를 제외한 각 단어의 첫 번째 글자를 대문자로 표기, 두 글자 머리글자어(two-letter..

C# 기초 - 이벤트와 델리게이트 (Event & Delegate)

Delegates(델리게이트) - Delegate는 대리자라고도 하며, 메서드에 대한 참조를 갖는 형식이다. - 함수포인터나 콜백과 동일한 동작으로 delegate를 호출하면 참조하고 있는 메서드가 호출된다. - 참조하는 함수의 반환 형식 및 매개변수를 사용하여 선언한다. * 선언한 함수 형식이 일치하는 메서드에 대해서만 참조할 수 있다. 아래와 같은 형식으로 선언하여 사용 public delegate [반환형식] [이름] (매개변수) [예제] public delegate void ThresholdReachedEventHandler(object sender, ThresholdReachedEventArgs e); -> 반환형이 void, 매개변수는 object, ThresholdReachesEventArg..

[C#] abstract & virtual 연산자와 override & new 연산자

virtual method(가상 함수) 1. abstract(추상) vs virtual(가상) - abstract(추상) : 선언하는 클래스도 반드시 abstract 클래스. 이 키워드로 정의한 속성이나 메서드는 본문을 정의할 수 없으며 접근 한정자는 public, internal, protected로 선언. public abstract class TestAbstractClass { public abstract int TestAbstractFunc(); } - virtual(가상) : 정적 클래스를 제외한 모든 클래스에서 사용 가능. 이 키워드로 정의한 속성이나 메서드는 본문을 정의할 수 있으며 abstract와 마찬가지로 접근 한정자는 public, internal, protected로 선언해야 한다...

[Effective C#] string.Format()을 보간 문자열로 대체하라

String.Format 메서드 (링크) String s = String.Format("The current price is {0} per ounce.", pricePerOunce); Console.WriteLine(s); 생성된 문자열을 직접 출력해보고 올바른 형태인지 직접 확인하기 전까지 코드를 제대로 작성했는지 확인이 어려움 - 포맷 문자열과 인자리스트를 분리하여 전달 - 포맷 문자열에 나타낸 인자의 개수와 실제 전달되는 인자의 개수가 일치하는지 확인하지 않음. - 개발자의 실수로 누락하여 런타임 에러가 발생할 수 있음 $ 문자열 보간 (링크) string name = "Mark"; var date = DateTime.Now; // Composite formatting: Console.WriteLi..

[Effective C#] 캐스트보다는 is, as가 좋다.

C#에서의 형 변환 - as object o = Factory.GetObject(); // as 변환 MyType t = o as MyType; if (t != null) { //MyType 타입의 t 객체 사용 } else { //형변환 실패 시 } - cast(강제 형 변환) object o = Factory.GetObject(); // cast 변환 try { MyType t; t = (MyType) o; //MyType 타입의 t 객체 사용 } catch (InvalidCastException) { //형변환 실패 오류 } => as를 사용할 경우 작성하기 더 쉽고 읽기도 편하다. try/catch 문이 없기 때문에 성능도 더 좋다. as와 cast의 동작 차이- '사용자 정의 형변환을 어떻게 다..

C# yield 기초 이해하기

yield 호출자(Caller)에게 컬렉션 데이터를 하나씩 리턴할 때 사용한다. Enumerator(Iterator)라고 불리는 이러한 기능은 집합적인 데이터 셋으로부터 데이터를 하나씩 호출자에게 보내주는 역할을 한다. - yield return : 컬렉션 데이터를 하나씩 리턴하는데 사용 - yield break : 리턴을 중지하고 iteration 루프를 빠져나올 때 사용 예제 1) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 using System; using System.Collections.Generic; class Program { static IEnumerable GetNumber() { yield return 1; // 첫번째 루프에서 리턴되는 ..

[Effective C#] C# 표준 Dispose 패턴 이해하기

Implement a dispose pattern -> Link - .Net Framework 내부에서 비관리 리소스를 정리하는 표준화된 패턴 - 개발자들에게 IDisposable 인터페이스를 통해 리소스를 삭제할 수 있는 기능을 안정적으로 제공한다. - 비관리 리소스를 명시적으로 정리해야 한다는 사실을 잊거나 인지하지 못한 경우에도 finalizer를 통해 리소스가 정리될 수 있도록 해준다. 베이스 클래스에서의 작업 - 리소스를 정리하기 위해 IDisposable 인터페이스를 구현한다. - 멤버 필드로 비관리 리소스를 포함하는 경우에 한해 방어적으로 동작할 수 있도록 반드시 finalizer를 추가한다. -> 사용자가 Dispose()메서드를 항상 올바르게 호출할 것이라고 가정할 수 없다. 비관리 리소..

[Effective C#] C# 정적 클래스 멤버 초기화 유의사항

정적 멤버 변수를 포함하는 타입이 있다면 인스턴스를 생성하기 전 반드시 정적 멤버 변수를 초기화 하여야한다. C#에선 '정적 멤버 초기화'와 '정적 생성자' 두가지를 제공한다. * 정적 변수를 초기화하기 위해 인스턴스 생성자나 전용의 private 메서드 혹은 다른 관용구를 사용해서는 안된다. 정적 멤버 초기화 - 인스턴스 멤버 초기화와 마찬가지로 정적 멤버를 간단히 초기화하는 경우라면 정적 생상자보단 멤버 초기화 구문을 사용하는 것이 좋다. - 정적 생성자가 호출되기 이전에 실행되며, 베이스 클래스의 정적 생성자보다도 먼저 호출된다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class MySingleton { private static reado..

[Effective C#]C# 멤버 초기화 - 할당 구문보다 멤버 초기화를 사용한다.

할당 구문보다 멤버 초기화(member initializer) 구문 사용 - 생성자가 여러개인 경우, 멤버 변수 초기화를 누락하여 사용할 수 있다. 멤버초기화는 이러한 누락을 방지할 수 있다. 1 2 3 4 5 6 public class MyClass { //컬렉션을 선언하는 동시에 초기화 private List labels = new List(); } Colored by Color Scripter cs 이와 같은 코드는 MyClass 타입에 몇개의 생성자가 추가되든 올바른 초기화를 사용할 수 있다. * 컴파일러는 모든 생성자의 시작 부분에 멤버 초기화 구문을 포함시킨다. 새로운 생성자가 추가되거나 사용자가 생성자를 선언하지 않아 기본 생성자가 만들어진 경우에도, 항상 생성자가 실행되기 전 멤버 초기화 ..

[Effective C#] C# 가비지 컬렉터(Garbage Collector) 기초 / finalizer 이해하기

가비지 컬렉터(Garbage Collector, GC) 자동 메모리 관리자, 애플리케이션의 메모리 할당 및 해제를 관리한다. 즉 개발자는 메모리 관리를 위한 코드를 작성할 필요가 없다. 메모리 누수, 댕글링 포인터(dangling pointer), 초기화 되지 않은 포인터 등의 기타 메모리 관련 문제를 개발자가 직접 다루지 않게 된다. * dangling pointer : 유효한 곳을 가르키고 있지 않는 포인터 -관리되지 않는 리소스(Unmanaged Resource, 비관리 리소스)의 경우엔 개발자가 직접 관리해야 하며, 이벤트 핸들러, 델리게이트 등도 잘못 사용하면 이를 참조하고 있는 객체가 불필요하게 메모리에 남게 되므로 사용에 유의해야 한다. ->그럼에도 Garbage Collector가 메모리를..