목록.NET/Effective C# (11)
HaPpY hApPy
1. Collection 의 Key로 활용될 경우가 아니라면 GetHashCode() 재정의 할 필요 없음 A. Operator == 재정의했다면 무조건 재 정의 해야함. 2. 만약 정의 해야 한다면 따라야 할 3가지 규칙 A. (operator == 에서 동일한 결과를 가질경우) 두 객체는 동일한 해시 코드를 생성해야 한다. B. 객체가 생성된 이후에는 GetHashCode()에 대한 호출이 변경되면 안된다. C. 해시 함수는 integer의 표현범위 내에서 골고루 잘 분산되어야한다. 3. GetHashCode()의 역할 A. System.Object의 객체 생성자에 의해서 만들어지고 1부터 시작하여 매 객체 생성 요청때마다 1씩 증가되는 값을 생성, GetHashCode는 이걸 단순히 return 4..
1. c#에서 두개의 객체가 동일한가 확인하기 위한 4가지 메서드가 존재. public static bool ReferenceEquals (object left, object right); public static bool Equals(object left, object right); public virtual bool Equals(object right); public static bool operator ==(MyClass left, MyClass right); 1. 여러개가 존재하는 이유 + Value 타입과 Reference Type 때문에 - Reference Type 은 같은 주소를 가지고 있어야 동일함 - Value는 같은 주소는 아니라도 같은 값을 가지면 동일함 2. 재정의 하면 안되는 함..
1. enum 을 사용할 때 명시적으로 값을 주지 않으면 0부터 시작하기 때문에 None 이라는 걸 0으로 명시적으로 주자. 또한 Flag Attribute를 사용할때도 0에 None을 명시적으로 주어, 처음 시작하는 값이 0이되지 않게 해야한다. [Flags] public enum Styles { None = 0, Flat = 1, Sunken = 2, Raised = 4 } 위에 만약 None이 존재하지 않아 Flat이 0이되면 아래코드는 제대로 작동하지 않는다. if ((FlagsAttribute & Styles.Flat) != 0) { DoFlatThings(); } (FlagsAttribute & Styles.Flat) 의 결과가 모두 0이 되어버림 2. string은 최초 생성시 null이 들..
은행에서 어떤 사람의 정보를 변경한다고 가정하자. 이 사람의 이름, 나이, 주소, 저금한 금액, 등등이 있을수 있는데, 은행에서 이 사람의 정보를 업데이트 하는과정에 _name = name; _moeny += money //오늘 저금한 금액 + 이전 금액 _age = age; _address = address; _phones = phones 이렇게 업데이트가 이루어지는 과정에 _name = name; 까지만 실행되었는데 만약 다른곳 혹은 다른 쓰레드에서 이 돈을 가져가서 정리를 하고 그다음 다시 _money += money 문장이 실행되고 다른곳에서 사용된 돈이 다시 _money -= usedMoney 해서 사용된 만큼 빼고 돌아오면 아마 저금한 돈이 날라갈꺼다 (쓰레드, 크리티컬 섹션 생각하면 이해가 ..
value reference 타입은 작고 단순한 타입에, 타입은 클래스간 상속이 필요한 경우 값을 저장하기에 좋고 행동을 저장하기에 좋다 타입이 단지 데이터만 저장하기위해 value 타입의 추후 동작방식에 대해서 조금이라도 의구심이 든다면 reference타입을 사용 모든 public interface가 단지 내부적인 값을 획득하거나 수정하기 위해서만 사용되는가 전혀 상속될 가능성이 없는가 다형적일 필요가 없는가.
5장은 그냥 자신이 작성한 클래스에 대해 좀더 자세한 정보를 사용자에게 주자라는 취지인듯 하다. 언젠가 내가 코딩을 하고 누군가가 내가 만든 클래스를 사용하게 되면, 그때 이부분 다시 공부해봐야겠다, 지금은 일단 패스 ㅡ ㅡㅎ
namespace ConsoleApplication{ class Program { class CStudent { private string _name; public CStudent() { _name = "못생긴 학생"; } public string Name { get { return _name; } set { CheckState(); _name = value; CheckState(); } } [Conditional("DEBUG")] public void CheckState() { Console.WriteLine("대입 하기전 혹은 후 학생의 이름 {0}",_name); } } static void Main(string[] args) { CStudent student1 = new CStudent(); st..
캐나다에서 몇년간 영어공부만 하다가 코딩을 다시 할때 젤 웃겻던게 is, as 문법이다 ㅎㅎ그리고 이제 시간이 조금 지나 사용할 때마다 아주 키워드 이름을 잘 지은거 같다. ㅎㅎ 직관적이라 좋다. 형 변환성 가능성 체크 는 is로 하고형 변환은 as로 하면된다. is, as 는 사용자가 정의한 형변환 연산자의 존재를 고려하지 않기 때문에 런타임의 수행성능 효율도 좋다. as 와 cast의 효율은 밑에서 비교해보자asobject o = Factory.GetObject();// Version one:MyType t = o as MyType;if (t != null){// work with t, it's a MyType.}else{// report the failure.} caseobject o = Facto..
1. 상수형으로 컴파일 타임 상수(const)와, 런타임 상수(readonly) 두가지의 차이점(빠르지만 가끔 위험한 프로그램), (가끔 느리지만 안전한 프로그램) 당연히 우린 후자를 선택해야한다! 2. 컴파일 타임 상수는 기본적인 내장자료형이나 enum string에 대해서만 사용가능 하지만 내장 자료형이 아닌DateTime 을 new 연산자로 초기화 하려 시도하면 컴파일시에 오류가 발생한다.// Does not compile, use readonly instead:private const DateTime classCreation = new DateTime(2000, 1, 1, 0, 0, 0); 3. 또하나 큰 차이점 특정 프로그램에 const를 사용해서 컴파일 해서 배포한 후에나중에 다시 그 값이 변..
1. 프라퍼티에 이렇게 숫자 인덱스를 붙여서 사용하는 방법도 있고 public int this[int index]{get { return theValues[index]; }set { theValues[index] = value; } } 2. 이렇게 문자열 인덱스를 사용하여 맵이나 디렉토리와 같은 자료구조의 표현도 가능하다public Address this[string name]{get { return adressValues[name]; }set { adressValues[name] = value; } } 3. 위 2개를 섞어 사용할수도 있다.public int this[int x, string name]{get { return ComputeValue(x, name); } } 이 쯤에서 간단히 끝!