C\#에서 초보 자 들 이 범 하기 쉬 운 전형 적 인 결함
1 적시에 자원 방출
CLR 위탁 관리 환경 은 쓰레기 회수 역할 을 하기 때문에 만 든 대상 이 사용 하 는 메모 리 를 명시 적 으로 방출 할 필요 가 없습니다.그러나 이것 은 당신 이 사용 한 모든 대상 을 소홀히 할 수 있다 는 것 을 의미 하지 않 는 다.많은 대상 들 이 다른 유형의 시스템 자원(예 를 들 어 디스크 파일,데이터 연결,네트워크 포트)을 봉인 했다.이러한 자원 의 사용 상 태 를 유지 하면 시스템 의 자원 을 급 격 히 소모 하고 성능 을 약화 시 키 며 결국 프로그램 에 오류 가 발생 할 수 있다.파일,네트워크 포트,데이터 연결 을 열 때 이 자원 을 사용 하지 않 을 때 이 자원 을 빨리 표시 해 야 합 니 다.
또한 자원 에 대한 작업 은 일반적으로 이상 포획 처리(Try.Catch)를 추가 해 야 합 니 다.이 때 finally 에서 자원 방출 을 하 는 것 을 잊 지 마 세 요.이상 포획 시 에 도 자원 을 정상적으로 방출 할 수 있 도록 합 니 다.
2.다 중 스 레 드 를 정확하게 정지 합 니 다.
FileStream fs = File.Open(…);
Try{…} Finally{ fs.Close;}
위의 코드 가 작업 스 레 드 에서 finally 로 진행 되 었 다 고 가정 하면 이때 UI 스 레 드 가 이 스 레 드 의 Abort()방법 을 호출 하면 fs.close 가 실행 되 지 않 았 을 때 작업 스 레 드 가 finally 코드 블록 에서 뛰 어 나 왔 을 가능성 이 높다.이렇게 하면 너의 fs 는 영원히 닫 히 지 않 을 것 이다.
대부분의 경우 finally 는 영원히 실 행 됩 니 다.그러나 Thread.Abort 호출 으로 인 한 ThreadAbort Exception 이상 은 포함 되 지 않 습 니 다.이 를 감안 하여 Abort 를 사용 하 는 것 을 권장 하지 않 습 니 다.
스 레 드 를 정확하게 멈 추 려 면 호출 자가 어떤 행동 을 했 는 지(Thread.Abort()를 직접 사용 하지 마 십시오)가 아니 라 작업 스 레 드 가 호출 자의 정지 요청 에 주동 적 으로 응답 할 수 있 는 지 에 의존 합 니 다.
대체 체 제 는 스 레 드 가 정지 되 어야 한다 면 스 레 드 자체 가 호출 자 에 게 Cancel 인 터 페 이 스 를 개방 하 는 것 을 책임 져 야 한 다 는 것 이다.
3 유형 변환 관련
데이터베이스 에서 어떤 값 을 읽 으 면 데이터 가 있 을 때 int 형식 이 고 데이터 가 없 으 면 null 을 얻 을 수 있 으 며 형식 이 강하 게 바 뀌 면 이상 합 니 다.그래서 보통 강 한 회전 을 사용 하지 않 고 사용 하면 이상 한 포획 을 해서 프로그램의 이상 을 피해 야 한다.
강 한 전환 이 좋 지 않 은 상황 에서 우 리 는 Try Parse 방법 을 사용 하 는 것 을 권장 합 니 다.이 방법 은 이미 Parse 방법 에 대해 이상 처 리 를 했 습 니 다.
Convert 로 도 이상 포획 이 필요 합 니 다.사실은 유형 전환,직렬 화 등 조작 과 관련 된 곳 은 모두 이상 을 포착 해 야 한다.
질문
문자열 작업 에서 대량의 연결 작업 과 관련 이 있 으 면 StringBuilder 를 사용 하 는 것 을 권장 합 니 다.String 을 사용 하면 뚜렷 한 성능 손실 을 가 져 올 수 있 습 니 다.이 유 는 string 대상 이 매우 특수 한 대상 이기 때문에 할당 되면 바 꿀 수 없습니다.실행 할 때 String 클래스 의 모든 연결 동작(예 를 들 어 할당,'+'등)을 호출 하면 메모리 에 새 문자열 대상 을 만 들 고 새 대상 에 게 새 메모리 공간 을 할당 하 는 것 을 의미 합 니 다.
5 const 상수 수정 으로 인 한 문제
프로그램 이 다른 dll 의 const 상수 를 참조 할 때 특히 주 의 를 기울 여야 합 니 다.
이 dll 에 있 는 const 상수 가 수정 되면 이 dll 에 있 는 const 상수 의 모든 프로그램 을 다시 컴 파일 해 야 합 니 다.그렇지 않 으 면 프로그램 에서 사용 하 는 이 상수 값 은 dl 에 있 는 것 과 일치 하지 않 습 니 다.
또한 const 대신 readonly 를 사용 하면 이 문 제 를 해결 할 수 있 습 니 다.다시 컴 파일 할 필요 가 없습니다.const 는 컴 파일 형 상수 이 고 readonly 는 실행 시 상수 이기 때 문 입 니 다.
6 C\#대상 플랫폼 문 제 를 컴 파일 합 니 다.
프로그램 이 의존 하 는 dll 의 컴 파일 대상 플랫폼 이 X86 이면 프로그램 자체 의 컴 파일 대상 플랫폼 도 반드시 X86(기본 옵션 Any CPU 가 아 닌)이 어야 합 니 다.그렇지 않 으 면 64 비트 컴퓨터 가 실 행 될 수 없습니다.
7 크로스 스 레 드 접근 컨트롤
인터페이스 프로그램 을 개발 할 때 비교적 시간 이 걸 리 는 작업 을 만 날 수 있 습 니 다.프로그램의 우호 성 을 위해 저 희 는 보통 작업 스 레 드 에서 시간 이 걸 리 는 작업 을 수행 하고 실행 정 보 를 주 UI 스 레 드 에 표시 합 니 다.
작업 스 레 드 에서 주 UI 스 레 드 의 컨트롤 을 직접 조작 하면 이상 이 발생 하기 쉽 습 니 다."다른 스 레 드 에서 컨트롤 스 레 드 를 만 드 는 값 을 수정 할 수 없습니다"라 고 보고 합 니 다.컴 파일 러 가 크로스 스 레 드 에 접근 하 는 것 을 금지 하 는 값 을 설정 하면 오류 가 발생 하지 않 지만 예측 할 수 없 는 문제 가 발생 할 수 있 습 니 다.이 때 는 의뢰 나 익명 의뢰 방식 으로 이 뤄 지 는 것 을 권장 합 니 다.
이상 은 7 가지 초보 자 들 이 범 하기 쉬 운 전형 적 인 결함 을 정리 하여 여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.