Posted:      Updated:

일반적인 C# 코딩 규칙

명명 규칙

✔ 간결성보다는 가독성에 중점을 둔다.
✔ 밑줄, 하이픈, 기타 영숫자가 아닌 문자를 사용하지 않는다.
✔ 약어, 머리글자어를 사용하지 않는다. 대/소문자 표기법 참고

PascalCasing

✔ 모든 상수, 지역 변수, 필드의 이름, 로컬 함수를 포함한 모든 메서드 이름에 파스칼 대/소문자(PascalCasing)를 사용한다.
✔ 예외: interop 코드, 이벤트 핸들러

public class DataService
{
}

public record PhysicalAddress(
    string Street,
    string City,
    string StateOrProvince,
    string ZipCode);

public struct ValueCoordinate
{
}

✔ 인터페이스 이름에서는 I 접두사를 붙인 뒤 파스칼 케이스를 사용한다.

public interface IWorkerQueue
{
}

camelCasing

✔ parameter(매개변수)에는 카멜 대/소문자(camelCasing)를 사용하고 _ 접두사를 붙인다.

public T SomeMethod<T>(int someNumber, bool isValid)
{
}

internal 필드, private 에는 카멜 대/소문자(camelCasing)를 사용하고 _ 접두사를 붙인다.

public class DataService
{
    private IWorkerQueue _workerQueue;
}

static 인 경우 s_, 정적 스레드인 경우 t_ 접두사를 붙인다.

public class DataService
{
    private static IWorkerQueue s_workerQueue;

    [ThreadStatic]
    private static TimeSpan t_timeSpan;
}

머리글자어에 대한 대문자 표시 규칙

✔ 머리글자어(DB, XML, IO, HTML)들은 머리글자어의 길이와 파스칼/카멜 방식에 따라 대문자 표시를 다르게 한다.

파스칼 케이스의 경우

✔ 두 글자 머리글자어의 두 문자는 대문자로 표시한다.
✔ 세 개 이상의 문자로 이루어진 머리글자어는 첫 문자만 대문자로 표시한다.

예시: DBRate, XmlWriter

카멜 케이스의 경우

✔ 글자 수에 상관 없이 머리글자어가 첫 단어인 경우 모두 소문자로 표시한다.

예시: xmlStream, dbServerName

✔ 첫 단어로 사용되지 않는 두 글자 머리글자어는 대문자로 표시한다.
✔ 첫 단어로 사용되지 않는 세 개 이상의 문자로 이루어진 머리글자어는 첫 문자만 대문자로 표시한다.

예시: channelID, readerXml

레이아웃 규칙

✔ 기본 코드 편집기 설정(스마트 들여쓰기, 4자 들여쓰기, 탭을 공백으로 저장)을 사용한다.
✔ 각 중괄호가 새 줄에서 시작되는 Allman 스타일 중괄호를 사용한다.
✔ 선언은 한 줄에 하나씩만 작성한다.
✔ 메서드 정의와 속성 정의 간에는 빈 줄을 하나 이상 추가한다.

if ((val1 > val2) && (val1 > val3))
{
    // Take appropriate action.
}

if문

✔ 단일 if 문 사용 시 한 줄 형식을 사용하지 않는다.
✔ 중괄호 사용은 항상 허용되며, 모든 블록의 본문이 한 줄에 있는 경우에만 생략할 수 있다.

public ObservableLinkedList(IEnumerable<T> items)
{
    if (items == null)
        throw new ArgumentNullException(nameof(items));
}

if (handler != null)
{
    handler(this, e);
}

주석 달기 규칙

✔ 코드 줄의 끝이 아닌 별도의 줄에 주석을 배치한다.
✔ 주석 텍스트는 대문자로 시작하고, 끝에는 마침표를 붙인다.
✔ 주석 구분 기호와 텍스트 사이에 공백을 하나 삽입한다.
✔ 별표 블록으로 주석을 묶지 않는다.

// The following declaration creates a query. It does not run
// the query.

예제

using System;

namespace MyExampleNamespace
{
    public class Customer : IDisposable
    {
        private string _customerName;
        public string CustomerName 
        { 
            get 
            { 
                return _customerName; 
            }
            set
            {
                _customerName = value;
                _lastUpdated = DateTime.Now;
            }
        }

        private DateTime _lastUpdated;

        public DateTime LastUpdated
        {
            get
            {
                return _lastUpdated;
            }
            private set
            {
                _lastUpdated = value;
            }
        }

        public void UpdateCustomer(string newName)
        {
            if (!newName.Equals(CustomerName))
            {
                CustomerName = newName;
            }
        }

        public void Dispose()
        {
            //Do nothing
        }
    }
}

📝 참조
.NET 코딩 스타일
Microsoft Learn C# 가이드
Microsoft Learn .NET 클래스 라이브러리 개발을 위한 디자인 지침
위키책 C# 프로그래밍/명명 규칙

Categories:

댓글남기기