C#프로그래밍의 좋은 습관

12679 단어
1. 여러 클래스를 한 파일에 넣는 것을 피한다. 
2. 하나의 파일은 하나의 명칭 공간만 있어야 하며 여러 개의 명칭 공간을 같은 파일에 두지 않도록 해야 한다.
3. 한 파일은 500줄을 넘지 않는 코드(기계에서 나온 코드 포함하지 않음)가 좋다. 
4. 한 방법의 코드 길이는 30줄을 넘지 않는 것이 좋다.
5. 방법 중 5개 이상의 매개 변수가 있는 경우를 피한다.구조를 사용하여 여러 매개변수를 전달합니다. 
6. 행 코드는 80자를 초과하지 마십시오. 
7.기계에서 나오는 코드를 수동으로 수정하지 마세요. 
a) 기계에서 만든 코드를 편집해야 할 경우 편집 형식과 스타일은 이 인코딩 표준에 부합되어야 한다.
   b) Use partial classes whenever possible to factor out the maintained portions. 
8. 주석을 이용하여 뻔한 코드를 해석하는 것을 피한다. 
a) 코드는 스스로 해석할 수 있어야 합니다.좋은 코드는 읽을 수 있는 변수와 방법으로 명명되기 때문에 주석이 필요하지 않습니다.
9. as와 강제 형식 변환 사이에 as 조작부호를 우선 사용
10. 항상 액세스 가능한 데이터 멤버 대신 특성(Property)을 사용합니다.
11. 숫자의 값을 억지로 인코딩하지 말고 항상 구조 함수를 사용하여 값을 설정합니다. 
12. 자연 구조만이 const를 직접 사용할 수 있다. 예를 들어 일주일의 일수. 
13. 읽기 전용 변수에const를 사용하지 마십시오.읽기 전용을 실현하려면readonly를 직접 사용할 수 있습니다.
        C# code

    
    
    
    
public class MyClass { public readonly int Number; public MyClass( int someValue) { Number = someValue; } public const int DaysInWeek = 7 ; }

14. 각 가설은 반드시 Assert 검사를 사용해야 한다
a) 평균 15행에 한 번 검사(Assert)
      C# code

    
    
    
    
using System.Diagnostics; object GetObject() {…} object obj = GetObject(); Debug.Assert(obj != null );

15. 코드의 줄마다 백합 방식의 테스트를 통과해야 한다. 
16. 이미 처리된 이상만 던진다. 
17. 포획(catch)문장의 버퍼링 이상 서브문장(throw)에서 원시 이상 유지보수 원시 오류의 창고 분배를 항상 버퍼링한다.   
C# code

    
    
    
    
catch (Exception exception) { MessageBox.Show(exception.Message); throw ; // throw exception }

18. 피하는 방법의 반환값은 오류 코드입니다. 
19. 사용자 정의 이상 클래스를 정의하는 것을 최대한 피한다. 
20. 사용자 정의 이상을 정의해야 할 때:
a) 사용자 정의 예외는 ApplicationException에서 상속됩니다.
b) 사용자 정의 시리얼화 기능을 제공합니다.
21. 하나의 프로그램 집합에서 여러 개의 Main 방법을 사용하지 않는다. 
22. 필요한 조작만 대외적으로 발표하고 나머지는 인터넷이다. 
23. 반사를 과도하게 사용하지 마라(Reflection)
24. 포장(boxing)과 해체(unboxing) 사용을 최대한 피한다
25. 응용 프로그램 집합을 가능한 한 코드를 최소화한다(EXE 클라이언트 프로그램).포함된 비즈니스 논리를 클래스 라이브러리로 대체합니다. 
26. 매거 변수에 현식 값을 제공하는 것을 피한다. 
//정확한 방법
  public enum Color 
  {  
  Red,Green,Blue 
  } 
//피하다
  public enum Color {  
  Red = 1,Green = 2,Blue = 3 
  } 
27. 특수한 유형의 매거 변수를 지정하는 것을 피한다. 
//피하다
  public enum Color : long {Red,Green,Blue}
28.if문장이 한 문장이라도 if문장의 내용을 대괄호로 확대해야 한다. 
29.using과try/finally를 사용하여 자원의 방출을 처리한다
30. 조건문에서 bool 값을 되돌려 주는 함수를 호출하는 것을 피한다.국부 변수를 사용하고 이 국부 변수를 검사할 수 있습니다.
  bool IsEverythingOK() 
  {…}
//피하다
  if (IsEverythingOK ()) 
  {…} 
//교체 시나리오
  bool ok = IsEverythingOK(); 
  if (ok) 
  {…}
31. 항상 0 기반으로 시작하는 그룹을 사용합니다. 
32. 순환 중 항상 인용 형식의 그룹을 초기화합니다.  
C# code

    
    
    
    
public class MyClass { MyClass[] array = new MyClass[ 100 ]; for ( int index = 0 ; index < array.Length; index ++ ) array[index] = new MyClass(); }

33. 공공과 보호의 구성원 변수를 제공하지 말고 속성을 사용해서 대체한다. 
34. 계승에서 new를 사용하지 않고 오버라이드 교체를 사용한다. 
35. sealed가 아닌 클래스에서는 항상 퍼블릭과 보호된 방법을virtual로 표시한다. 
36. interop(COM+ 또는 다른 dll) 코드를 사용하지 않으면 안전하지 않은 코드(unsafe code)를 사용하지 마십시오. 
37. 표시된 변환을 피하고 as 조작부호를 사용하여 호환 형식의 변환을 한다.Dog dog = new GermanShepherd(); 
  GermanShepherd shepherd = dog as GermanShepherd; 
  if (shepherd != null ) 
  {…}
