좋습니다! 아래는 csharp-code-convention.md 파일에 들어갈 수 있는 기본 틀 템플릿입니다. Microsoft의 공식 스타일 가이드와 업계 관행을 참고해 실무에 적합하도록 요약했습니다.
- 파일당 하나의 주요 클래스만 선언
- 클래스명과 파일명을 일치시킬 것
예:
UserService.cs→public class UserService
| 대상 | 규칙 | 예시 |
|---|---|---|
| 클래스/인터페이스 | PascalCase | UserService, IRepository |
| 메서드 | PascalCase | GetUserById() |
| 변수 | camelCase | userCount, isValid |
| 상수 | PascalCase | MaxRetryCount |
| private 필드 | _camelCase |
_logger, _cache |
| enum | PascalCase | UserRole.Admin |
- 스페이스 4칸 들여쓰기
- 연산자 주변, 콤마 뒤에는 한 칸 공백
- 메서드 간 공백 1줄, 클래스 간 2줄
if,for,while등은 항상 중괄호 사용
if (isEnabled)
{
Execute();
}System관련 using은 항상 최상단- 알파벳 순서로 정렬
- 사용하지 않는 using 제거
using System;
using System.Collections.Generic;
using MyApp.Services;-
접근 제한자를 항상 명시
-
클래스 구성 순서:
- Fields
- Constructors
- Properties
- Methods
- Events
-
하나의 메서드는 하나의 책임만 갖는다 (단일 책임 원칙)
-
비동기 메서드는
Async접미사 사용public async Task<User> GetUserAsync(int id)
- XML 주석 스타일 사용 권장 (
///) - 꼭 필요한 경우에만 주석 사용
TODO,FIXME태그 사용
/// <summary>
/// 사용자를 ID로 조회합니다.
/// </summary>
public User GetUserById(int id)- 가능한 한 세부적인 예외 타입을 catch
- 공백 catch (
catch {}) 금지 - 로그 기록 필수
try
{
DoWork();
}
catch (IOException ex)
{
_logger.LogError(ex, "파일 입출력 오류");
}- ternary operator는 간단한 경우만 사용
- null 병합 연산자 적극 활용 (
??,??=) - C# 8.0 이상에서는 switch expression 사용 권장
var result = input switch
{
1 => "One",
2 => "Two",
_ => "Other"
};필요하다면 이 틀을 Markdown 파일로 추출하거나, 팀 내부 스타일에 맞게 커스터마이징해드릴 수도 있어요.