목록C#/More Effective C# (48)
방프리
Item 8 : 익명 타입은 함수를 벗어나지 않게 사용하라 튜플은 굳이 각 필드 별로 네이밍을 할 필요가 없다. 하지만 기본적으로 설정되는 네이밍은 Item1, Item2와 같이 설정되므로 가독성을 올리기 위해서는 해주는 것이 좋다. static (T sought, int index) FindFirstOccurrence( IEnumerable enumerable, T value) { int index = 0; foreach (T element in enumerable) { if (element.Equals(value)) { return (value, index); } index++; } return (default(T), -1); } 물론 다른 방식으로도 네이밍 설정이 가능하다. // 결과를 튜플 변수에..
Item 7 : 튜플을 사용해서 타입의 사용 범위를 제한하라 간단한 기능을 구현할 때 또는 한 번 사용되고 추후 사용되지 않을 타입을 위해서 구조체나 클래스를 생성하는 건 너무나 비효율적이다. 이를 대체하기 위해 익명 타입과 튜플을 고려해보는 것도 좋다. 하나의 메서드의 반환 타입을 위해 또는 한 번 사용될만한 구조체를 쓸데없이 정의하는 것보다 더 가독성이 올라갈 것이다. //아래의 변수는 var aPoint = new { X = 5, Y = 67 }; //컴파일러가 다음과 같이 선언한다. internal sealed class AnonymousMumbleMuble { private readonly int x; public int X { get => x; } private readonly int y; p..
Item 6 : 속성을 데이터처럼 동작하게 만들라 C#에서는 속성이라는 기능을 통해 외부에서는 데이터 요소처럼 보이지만, 내부에서는 메서드로 구현되는 기능이 있다. public class MyClass { public int MyData { get; set; } } 속성을 사용할 때에는 get에서는 절대 데이터가 수정되지 않은 있는 그대로의 값을 반환해야 하며, set에서는 최대한의 연산만을 넣어야 한다. 그렇지 않으면 최적화에 영향을 미칠 뿐 아니라 멀티 쓰레드 환경에서 문제가 발생될 수도 있기 때문이다. 가장 기본을 잘 지킨 예를 한 번 살펴보자. public string LastName { get { return _lastName; } set { if (string.IsNullOrEmpty(valu..
Item 5 : 값 타입에서는 0이 유효한 상태가 되도록 설계하라 이 항목에 해당하는건 기본적인 데이터 타입 (int, float, double 등...)이 아닌 사용자가 정의하는 enum에 초점이 맞춰져있다. 열거형은 코드의 가독성을 높히는데 가장 큰 공헌을 한다. 그만큼 자주 쓰이는데 자주 쓰이는만큼 이 타입을 어떻게 초기화할 것인지도 중요하다. public enum Planet { Murcury = 1, Venus = 2, Earth = 3, Mars = 4, Jupiter = 5, Saturn = 6, Uranus = 7, Neptune = 8, } Planet sphere = new Planet(); var anotherSphere = default(Planet); sphere와 anotherS..
Item 4 : 값 타입과 참조 타입을 구분하라 C#에서 구조체를 사용할 것인지? 클래스를 사용할 것인지는 사용자가 해당 타입을 어떤 목적으로 사용하느냐에 따라 용도에 맞게 골라서 선언하면 된다. 구조체는 데이터의 집합인 타입은 구조체로 선언하고, 어떠한 행동을 하는 타입은 클래스로 정한다. 구조체를 선언하기 전, 몇 가지를 명심해야 한다. 작고 가벼워야 한다. 구조체로 선언하게 되면 클래스 타입과 연동되지 않기 때문에 추후에 변경하게 되면 많은 작업이 들어가게 된다. 값 타입이기 때문에 복사가 이루어진다. 박싱과 언박싱이 쉽게 이루어질 수 있다. 구조체와 클래스가 어떻게 다른가? 메모리를 할당할 때에도 어떻게 할당이 이루어지는지 알아보자. public class C { private MyType a =..
Item 3 : 값 타입은 변경 불가능한 것이 낫다. 코딩을 하다보면 값이 변경되지 않아야 하는 것들이 있을 수 있다. 예로 아이템의 기본정보라던지, 특정 AccessKey값 등 여러 종류가 있겠다. 이들을 어떻게 만들면 될까? 간단한 방법으로는 const를 떠올릴 수도 있겠지만 좀 더 C#의 기능을 사용해서 변경하는 방법도 있다. public struct Address { public string Line1 { get; } public string Line2 { get; } public string City { get; } public string State { get; } public int ZipCode { get; } public Address(string _Line1, string _Line2,..
Item 2 : 변경 가능한 데이터에는 암묵적 속성을 사용하는 것이 낫다. 앞서 C#에서는 getter, setter 함수의 구현 대신 속성이란 개념이 있고, 이를 주로 사용한다는 것을 배웠다. 이 속성을 좀 더 편하게 암묵적으로 선언할 수 있는데 이를 통해 해당 변수의 사용 목적을 바로 알 수 있다. public string Name { get; protected set; } public string Name { get; internal set; } public string Name { get; protected internal set; } public string Name { get; private set; } public lstring Name { get; } virtual로 선언한다면 다음과 같이..
Item 1 : 접근 가능한 데이터 멤버 대신 속성을 사용하라 OOP의 개념 중 하나인 정보은닉을 위해 public 멤버변수에 접근할 때 getter와 setter를 구현해야 한다. 이는 언어에 따라 달라지는게 아닌 모든 언어에 공통적으로 적용되는 기법이기도 하다. C#에서는 C++보다 더 쉽게 속성(Property)이라는 것을 사용해서 구현할 수 있도록 되어 있다. public class Sample { private string _name; public string Name { get { return _name; } set { _name = value; } } } 이런 속성을 구현해주는 이유는 단순히 OOP 규칙을 맞추기 위해서 뿐만 아니라 수정에 대한 시간을 단축하기 위한 용도로도 사용이 가능하다...