38. 클래스 멤버가 의뢰를 포함할 때
      a) Copy a delegate to a local variable before publishing to avoid concurrency race condition.  
b) 위임을 호출하기 전에 반드시 위임이 null인지 확인합니다.
  public class MySource 
  {  
  public event EventHandler MyEvent;  
  public void FireEvent()  
  {  
  EventHandler temp = MyEvent;  
  if(temp != null )  
  {  
  temp(this,EventArgs.Empty);  
  }  
  } 
  } 
39. 공적인 이벤트 구성원 변수를 제공하지 말고 이벤트 액세서리로 변수를 대체합니다. 
  public class MySource 
  {  
  MyDelegate m_SomeEvent ;  
  public event MyDelegate SomeEvent  
  {  
  add  
  {  
  m_SomeEvent += value;  
  }  
  remove  
  {  
  m_SomeEvent -= value;  
  }  
  } 
  } 
40. 이벤트 도움말 클래스를 사용하여 이벤트의 정의를 발표합니다. 
41. 항상 인터페이스를 사용한다. 
42. 클래스와 인터페이스의 방법과 속성은 적어도 2:1의 비율이다. 
43. 한 인터페이스에 한 멤버만 있는 것을 피한다. 
44. 가능한 한 각 인터페이스에 3-5명의 구성원을 포함시켜야 한다. 
45. 인터페이스 중의 구성원은 20개를 초과해서는 안 된다. 
a) 실제 상황은 12개로 제한될 수 있음
46. 인터페이스 구성원에 이벤트가 포함되지 않도록 한다. 
47. 추상적인 방법을 사용하지 않고 인터페이스 교체를 사용한다. 
48. 클래스 차원에서 인터페이스를 표시한다. 
49. 현식 인터페이스로 실현하는 것을 추천합니다. 
50. 한 유형이 인터페이스를 호환한다고 가정한 적이 없다.Defensively query for that interface.  
       C# code

    
    
    
    
SomeType obj1; IMyInterface obj2; /* obj1, */ obj2 = obj1 as IMyInterface; if (obj2 != null ) { obj2.Method1(); } else { // }

51. 최종 사용자에게 나타나는 문자열은 하드코딩을 사용하지 말고 자원 파일로 대체해야 한다.  52. 연결 문자열 같은 설정 기반 문자열을 하드코딩하지 마십시오.  53. 긴 문자열을 만들 때 StringBuilder를 사용하여string 54를 사용하지 마십시오.구조 안에서 방법을 제공하는 것을 피하다.a) 매개 변수화 구조 함수 b를 사용하는 것을 권장합니다.항상 정적 변수에 정적 구조 함수를 제공해야 한다.  56. 조기 귀속을 사용할 수 있다면 후기 귀속을 사용하지 마세요.  57. 응용 프로그램의 로그와 추적을 사용합니다.  58. 불완전한 switch 문장에 있지 않으면 goto 문장을 사용하지 마십시오.  59. switch 문에는 항상 정보를 표시하기 위해default 자구가 있어야 합니다.  int number = SomeMethod();    switch (number)    {    case 1:     Trace.WriteLine("Case 1:");    break;    case 2:     Trace.WriteLine("Case 2:");    break;    default:     Debug.Assert(false);    break;    } 60. 구조 함수에서 다른 구조 함수를 호출하지 않으면this지침을 사용하지 마십시오.//this의 예: public class My Class {public My Class(string message) {} public My Class ():this ("hello") {} 61.하위 클래스에 이름이 충돌하는 구성원을 다시 쓰거나 기본 클래스의 구조 함수를 호출하려면 베이스를 사용하지 마십시오.//base의 예: public class Dog {public Dog (string name) {} virtual public void Bark (int howLong) {} public class GermanShepherd: Dog {public GermanShe pherd (string name): base (name) {} override public void Bark (int howLong) {base. Bark (howLong)    }    } 62. 템플릿을 기반으로 할 때는 Dispose () 와 Finalize () 두 가지 방법을 실현해야 한다.  63. 일반적으로 System에서Object에서 System으로 변환합니다.Object에서 변환된 코드는 강제 변환이나 as 조작부호로 대체됩니다.class SomeClass {}//피하기:class MyClass {void SomeMethod(T) {object temp = t; SomeClass obj = (SomeClass) temp;}//정확: class MyClass where T: SomeClass {void SomeMethod(T) {SomeClass obj = t;    }    }  64. 일반적인 상황에서 제한부호가 있는 인터페이스를 고정시키지 마라.인터페이스의 제한 단계는 보통 강한 유형으로 바꿀 수 있다.public class Customer인터페이스 내의 구체적인 방법의 제한 조건이 확실하지 않다.  66. 항상 C# 내장(일반generics)을 사용하는 데이터 구조를 선택합니다.
67. ArrayList를 사용하지 마십시오.ArrayList에 객체가 추가되면 System으로 상자를 닫습니다.ArrayList에서 데이터를 꺼낼 때 실제 유형으로 되돌려야 하는 Object 유형ArrayList 대신 사용자 정의 컬렉션 유형을 사용하는 것이 좋습니다.net2.0은 새로운 유형, 즉 범형을 제공했다. 이것은 강한 유형으로 범형 집합을 사용하면 상자를 봉하거나 뜯는 것을 피하고 성능을 높일 수 있다.

좋은 웹페이지 즐겨찾기