Hero background image

Unity 中 C# 脚本的命名和代码风格提示

为方便起见,此网页已进行机器翻译。我们无法保证翻译内容的准确性或可靠性。如果您对翻译内容的准确性有疑问,请参阅此网页的官方英文版本。

虽然没有一种正确的方法来格式化你的 C# 代码,但在团队中达成一致的风格可以使代码库更清晰、更易读和可扩展。一个组织良好的风格指南可以帮助你控制差异,以产生一个统一的最终产品。本页面提供了在创建自己的风格指南时,命名约定和代码格式化需要牢记的提示和关键考虑事项。

注意:这里分享的建议基于微软提供的建议。最佳的代码风格指南规则是最适合你团队需求的规则。

你可以在 这里 找到代码风格指南示例,或下载完整的电子书, 创建 C# 风格指南:编写可扩展的更清晰的代码.

命名约定

您不能使用名称中带有空格的变量,因为 C# 使用空格字符来分隔标识符。大小写方案可以缓解在源代码中使用复合名称或短语的问题。

以下列出了一些众所周知的命名和大小写约定:

驼峰命名法

也称为驼峰大小写,驼峰命名法 是一种书写短语而不使用空格或标点符号的做法,用一个大写字母分隔单词。第一个字母为小写。

通常,局部变量和方法参数采用驼峰命名法。例如:

examplePlayerController
最大生命值
endOfFile

帕斯卡命名法

帕斯卡命名法是驼峰命名法的一种变体,其中首字母大写。在 Unity 开发中为类和方法名称使用此命名法。公共字段也可以使用帕斯卡命名法。例如:

示例玩家控制器
最大生命值
文件结束

蛇形命名法

在这种情况下,单词之间的空格被替换为下划线字符。例如:

example_player_controller
max_health_points
end_of_file

kebab case

在这里,单词之间的空格被替换为破折号。这些单词然后出现在一种“串”破折号字符上。例如:

示例-玩家-控制器
最大-生命值
文件结束

kebab case 的问题在于许多编程语言将破折号用作减号。此外,一些语言将用破折号分隔的数字解释为日历日期。

匈牙利命名法

变量或函数名称通常指示其意图或类型。例如:

int iCounter
string strPlayerName

匈牙利命名法是一种较旧的约定,在 Unity 开发中不常用。

字段和变量表

字段和变量

考虑这些规则用于您的变量和 字段

  • 使用名词作为变量名称:变量名称应清晰且具有描述性,因为它们代表特定的事物或状态。命名时使用名词,除非变量类型为 bool(见下文)。
  • 用动词作为布尔值的前缀:这些变量表示真或假值。它们通常是问题的答案,例如:玩家在跑吗?游戏结束了吗?
  • 用动词作为前缀,使其含义更加明显。这通常与描述或条件配对,例如:isDead、isWalking、hasDamageMultiplier等。
  • 使用有意义的名称。不要缩写(除非是数学):你的变量名称将揭示它们的意图。选择易于发音和搜索的名称。
  • 虽然单字母变量在循环和数学表达式中是可以的,但在其他情况下不要缩写。清晰度比省略几个元音节省的时间更重要。
  • 对于快速原型设计,你可以暂时使用短的“垃圾”名称,然后再重构为更有意义的名称。
  • 公共字段使用帕斯卡命名法,私有变量使用驼峰命名法:作为公共字段的替代方案,使用带有公共“getter”的属性(见前后部分)。
  • 避免过多的前缀或特殊编码:你可以用下划线(_)作为前缀来区分私有成员变量和局部变量。
  • 或者,使用this关键字在上下文中区分成员变量和局部变量,省略前缀。公共字段和属性通常没有前缀。
  • 一些风格指南为私有成员变量(m_)、常量(k_)或静态变量(s_)使用前缀,以便名称可以一目了然地揭示变量的更多信息。
  • 许多开发者避开这些,而是依赖于编辑器。然而,并非所有的IDE都支持高亮和颜色编码,有些工具根本无法显示丰富的上下文。在决定如何(或是否)将前缀一起应用作为团队时,请考虑这一点。
  • 一致地指定(或省略)访问级别修饰符:如果您省略访问修饰符,编译器将假定访问级别应为私有。这很好用,但在省略默认访问修饰符时要保持一致。
  • 请记住,如果您希望稍后在子类中使用此项,则需要使用protected。

枚举

枚举是由一组命名常量定义的特殊值类型。默认情况下,常量是整数,从零开始计数。

枚举名称和值使用帕斯卡命名法。您可以将公共枚举放在类外以使其全局可用。枚举名称使用单数名词。

