问题 如何解决类型和对象之间的常见命名冲突?


由于标准c#约定是大写公共属性的第一个字母,因此类型名称的初始大写的旧c ++约定和非类型名称的初始小写不会阻止经典名称冲突,其中最明显的对象名称与类型匹配名称:

class FooManager
{
    public BarManager BarManager { get; set; } // Feels very wrong.
                                               // Recommended naming convention?
    public int DoIt()
    {
         // 1st and 2nd Bar Manager are different symbols 
         return BarManager.Blarb + BarManager.StaticBlarb;                                                                          
    }
}

class BarManager
{
    public        int Blarb { get; set; }
    public static int StaticBlarb { get; set; }
}

它似乎编译,但感觉很错误。是否有推荐的命名约定来避免这种情况?


2466
2018-03-12 18:05


起源

Foo 没有在任何地方定义。我想你的意思 BarManager。 - Adam Robinson
修复。谢谢! - Catskul


答案:


具有完全相同名称的类型和属性并不罕见。是的,它看起来有点奇怪,但是重新命名属性以避免这种冲突看起来甚至更奇怪。

Eric Lippert有 关于这个确切主题的博客文章

但是,编译器没有歧义。


7
2018-03-12 18:11



该博客文章确实指出了为什么在其他语言中它通常是非法的,并且语言本身存在歧义。解决名称冲突并不能解决歧义,因为c#将通过实例调用静态方法,这似乎是c#/。中初始资本约定合理的原因.net我喜欢你的答案,但我认为在博客文章中解决了歧义也应该解决。 - Catskul
@Catskul,唯一会碰撞的是静态属性。并且没有理由使用静态属性。方法不会发生冲突(因为在调用方法时必须使用“()”)。 - Mattias Jakobsson
@Mattias看看那篇博文。它讨论了如果还存在“打印(对象)”,静态“打印(字符串)”如何可能导致问题。 - Catskul


c#约定是以与命名类相同的方式命名属性。你觉得它错的原因是因为你来自不同的背景。但是,如果你使用if一段时间,你会发现它不会给你带来任何问题,当你习惯它时会觉得很自然。没有任何地方会以任何方式碰撞。我(作为一个c#开发人员)觉得属性的初始小写字母的惯例是错误的。你只需要习惯它。


1
2018-03-12 18:11





老实说,我对此很好 - 如果你的静态方法/成员在名称和目的上显然不是静态的,那么你就会遇到比命名冲突更大的问题。


1
2018-03-12 18:13



“如果你的静态方法/成员在名称和目的上显然不是静态的,那么你就会遇到比命名冲突更大的问题。”  我在很大程度上同意这一点,但我认为有100%的时间不存在这种情况。 - Catskul


我不认为它曾经给我带来过一个问题。以下是属性的一般约定。唯一的事情 helpful 可能 getting used 这些....

  • 帕斯卡尔案,没有下划线。
  • 尽量避免使用缩写。
  • 会员必须与案例不同 从不区分大小写可以使用 像Visual Basic .NET这样的语言。

原因:这个惯例是一致的   使用.NET Framework很容易   读。喜欢

public int RecordId

参考: NET编程标准和命名约定

还检查一下: 一般命名约定


1
2018-03-12 18:21





我会说,我不介意碰撞,因为编译器可以解决它。 然而本着提供我所见过的其他解决方案的精神,让其他人自己决定......我认为这是使用My *的丑陋(对我而言)模式出现的地方。

例如:

public class Foo { /* ... */ }

public class Bar
{
    public Foo MyFoo { get; set; }
    // ...
}

0
2018-03-12 18:25