.NET编码规范03-C#命名规范大全 📅 2026/7/8 4:10:43 .NET编码规范第 3 篇命名规范大全 —— 让你的c#代码自文档化前言“There are only two hard things in Computer Science: cache invalidation and naming things.”— Phil Karlton命名是编程中最难的事也是最重要的基本功。一个好的命名让阅读者不需要翻文档就能理解代码意图一个糟糕的命名则可能直接导致线上 Bug。本文系统梳理 C# 命名规范的方方面面从基础的大小写规则到各种前缀后缀约定帮助你建立一套可落地的命名体系。一、两大命名约定PascalCase 与 camelCaseC# 采用两种核心的大小写风格约定规则示例PascalCase帕斯卡每个单词首字母大写StudentService、GetUserById、MaxRetryCountcamelCase驼峰首单词小写其余首字母大写userName、pageIndex、isActive快速判断表代码元素大小写示例类class、记录record、结构体structPascalCaseCustomerRepository接口interfacePascalCase I前缀ICustomerRepository枚举enumPascalCaseOrderStatus枚举成员PascalCaseOrderStatus.Pending公共属性public propertyPascalCaseFirstName公共字段public fieldPascalCaseMaxItems公共方法public methodPascalCaseGetCustomerById私有字段private fieldcamelCase _前缀_customerId私有静态字段camelCase s_前缀s_instanceCount局部变量camelCasecustomerName方法参数camelCaseuserId常量constPascalCase 或 UPPER_SNAKEMaxFileSize/MAX_FILE_SIZE二、前缀约定详解2.1 接口I前缀强制// ✅ 正确publicinterfaceIUserRepository{}publicinterfaceIDisposable{}publicinterfaceIEnumerableT{}// ❌ 错误publicinterfaceUserRepositoryInterface{}// 不要用 Interface 后缀publicinterfaceUserRepository{}// 缺少 I 前缀.editorconfig强制规则dotnet_naming_rule.interface_rule.severity error dotnet_naming_rule.interface_rule.symbols interface_symbols dotnet_naming_rule.interface_rule.style i_prefix_style dotnet_naming_symbols.interface_symbols.applicable_kinds interface dotnet_naming_style.i_prefix_style.required_prefix I dotnet_naming_style.i_prefix_style.capitalization pascal_case2.2 私有字段_前缀建议publicclassOrderService{// ✅ 正确privatereadonlyIOrderRepository_orderRepository;privateint_retryCount;// ❌ 错误privateIOrderRepositoryorderRepository;// 缺少 _privateintm_retryCount;// 不要用匈牙利命名}_前缀的好处一眼区分局部变量和成员变量this._field可以省略this.避免参数名与字段名冲突2.3 静态字段s_前缀建议publicclassConnectionManager{// 静态私有字段privatestaticreadonlyobjects_locknewobject();privatestaticints_activeConnections;// 线程静态字段[ThreadStatic]privatestaticintt_currentCount;}2.4 只读静态字段的命名抉择// 选项 APascalCase微软官方风格publicstaticreadonlyTimeSpanDefaultTimeoutTimeSpan.FromSeconds(30);// 选项 Bs_ 前缀私有privatestaticreadonlyHttpClients_httpClientnew();// 常量全大写下划线分隔publicconstintMAX_RETRY_COUNT3;建议公共字段用 PascalCase私有字段统一s_前缀。三、特殊类型命名约定3.1 抽象类Base后缀或Abstract前缀// ✅ 推荐Base 后缀更自然publicabstractclassRepositoryBase{}publicabstractclassCommandBase{}// ✅ 也可以publicabstractclassAbstractRepository{}// ❌ 不要仅用 Base 作为整个类名publicabstractclassBase{}3.2 异常类Exception后缀// ✅ 正确publicclassUserNotFoundException:Exception{}publicclassValidationException:Exception{}// ❌ 错误publicclassUserNotFound:Exception{}publicclassUserError:Exception{}3.3 测试类Tests后缀// ✅ 正确publicclassOrderServiceTests{}publicclassUserControllerIntegrationTests{}// ❌ 错误publicclassTestOrderService{}publicclassOrderTest{}3.4 枚举命名// ✅ 枚举类型PascalCase单数形式publicenumOrderStatus{Pending,// 成员名PascalCaseProcessing,Shipped,Delivered,Cancelled}// ✅ 位标志枚举复数形式 Flags 特性[Flags]publicenumFilePermissions{None0,Read1,Write2,Execute4,ReadWriteRead|Write}// ❌ 错误publicenumEOrderStatus{}// 不要用 E 前缀C# 不推荐publicenumOrderStatusEnum{}// 不要用 Enum 后缀3.5 泛型参数命名// ✅ 单字母命名约定俗成publicinterfaceIRepositoryTwhereT:class{}publicTResultMapTSource,TResult(TSourcesource);// ✅ 描述性命名多参数时publicinterfaceIRepositoryTEntity,TKeywhereTEntity:classwhereTKey:notnull{}四、方法的命名艺术4.1 动词开头// ✅ 正确 —— 动词清晰表达动作GetUserById(intid)CreateOrder(OrderRequestrequest)UpdateCustomer(CustomerDtodto)DeleteItem(stringitemId)ValidateInput(stringinput)CalculateTotal(IEnumerableOrderLinelines)IsActive()/HasPermission()// ❌ 错误 —— 名词开头歧义User(intid)// 构造函数获取用户转换OrderCreated(...)// 事件方法4.2 异步方法Async后缀// ✅ 正确publicasyncTaskUserGetUserByIdAsync(intid){}publicasyncValueTaskSaveChangesAsync(){}// ❌ 错误publicasyncTaskUserGetUserById(intid){}// 缺少 Async注意如果有async和同步重载共存publicUserGetUserById(intid){}// 同步版本publicTaskUserGetUserByIdAsync(intid){}// 异步版本4.3 布尔返回方法// 模式 1Is 形容词/名词publicboolIsValid{get;}publicboolIsActive{get;}publicboolIsAdministrator{get;}// 模式 2Has 名词publicboolHasPermission(stringpermission){}publicboolHasItems{get;}// 模式 3Can 动词publicboolCanExecute(){}publicboolCanDelete(intid){}// 模式 4动词表示判断类操作publicboolContains(Titem){}publicboolExists(intid){}五、常见命名反模式5.1 匈牙利命名法已过时禁用// ❌ 绝对不要stringstrName;intiCount;boolbIsActive;ListstringlstItems;DateTimedtCreated;// ✅ 现代 C#stringname;intcount;boolisActive;Liststringitems;DateTimecreatedDate;5.2 拼音命名禁止// ❌ 绝对不要stringyongHuMing;// 用户名intshuLiang;// 数量// ✅ 正确stringuserName;intquantity;5.3 缩写泛滥// ❌ 不清晰intcnt;stringaddr;DateTimeregDt;// ✅ 清晰intcount;stringaddress;DateTimeregistrationDate;例外业界公认的缩写可以接受 ——Id、Url、Http、Xml、Json、Sql、Pk主键、Fk外键。5.4 类型信息重复// ❌ 类型信息已在声明中体现stringnameString;intcountInt;ListUseruserList;// ✅ 简洁清晰stringname;intcount;ListUserusers;// 复数表示集合即可5.5 只有否定意义的变量// ❌ 双重否定阅读困难if(!isNotValid){}if(!isDisabled){}// ✅ 正向表达if(isValid){}if(isEnabled){}六、命名空间与程序集命名// 格式Company.Technology.ModulenamespaceAcme.ECommerce.Ordering.Domain;namespaceAcme.ECommerce.Ordering.Infrastructure;namespaceAcme.ECommerce.Ordering.Application;// 或者用 Feature 维度namespaceAcme.ECommerce.Features.Orders;namespaceAcme.ECommerce.Features.Products;七、命名清单速查表代码元素大小写前缀/后缀示例类PascalCase—UserService抽象类PascalCaseBase后缀RepositoryBase接口PascalCaseI前缀IUserRepository枚举类型PascalCase—OrderStatus枚举成员PascalCase—OrderStatus.Pending结构体PascalCase—Point3D记录PascalCase—UserDto公共属性PascalCase—FirstName公共方法PascalCase动词开头GetUserById异步方法PascalCaseAsync后缀GetUserByIdAsync私有字段camelCase_前缀_userName静态私有字段camelCases_前缀s_instance方法参数camelCase—userId局部变量camelCase—userCount常量PascalCase 或 UPPER—MaxRetryCount异常类PascalCaseException后缀UserNotFoundException事件参数PascalCaseEventArgs后缀UserCreatedEventArgs特性类PascalCaseAttribute后缀RequiredAttribute测试类PascalCaseTests后缀UserServiceTests