注意:带有System.FlagsAttribute标记的按位枚举是此规则的例外。您通常将这些复数化,因为它们表示多于一种类型。

类和接口

命名类和接口时遵循以下标准规则:

类名使用帕斯卡命名法名词:这将使您的类保持组织。

如果您在文件中有一个MonoBehaviour,则源文件名必须匹配:您可能在文件中有其他内部类,但每个文件中只能存在一个MonoBehaviour。

接口名称以大写“I”开头: 接下来用一个形容词来描述功能。

方法

在C#中,每条执行的指令都是在方法的上下文中执行的。

方法执行动作,因此请相应地应用这些规则来命名它们:

以动词开头命名: 如有必要,添加上下文(例如,获取方向查找目标等)。

参数使用驼峰命名法: 将传递给方法的参数格式化为局部变量。

返回布尔值的方法应提问: 与布尔变量本身类似,如果方法返回真或假条件,则用动词作为前缀。这将其表述为一个问题(例如,游戏结束了吗是否开始回合)。

注意:在Unity开发中,“函数”和“方法”这两个术语通常可以互换使用。然而,因为在C#中你不能在不将其纳入类的情况下编写函数,所以“方法”是正确的术语。

事件和事件处理程序

C#中的事件实现了观察者模式。这个软件设计模式定义了一种关系,其中一个对象,即主题(或发布者),可以通知一组称为观察者(或订阅者)的依赖对象。因此,主题可以向其观察者广播状态变化,而不必紧密耦合相关对象。

对于主题和观察者中的事件及其相关方法,存在几种命名方案。尝试以下部分中的实践。

使用动词

用动词短语命名事件。确保选择一个准确传达状态变化的名称。

使用现在分词或过去分词来指示事件的状态是之前还是之后。例如,在打开门之前指定“OpeningDoor”作为事件,在打开门之后指定“DoorOpened”作为事件。

使用 System.Action

使用 System.Action 委托来处理事件。在大多数情况下,Action 委托可以处理游戏所需的事件。

您可以传递多达 16 个不同类型的输入参数,返回类型为 void。使用预定义的委托可以节省代码。

注意:您还可以使用 EventHandlerEventHandler 委托。作为团队达成一致,决定每个人如何实现事件。

方法前缀加上“On”

在事件触发方法(在主题中)前加上“On。”触发事件的主题通常是从一个以“On”开头的方法中调用的(例如,“OnOpeningDoor”或“OnDoorOpened”)。

前缀加上主题名称和下划线

在观察者中,事件处理方法前加上主题的名称和下划线(_)。如果主题名为“GameEvents”,您的观察者可以有一个名为“GameEvents_OpeningDoor”或“GameEvents_DoorOpened”的方法。

为您的团队决定一个一致的命名方案,并在您的风格指南中实施这些规则。

注意:这个“事件处理方法”不应与 EventHandler 委托混淆。

谨慎使用 EventArgs

仅在必要时创建自定义 EventArgs。如果您需要将自定义数据传递给事件,请创建一种新的 EventArgs 类型,继承自 System.EventArgs 或自定义结构。

命名空间

使用 namespaces 确保您的类、接口、枚举等不会与其他命名空间或全局命名空间中已存在的内容冲突。命名空间还可以防止与来自 Unity Asset Store 的第三方资产或其他不会成为项目最终版本的一部分的测试场景发生冲突。

应用命名空间时:

使用 Pascal 大小写,不要使用特殊符号或下划线。

在文件顶部添加一个 using 指令,以避免重复输入命名空间前缀。

也可以创建子命名空间。使用点(.)运算符来分隔名称级别,使您能够将脚本组织成层次类别。例如,您可以创建“ MyApplication.GameFlow”,“ MyApplication.AI”,“ MyApplication.UI”等,以容纳游戏的不同逻辑组件。

前缀

在代码中,这些类分别被称为 敌人.Controller1敌人.Controller2。添加一行 using 来节省输入前缀的时间(例如,using 敌人;)。

当编译器找到类名 Controller1Controller2 时,它会理解您是指 敌人.Controller1敌人.Controller2

如果脚本需要引用来自不同命名空间的同名类,请使用前缀来区分它们。例如,如果您在 Player 命名空间中有 Controller1 和 Controller2 类,您可以写出 Player.Controller1Player.Controller2 以避免任何冲突。否则,编译器将报告错误。

获取更多代码风格提示

了解有关常规格式的更多信息 在这里 或查看 完整电子书。您还可以查看我们的 代码风格指南示例