0

你们如何避免语言中的关键字冲突?

例如,我正在创建一个类 (VB 2008) 来保存我们生成的一些报告的所有配置变量。自然,变量之一是“日期”。当然,您不能将任何名称与关键字命名相同。在 VB 2008 中,您确实可以选择用 [] 包围一个冲突的词并修复它,但我一直认为这是一种 hack。有什么建议么?你有什么名字可以绕过常见的关键字?

帮助可视化的代码...

Dim m_Title As String

Dim m_Date As String

Public Property Title() As String
    Get
        Return m_Title
    End Get
    Set(ByVal value As String)
        m_Title = value
    End Set
End Property


Public Property [Date]() As String
    Get

    End Get
    Set(ByVal value As String)

    End Set
End Property 
4

9 回答 9

5

可能考虑更具体的变量性质?

从您的示例中,“日期”可以是“创建日期”或“发布日期”或其他任何内容。如果你发现你的变量名太琐碎,你可能会过度简化(甚至混淆)你的代码。通过创建清晰而简洁的变量名称来帮助您的同事。

于 2009-07-17T19:57:56.797 回答
1

不要将[Date]其视为黑客;如果你的属性代表一个日期,它应该被称为Date. 使用可用的工具来完成工作。就我个人而言,我认为拥有它们只是为了解决此类冲突而使用的名称的属性更像是一种 hack,因为您每次使用该属性时都会处理它。

于 2009-07-17T20:00:56.930 回答
1

拼错你的变量名!

于 2009-07-17T20:05:34.923 回答
1

在 .NET 上,将公共语言规范 (CLS) 视为您应该满足的最低公分母是合理的。这记录在 ECMA-335“通用语言基础结构 (CLI) 分区 I 到 VI”中。以下是它对名称的具体说明;CLS 规则 #4 中的注释(8.5.1“有效名称”):

CLS(消费者):不需要使用违反 CLS 规则 4 的类型,但应具有允许访问使用其自己的关键字之一作为名称的命名项目的机制。

所以不,这不是一个真正的黑客,而是一个明确的规则。之所以存在它,是因为 .NET 就针对它的语言而言是可扩展的,因此您永远无法避免名称冲突。如果您涵盖 C#,则有 VB。如果您涵盖 C# 和 VB,则有 C++/CLI。如果你涵盖了所有这些,那就是 F# 和 Delphi Prism。等等。因此,为什么 CLS 要求语言提供一种将其关键字作为标识符转义的方法;并且我列出的所有语言都提供了一些方法(因此是符合 CLS 的消费者)。

一般来说,避免与 C# 或 VB 的非上下文关键字发生冲突仍被认为是一种礼貌,主要是因为这两种语言在很大程度上是最受欢迎的。例如,这就是它的原因HashSet,而不仅仅是Set- 后者是一个 VB 关键字。完整列表如下:

于 2009-07-17T20:10:11.280 回答
0

大多数语言都有一些东西可以避开任何保留字。C# 有@,因此您可以使用@class 作为参数名称(MVC 采用者正在学习的东西)。

如果域声明使用某个词来描述它,那么这就是保留词转义的目的。我不会害怕逃避保留字以使我的模型接近域,即使这意味着更多的输入 - 清晰是值得的!

于 2009-07-17T19:57:48.263 回答
0

为了避免与关键字的命名冲突,我根本不使用关键字。

在你的情况下,日期。什么日期?如果我必须维护您的应用程序,那可能是我要问的第一件事。关键字的好处是它们是完全通用的,变量名不应该是这样的。

于 2009-07-17T19:58:06.873 回答
0

没有灵丹妙药,但现代语言在更好地管理命名空间方面有很大帮助。

index就我而言,我诅咒 C 有一个 ' ' 命令这一事实。

于 2009-07-17T20:07:37.853 回答
0

“日期_”或“_日期”。

于 2009-07-17T20:12:12.727 回答
0

这是 Perl 完全回避的一个问题。

变量总是有一个$%@*&,唯一可能发生冲突的是 Globs/Handles 和子例程。

即使这样也不是什么大问题,因为 Globs/Handles 不再使用太多了。

Perl 中的子例程和关键字非常相似。如果您需要获取内置子例程/关键字,您可以通过附加来获取它CORE::,例如CORE::dump.

真的,我认为您唯一会遇到问题的关键字是sub, my,local和 'our',因为这些关键字在解析器中很早就被解析了。请注意,您仍然可以使用这些名称创建子,但如果不指定全名、来自祝福引用或符号引用,它将无法工作。

{
  package test;
  sub my{  print "'my'  called using $_[-1]\n" };
  sub new{ bless {}, $_[0] };
  sub sub{ print "'sub' called using $_[-1]\n" };

  sub symbolic{
    *{__PACKAGE__.'::'.$_[1]}{CODE}->('symbolic reference');
  }

  my $var; # notice this doesn't call test::my()
}

package main;
my $test = test->new;

# Called from a blessed reference
$test->my('blessed reference');
$test->sub('blessed reference');

print "\n";

# Called using the full name
test::my('full name');
test::sub('full name');

print "\n";

# Called using a symbolic reference
$test->symbolic('my');
$test->symbolic('sub');

输出:

'my' 使用祝福引用调用
使用祝福引用调用“子”

'my' 使用全名调用
'sub' 使用全名调用

'my' 使用符号引用调用
'sub' 使用符号引用调用
于 2009-07-19T23:29:08.177 回答