
虽然没有一种正确的方法来格式化你的 C# 代码,但在团队中达成一致的风格可以使代码库更清晰、更易读和可扩展。一个组织良好的风格指南可以帮助你控制差异,以产生一个统一的最终产品。本页面提供了在创建自己的风格指南时,命名约定和代码格式化需要牢记的提示和关键考虑事项。
注意:这里分享的建议基于微软提供的建议。最佳的代码风格指南规则是最适合你团队需求的规则。
你可以在 这里 找到代码风格指南示例,或下载完整的电子书, 创建 C# 风格指南:编写可扩展的更清晰的代码.
您不能使用名称中带有空格的变量,因为 C# 使用空格字符来分隔标识符。大小写方案可以缓解在源代码中使用复合名称或短语的问题。
以下列出了一些众所周知的命名和大小写约定:
驼峰命名法
也称为驼峰大小写,驼峰命名法 是一种书写短语而不使用空格或标点符号的做法,用一个大写字母分隔单词。第一个字母为小写。
通常,局部变量和方法参数采用驼峰命名法。例如:
examplePlayerController
最大生命值
endOfFile
帕斯卡命名法
帕斯卡命名法是驼峰命名法的一种变体,其中首字母大写。在 Unity 开发中为类和方法名称使用此命名法。公共字段也可以使用帕斯卡命名法。例如:
示例玩家控制器
最大生命值
文件结束
蛇形命名法
在这种情况下,单词之间的空格被替换为下划线字符。例如:
example_player_controller
max_health_points
end_of_file
kebab case
在这里,单词之间的空格被替换为破折号。这些单词然后出现在一种“串”破折号字符上。例如:
示例-玩家-控制器
最大-生命值
文件结束
kebab case 的问题在于许多编程语言将破折号用作减号。此外,一些语言将用破折号分隔的数字解释为日历日期。
匈牙利命名法
变量或函数名称通常指示其意图或类型。例如:
int iCounter
string strPlayerName
匈牙利命名法是一种较旧的约定,在 Unity 开发中不常用。

考虑这些规则用于您的变量和 字段 :
枚举是由一组命名常量定义的特殊值类型。默认情况下,常量是整数,从零开始计数。
枚举名称和值使用帕斯卡命名法。您可以将公共枚举放在类外以使其全局可用。枚举名称使用单数名词。
注意:带有System.FlagsAttribute标记的按位枚举是此规则的例外。您通常将这些复数化,因为它们表示多于一种类型。
命名类和接口时遵循以下标准规则:
类名使用帕斯卡命名法名词:这将使您的类保持组织。
如果您在文件中有一个MonoBehaviour,则源文件名必须匹配:您可能在文件中有其他内部类,但每个文件中只能存在一个MonoBehaviour。
接口名称以大写“I”开头: 接下来用一个形容词来描述功能。
在C#中,每条执行的指令都是在方法的上下文中执行的。
方法执行动作,因此请相应地应用这些规则来命名它们:
以动词开头命名: 如有必要,添加上下文(例如,获取方向,查找目标等)。
参数使用驼峰命名法: 将传递给方法的参数格式化为局部变量。
返回布尔值的方法应提问: 与布尔变量本身类似,如果方法返回真或假条件,则用动词作为前缀。这将其表述为一个问题(例如,游戏结束了吗,是否开始回合)。
注意:在Unity开发中,“函数”和“方法”这两个术语通常可以互换使用。然而,因为在C#中你不能在不将其纳入类的情况下编写函数,所以“方法”是正确的术语。
C#中的事件实现了观察者模式。这个软件设计模式定义了一种关系,其中一个对象,即主题(或发布者),可以通知一组称为观察者(或订阅者)的依赖对象。因此,主题可以向其观察者广播状态变化,而不必紧密耦合相关对象。
对于主题和观察者中的事件及其相关方法,存在几种命名方案。尝试以下部分中的实践。
用动词短语命名事件。确保选择一个准确传达状态变化的名称。
使用现在分词或过去分词来指示事件的状态是之前还是之后。例如,在打开门之前指定“OpeningDoor”作为事件,在打开门之后指定“DoorOpened”作为事件。
使用 System.Action 委托来处理事件。在大多数情况下,Action 委托可以处理游戏所需的事件。
您可以传递多达 16 个不同类型的输入参数,返回类型为 void。使用预定义的委托可以节省代码。
注意:您还可以使用 EventHandler 或 EventHandler 委托。作为团队达成一致,决定每个人如何实现事件。
在事件触发方法(在主题中)前加上“On。”触发事件的主题通常是从一个以“On”开头的方法中调用的(例如,“OnOpeningDoor”或“OnDoorOpened”)。
在观察者中,事件处理方法前加上主题的名称和下划线(_)。如果主题名为“GameEvents”,您的观察者可以有一个名为“GameEvents_OpeningDoor”或“GameEvents_DoorOpened”的方法。
为您的团队决定一个一致的命名方案,并在您的风格指南中实施这些规则。
注意:这个“事件处理方法”不应与 EventHandler 委托混淆。
仅在必要时创建自定义 EventArgs。如果您需要将自定义数据传递给事件,请创建一种新的 EventArgs 类型,继承自 System.EventArgs 或自定义结构。
使用 namespaces 确保您的类、接口、枚举等不会与其他命名空间或全局命名空间中已存在的内容冲突。命名空间还可以防止与来自 Unity Asset Store 的第三方资产或其他不会成为项目最终版本的一部分的测试场景发生冲突。
应用命名空间时:
使用 Pascal 大小写,不要使用特殊符号或下划线。
在文件顶部添加一个 using 指令,以避免重复输入命名空间前缀。
也可以创建子命名空间。使用点(.)运算符来分隔名称级别,使您能够将脚本组织成层次类别。例如,您可以创建“ MyApplication.GameFlow”,“ MyApplication.AI”,“ MyApplication.UI”等,以容纳游戏的不同逻辑组件。
在代码中,这些类分别被称为 敌人.Controller1 和 敌人.Controller2。添加一行 using 来节省输入前缀的时间(例如,using 敌人;)。
当编译器找到类名 Controller1 和 Controller2 时,它会理解您是指 敌人.Controller1 和 敌人.Controller2。
如果脚本需要引用来自不同命名空间的同名类,请使用前缀来区分它们。例如,如果您在 Player 命名空间中有 Controller1 和 Controller2 类,您可以写出 Player.Controller1 和 Player.Controller2 以避免任何冲突。否则,编译器将报告错误。