C# Study/이펙티브 C# 맨텀 2021. 5. 13. 23:12
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 1. 예외에 대한 보증 3가지 1-1) 기본 보증(basic guarantee) 특정 함수 내에서 발생한 예외가 이 함수를 빠져나오더라도 어떤 리소스도 누수되지 않으며, 모든 객체의 상태가 유효한 상태를 유지함을 의미. NET CLR은 기본 보증을 준수한다. 1-2) 강력한 보증(strong guarantee) 기본 보증에 더하여 예외 발생 시에도 프로그램의 상태가 변경되지 않음을 추가로 보증함. LINQ 쿼리를 사용하면 기본적으로 강력한 예외 보증 요건을 준수하게 된다. 함수형 프로그래밍 스타일을 사용할 수 없는 경우 방어적인 프로그램을 위해 기존 데이터의 복사본을 유지하고 작업이 완료된 후 값을 교환하는 방법을 사용하면 된다...
C# Study/이펙티브 C# 맨텀 2021. 5. 13. 20:24
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 예외 객체에 포함된 기존 오류 관련 정보를 훼손하지 않으면서도 저수준의 에러 내용을 응용프로그램 관점으로 재해석한 정보를 예외 객체에 포함시키고 싶을 수 있다. 이 경우 사용자 지정 예외 클래스를 만들 수 있다. 예외클래스의 목적 catch문을 작성할때 예외의 런타임 타입에 따라 서로 다른 작업을 수행하는게 일반적이다. try { Foo(); } catch(MyFirstApplicationException e1) { FixProblem(e1); } catch(AnotherApplicationException e2) { ReportErrorAndContinue(e2); } catch(YetAnotherApplicationExcept..
C# Study/이펙티브 C# 맨텀 2021. 5. 13. 13:44
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 관리되지 않는 시스템 리소스를 사용하는 타입은 IDisposable 인터페이스의 Dispose()메서드를 이용하여 명시적으로 리소스를 해제해야 한다. 사용자 입장에서 Dispose()메서드가 항상 호출되도록 코드를 작성하기 위한 최선의 방법은 using문이나 try/finally 블록을 활용하는 것이다. using 문 사용하기 다음과 같은 코드를 작성했다고 해보자. SqlConnection과 SqlCommand는 둘 다 Dispose()를 구현한 객체지만 사용자가 Dispose()를 호출하지 않았기 때문에 finalizer가 호출될 때까지 메모리에 남게 된다. public void ExecuteCommand(string connS..
C# Study/이펙티브 C# 맨텀 2021. 5. 12. 20:26
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 반환코드 반환코드의 경우 메서드의 원형에 영향을 미친다. 계산의 결과를 나타내는 용도로 사용되므로 오류가 발생했다는 사실 이외의 추가적인 정보를 전달하기가 어렵다. 메서드 호출자에 의해서 처리된다. 예외 예외를 이용하는 방식은 클래스 타입이므로 개발자가 자신만의 예외 타입을 파생시킬 수 있으며 오류에 대한 추가적인 정보를 전달할 수 있다. 콜 스택을 통해서 적절한 catch문이 구성된 위치까지 전파된다. 적절한 catch문이 포함되어있지 않다면 응용프로그램이 종료되니 예외는 쉽게 무시하기 어렵다. 사전에 예외 검사하기 예외를 처리하는 작업은 일반적인 메서드 호출보다 시간이 많이 걸린다. 특정 작업을 수행하기 전에 실패할 가능성이 ..
C# Study/이펙티브 C# 맨텀 2021. 5. 12. 18:33
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 다음의 예는 클로저에서 캡처된 변수를 수정했을 때의 상황을 보여주기 위한 예이다. var index = 0; Func sequence = () => Utilities.Generate(30, () => index++); index = 20; foreach(int n in sequence()) WriteLine(n); WriteLine("Done"); index = 100; foreach(var n in sequence()) WriteLine(n); 위의 코드를 실행하면 20부터 50까지를 출력한 후, 100부터 130까지를 출력한다. C# 컴파일러는 쿼리 표현식을 실행 코드로 변환할 때 다양한 작업을 수행한다. 사용된 표현식이 어떤..
C# Study/이펙티브 C# 맨텀 2021. 5. 12. 17:19
다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다. 1. Single 1-1) Single LINQ에서 SIngle()은 정확히 1개의 요소만 반환한다. 만약 어떤 요소도 포함되지 않거나 여러 개의 요소가 포함되는 경우 Single()은 예외를 유발한다. 결괏값으로 한 개밖에 존재하지 않는다는 것을 강력히 제한하고 싶을 때 사용하자. 1-2) SingleOrDefault() 어떤 요소도 포함되지 않을경우 기본값을 반환(참조 타입은 null)한다. 하지만 역시 결괏값이 2개 이상이면 예외를 일으킨다. 2. First 2-1) First() 여러 개의 값이 반환되는 경우 첫 번째 요소만을 가져온다. 역시 어떤 요소도 포함되지않는다면 예외를 발생시킨다. 2-2) FirstOrDefaul..