【问题标题】:Objective-C: using _ (underscores) in naming variables [duplicate]Objective-C:在命名变量中使用_(下划线)[重复]
【发布时间】:2011-10-16 16:48:32
【问题描述】:

可能重复:
Prefixing property names with an underscore in Objective C

在我正在阅读的 Objective-C 书籍和我看到的一些代码中,有时人们会在变量名中添加下划线。

虽然我意识到这是由于一个既定的惯例,但我想知道:

下划线在变量名之前或之后是否有任何意义? 比如_name, name and name_作为Objective-C程序员,如果有的话,下划线对你来说意味着什么?

【问题讨论】:

标签: objective-c naming-conventions


【解决方案1】:

这很大程度上取决于个人风格和防御性编程。但这是我个人使用并且看到人们使用前缀的主要原因。

这是为了让你的意图更清楚,你是直接访问 ivar 还是使用 getter/setter。

如果我有:

@property (nonatomic, retain) NSArray *people;

和:

@synthesize people = _people;

这将编译并生成 getter/setter 声明,如下所示:

- (void)setPeople:(NSArray *)people;
- (NSArray *)people;

现在直接访问我需要使用的 ivar:

_people

要使用 getter/setter,我可以使用点表示法或 getter/setter,例如:

[self people];
// or
self.people; // which compiles to [self people];

// and
[self setPeople:newPeople];
// or
self.people = newPeople; // which compiles to [self setPeople:newPeople];

现在在我的代码中,如果我不小心输入了:

people = newPeople; // will not compile

它不会编译,因为我没有使用 getter/setter 并且没有名为 people 的 ivar,它应该是 _people

【讨论】:

    【解决方案2】:

    单前导下划线是 Apple 内部编码约定,他们这样做是为了避免符号与您的符号冲突。不幸的是,Apple 在发布遵循这种习惯的代码示例方面一直很草率,所以很多 Apple 以外的人都认为这是一件好事。

    如果您想在您的 ivar 和方法名称上使用前缀,请使用 除了单个前导下划线之外的任何内容。

    【讨论】:

      【解决方案3】:

      如果您确实使用了此类变量名称,则绝对不应使用以下划线开头后跟大写字母的任何名称。 C 标准保留所有此类标识符以供任何使用(第 7.1.3 节):

      以下划线和大写字母或另一个下划线开头的所有标识符始终保留供任何使用。

      即,C 语言(或给定编译器)的未来版本可能会使用任何此类标识符作为关键字或库函数名称,这可能会破坏您的程序。鉴于此,我宁愿根本不使用以下划线前缀的名称。您可能知道在下划线后不要使用大写字母,但这并不能阻止新人加入并这样做。

      此外,以下划线开头的所有标识符在文件范围内保留;另一个需要提防的问题。

      【讨论】:

        【解决方案4】:

        下划线表示私有,我的人员不使用它我自己的 ivars,因为您始终可以使用 @private 并且您可以将 ivar 添加到 .m 文件中的接口扩展名,甚至是代码的 @implementaion 部分,它最近随着属性的出现变得很普遍,因此您可以使用它来保护自己免受意外访问代码中的 ivar 而不是属性,因为编译器可以告诉您错误,在 c 编程中,我经常使用前导的分数为了表明一个函数不是自包含的,它将被另一个函数使用,并且还将在 ivar 的 C++ 中使用它,因为 C++ 不喜欢成员函数和 ivars 具有相同的名称。

        【讨论】:

          【解决方案5】:

          下划线并没有真正的意义,但是当你使用它们时,更难犯像this one这样的错误,但我从未见过有人在结尾使用下划线,只是在开头使用,建议你不要在结束,因为这些东西的含义可能不清楚。

          我并没有真正在我的 Objective-C 代码中添加下划线,但这主要是出于品味而非意义的问题。只需确保不要在名称的中间或末尾添加下划线 :)

          【讨论】:

          • 我确信 Apple 曾经在其核心数据模板中使用下划线后缀,但现在看来它们已更改为双下划线前缀
          • 比较看重口味,有很多苹果提供的教程不使用它们,社区中也没有常见的行为。但是,正如我所指出的,使用下划线可能会使您的代码更安全,并避免像我指出的问题中那样令人讨厌的错误。
          • 对不起,我没有对您的回复发表评论,我只是指出我以前看过它,但即使是苹果公司也已经在他们的最新模板中放弃了这一点,所以就像你说的可能不太清楚。
          • 没有难过的感觉,只是补充答案:)
          • 关于尾随下划线,顺便说一下,SQL spec explicitly promises 永远不要在任何名称或关键字中使用尾随下划线。因此,在您自己的 SQL 标识符(表名、列名等)后面加上下划线可以消除关键字冲突的任何可能性。还有助于清楚地标记嵌入在另一种编程语言中的 SQL 语言文本。
          猜你喜欢
          • 2014-05-19
          • 2011-09-03
          • 2011-03-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-05
          相关资源
          最近更新 更多