Loading...
Loading...
.NET/C#의 코딩 규약, 명명 규칙, 레이아웃, C# 12/13/14의 최신 기능 활용 가이드라인을 정의합니다. C#/.NET 코드 작성 시, 클래스·메서드 명명 시, 코드 포맷팅 시, 또는 사용자가 코딩 규약, 명명 규칙, C# 모범 사례, Primary Constructors, Collection Expressions, field 키워드에 대해 언급했을 때 사용합니다.
npx skill4agent add icartsh/icartsh_plugin coding-conventions_fieldpublic class Person(string name, int age)
{
public string Name => name;
public int Age => age;
public void Display()
{
Console.WriteLine($"{name} is {age} years old");
}
}public class Person
{
private string name;
private int age;
public Person(string name, int age)
{
this.name = name;
this.age = age;
}
public string Name => name;
public int Age => age;
}int[] array = [1, 2, 3, 4, 5];
List<string> list = ["one", "two", "three"];
int[] row0 = [1, 2, 3];
int[] row1 = [4, 5, 6];
// 스프레드 연산자로 결합
int[] combined = [..row0, ..row1];var incrementBy = (int source, int increment = 1) => source + increment;
Console.WriteLine(incrementBy(5));
Console.WriteLine(incrementBy(5, 3));using Point = (int x, int y);
using ProductList = System.Collections.Generic.List<(string Name, decimal Price)>;
Point origin = (0, 0);
ProductList products = [("Product1", 100m), ("Product2", 200m)];paramsList<T>Span<T>ReadOnlySpan<T>IEnumerable<T>public void ProcessItems(params List<string> items)
{
foreach (var item in items)
{
Console.WriteLine(item);
}
}
// 메모리 효율이 중요한 경우
public void ProcessData(params ReadOnlySpan<int> data)
{
foreach (var value in data)
{
Process(value);
}
}System.Threading.LockMonitorprivate readonly Lock lockObject = new();
public void UpdateData()
{
lock (lockObject)
{
// Critical section
}
}// 기존 object 기반 락 (C# 13에서는 권장되지 않음)
private readonly object lockObject = new();
public void UpdateData()
{
lock (lockObject)
{
// Critical section
}
}// 정의 부분
public partial class DataModel
{
public partial string Name { get; set; }
}
// 구현 부분
public partial class DataModel
{
private string name;
public partial string Name
{
get => name;
set => name = value ?? throw new ArgumentNullException(nameof(value));
}
}^var countdown = new TimerBuffer
{
buffer =
{
[^1] = 0,
[^2] = 1,
[^3] = 2
}
};ref structref structallows ref structpublic ref struct SpanWrapper<T> : IEnumerable<T>
{
private Span<T> span;
public IEnumerator<T> GetEnumerator()
{
foreach (var item in span)
{
yield return item;
}
}
}extension<TSource>(IEnumerable<TSource> source)
{
public bool IsEmpty => !source.Any();
public int Count => source.Count();
}field// C# 14의 field 키워드 사용
public string Name
{
get;
set => field = value ?? throw new ArgumentNullException(nameof(value));
}
// 어쩔 수 없이 명시적인 backing field가 필요한 경우에도 언더스코어 없음
private string name;
public string Name
{
get => name;
set => name = value ?? throw new ArgumentNullException(nameof(value));
}// 언더스코어 접두사는 절대 금지
private string _name;
public string Name
{
get => _name;
set => _name = value ?? throw new ArgumentNullException(nameof(value));
}?.customer?.Order = GetCurrentOrder();if (customer != null)
{
customer.Order = GetCurrentOrder();
}Span<T>ReadOnlySpan<T>public class CustomerOrder
{
public string OrderId { get; set; }
public void ProcessOrder() { }
}public class OrderProcessor
{
// 언더스코어 없음
private string customerName;
// 언더스코어 없음
private int orderCount;
public void ProcessOrder(string orderId)
{
var customerName = GetCustomerName(orderId);
string processedResult = Process(customerName);
}
}public class OrderProcessor
{
// 언더스코어 접두사는 절대 금지
private string _customerName;
// 언더스코어 접두사는 절대 금지
private int _orderCount;
}Ipublic interface IOrderProcessor
{
void Process(Order order);
}Tpublic class Repository<TEntity> where TEntity : class
{
public void Add(TEntity entity) { }
}public void ProcessOrder(Order order)
{
if (order != null)
{
order.Process();
}
}
// 1행이라도 중괄호를 사용함
if (isValid)
{
Execute();
}
for (int i = 0; i < 10; i++)
{
Process(i);
}// 중괄호 생략 금지
if (isValid)
Execute();
// 중괄호 생략 금지
for (int i = 0; i < 10; i++)
Process(i);
// 중괄호 생략 금지
if (order != null) order.Process();public class Order
{
public string OrderId { get; set; }
public void Process()
{
var result = Validate();
Execute(result);
}
private bool Validate()
{
return OrderId != null;
}
}namespace YourProject.Orders;
public class OrderProcessor
{
// Implementation
}namespace YourProject.Orders
{
public class OrderProcessor
{
// Implementation
}
}using System;
using System.Collections.Generic;
using System.Linq;
namespace YourProject.Orders;stringintboolSystem.StringSystem.Int32string name = "John";
int count = 10;
bool isValid = true;String name = "John";
Int32 count = 10;
Boolean isValid = true;var// 명백함
var orders = new List<Order>();
// 명백함
var customer = GetCustomer();
// 기본 타입은 명시
int count = 10;
// 기본 타입은 명시
string name = "John";// 기본 타입에서 var는 피함
var count = 10;
// 기본 타입에서 var는 피함
var name = "John";string message = $"Order {orderId} processed successfully";string message = "Order " + orderId + " processed successfully";StringBuildervar builder = new StringBuilder();
for (int i = 0; i < 1000; i++)
{
builder.Append($"Line {i}\n");
}string json = """
{
"name": "John",
"age": 30
}
""";var customer = new Customer
{
Name = "John",
Email = "john@example.com"
};System.Exceptiontry
{
ProcessOrder(order);
}
catch (ArgumentNullException ex)
{
Logger.Error("Order is null", ex);
}try
{
ProcessOrder(order);
}
catch (Exception ex) // 너무 일반적임
{
Logger.Error("Error", ex);
}usingusing var connection = new SqlConnection(connectionString);
connection.Open();
// ProcessSqlConnection connection = null;
try
{
connection = new SqlConnection(connectionString);
connection.Open();
// Process
}
finally
{
connection?.Dispose();
}var activeCustomers = from customer in customers
where customer.IsActive
select customer;wherevar result = customers
.Where(c => c.IsActive)
.Select(c => c.Name)
.ToList();var query = from customer in customers
where customer.IsActive
select customer;button.Click += (s, e) => ProcessClick();TryParse<int> parse = (text, out result) => int.TryParse(text, out result);//// 고객 주문을 처리함
ProcessOrder(order);
var processor = new OrderProcessor();
// 주문을 실행함
var result = processor.ProcessOrder(order);ProcessOrder(order); // 고객 주문을 처리함 (코드와 같은 행은 금지)
var processor = new OrderProcessor();
// 이 행의 앞에 빈 행이 없음 (나쁜 예)
var result = processor.ProcessOrder(order);/// <summary>
/// 지정된 주문을 처리함
/// </summary>
/// <param name="order">처리할 주문</param>
/// <returns>처리 결과</returns>
public bool ProcessOrder(Order order)
{
// Implementation
}var result = OrderProcessor.ProcessOrder(order);var processor = new OrderProcessor();
// 정적 메서드를 인스턴스를 통해 호출하는 것은 오해의 소지가 있음
var result = processor.ProcessOrder(order);fieldstringintvarusing