글 작성자: Doublsb

본 글은 공부하며 작성하였습니다. 정보를 얻으실 때 사실과 다르거나 부정확한 정보가 들어있을 수도 있습니다.

 

https://ridibooks.com/books/754016655

 

C# 코딩의 기술 (기본편) : 똑똑하게 코딩하는 법

초보자가 놓치기 쉬운 실수나 이슈, 패턴을 소개하고 그 해결법을 에피소드 형식으로 제시해주는 C# 활용서 C# 제대로 알고 쓰자!C#은 C/C++, 자바와 문법이 비슷하지만, 구조적으로나 태생적으로

ridibooks.com

 

오늘 'C# 코딩의 기술' 서적을 드디어 다 읽었다. 대화 형식으로 C#의 꿀팁들을 설명해주는 게 좋은 책이었는데, 후반부로 갈 수록 어쩐지 내용에 힘이 빠지는 게 느껴져서 아쉽긴 했다. 어쨌든, 새롭게 얻은 지식들을 정리해보겠다.


IEnumerable 인터페이스

- IEnumerable은 데이터 자체를 저장하는 것이 아닌, 가져오는 방법을 아는 것이므로 메모리를 압박하지 않게 된다.

 

- 클로저로 인해 지역 변수 int[]가 캡처된다면, 지나치게 거대한 배열인 경우에는 Out of memory 예외가 발생한다.

이 때, IEnumerable<int>로 코드를 바꾼다면 클로저로 캡처되더라도 메모리를 압박하지 않을 것이다.

 

- List와 달리, IEnumerable은 Add나 Remove와 같이 컬렉션을 늘리거나 줄이는 기능이 없다.


부모형의 객체들을 다시 본래의 자료형으로 되돌려 연산하기

- 세 개의 클래스가 있다고 가정하자. Base, Extend-A, Extend-B 가 있고, 이 중 Extend-A와 Extend-B는 Base를 상속했다.

이 때, Base형으로 만들어진 array 안에 세 클래스의 객체가 섞여서 들어갔다고 하자.

 

보통 이 array에서 Extend-A만 추출해서 연산한다면, 번거롭게 형변환을 시도하고 해당 형인 경우에만 연산을 수행할 것이다.

하지만 아래와 같이 쓰면 간단하다.

 

Base[] array = { new Base(), new Extend-A(), new Extend-B() };

foreach(var e in array.OfType<Extend-A>())
{
	e.Do();
}

IDisposable, using은 파일 입출력을 할 때는 필수다

- 파일 입출력 시 예외가 발생하여 실행이 중단되면, 열린 파일이 영원히 안 닫힐 수도 있다.

- IDisposable은 using을 벗어난 이후에는 무조건 Dispose()를 실행하게 되므로, 예외가 발생할 수 있는 경우에는 using을 사용하자.


네임스페이스 이름이 같아서 곤란하다면

- 실무 작업을 할 때 System.Random과 UnityEngine.Random은 이름이 같아서 모호한 참조 문제가 발생했다.

- 아래와 같이 using에 별칭을 붙이면 문제가 해결된다.

using UnityEngine;
using System;
using Random = UnityEngine.Random;

public class Test : MonoBehaviour
{
    void Start()
    {
        var result = Random.Range(0, 5);
    }
}

 

반응형