私有方法命名规范

50

我在这里调用了名为_Add的私有方法,是否有一种命名约定可以遵循?虽然这是我的其中一位团队成员建议的,但我不喜欢前导下划线。

public Vector Add(Vector vector) {
    // check vector for null, and compare Length to vector.Length
    return _Add(vector);
}

public static Vector Add(Vector vector1, Vector vector2) {
    // check parameters for null, and compare Lengths
    Vector returnVector = vector1.Clone()
    return returnVector._Add(vector2);
}

private Vector _Add(Vector vector) {
    for (int index = 0; index < Length; index++) {
        this[index] += vector[index];
    }
    return this;
}

1
我认为我的意见不值得写在答案中;然而,由于C#没有定义一种惯例,我认为在方法名前加上“_”是一个很好的选择。C#建议私有数据成员以前缀“_”开头。因此,如果您正在寻求一致性和交流的便利性,前缀“_”有先例可循。 - Thomas
.Net的框架设计准则https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/general-naming-conventions指出:“不要使用下划线、连字符或任何其他非字母数字字符。” - Caltor
2
回答已不再接受,我不太确定原因,可能是因为有一些微软的指南。当然不需要使用它,但微软的指南https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/coding-style/coding-conventions导致了这个 https://github.com/dotnet/runtime/blob/main/docs/coding-guidelines/coding-style.md规则13非常清晰,在示例中可以看到对于私有方法,它们使用PascalCase。所以如果我是你,我会将_Add重命名为AddImplementation或仅使用AddImpl。 - Juan Ignacio Avendaño Huergo
为什么这个私有方法需要存在呢?为什么不把私有方法中的代码放在公共方法中,并从静态方法中调用它呢? - SacredGeometry
13个回答

47

我从未看到过在C#中区分公共和私有方法的编码约定。我不建议这样做,因为我不认为它有什么好处。

如果方法名称与公共方法冲突,那么就要变得更加具体;如果像你的情况一样,它包含了公共方法的实际实现,则一种约定是将其命名为*Impl,例如在你的情况下,命名为AddImpl


此外,大多数集成开发环境都有自动建议功能,可以过滤掉私有方法或将其隐藏。 - kevindaub
4
如果你将一个方法从public改成private或相反,你实际上不希望必须更改该方法的名称,也不应该需要这样做。 - Bazman
17
你没有理解重点...他不能把它命名为“Add”,因为那样会重复。他正在寻找这种情况下的最佳行业实践。 - TheSoftwareJedi
重新思考他的代码。看起来他的结构很差,私有方法甚至没有存在的理由。 - SacredGeometry
@ChrisHalcrow 我们正在谈论方法。与您的断言相反,_和camelCase从未是C#方法的惯例,相反(在某些工具链中甚至可能会创建警告,例如IDE1006)。PascalCase 。而且使用*Impl也是如此,尽管可能没有那么普遍。 - Konrad Rudolph
显示剩余3条评论

34

我通常使用thisCase表示私有方法,使用ThatCase表示公共方法。

private Vector add(Vector vector) {
    for (int index = 0; index < Length; index++) {
        this[index] += vector[index];
    }
    return this;
}

public Vector Add(Vector vector) {
    for (int index = 0; index < Length; index++) {
        this[index] += vector[index];
    }
    return this;
}

1
你知道是否有任何标准约定规定私有方法使用帕斯卡命名法吗? - Ciaran Gallagher
2
@CiaranGallagher 严格来说,所给出的示例是camelCase而不是PascalCase。Visual Studio默认情况下不太喜欢camelCase方法名称,并会给出警告IDE1006,但这可以进行配置。 - Caltor

31

我通常看到并使用"AddCore"或"InnerAdd"


微软也有一个名为InnerAdd的方法。 - nawfal
3
Pascal命名法更为常见,但我更喜欢在私有方法中使用骆驼式命名法,因为当您在代码中读取时,它会告诉您该方法不属于类的表面区域(公共属性、方法和事件)。 - SynBiotik
1
正如我在问题的评论中所解释的那样,这是遵循微软指南最正确的答案。 - Juan Ignacio Avendaño Huergo

15

就方法而言,无论可见性如何,我都采用相同的命名约定。

以下是我的C#命名约定:

  • 命名空间、类型、方法、属性:PascalCase
  • 本地变量:camelCase
  • 方法参数:camelCase
  • 私有字段:_PascalCase前缀带下划线,如果是属性的后备字段,则与属性名称相同,只是前缀为下划线

编辑:请注意,我常常在私有方法中使用前缀名称。我第一次阅读问题时没有注意到这个特定部分。

例如,如果我通过DatabaseCommand类有7种不同的方式来执行SQL语句,如QueryDataTable、QueryEnumerable、QueryEnumerable<T>、QueryDataReader等,则所有这些都想要调用相同的私有方法,我倾向于称此方法为InternalQuery或PrivateQuery。


8
我看到常用的两种变体是这样的:

private Vector DoAdd(Vector vector) { ... }

而且
private Vector AddImpl(Vector vector) { ... }

两者都不是特别令人满意,但这就是我所见过的。

我从来没有见过所有私有方法都应该有前缀的约定 - 光是想想就让我感到恶心!

已经够糟糕了,要处理所有C++开发人员在每个成员前加上"_"的情况 - 我说话的身份是一名曾经使用Delphi的开发人员,曾经在每个成员前都加上"F"。我现在还在恢复中!


我也感到不安。但请注意,我的问题是关于在一些公共方法背后执行工作的私有方法的命名约定。因此,“在这里我调用了"_Add"的私有方法是否有命名约定?”以及所提供的示例代码。 - jason

7

由于公共的Add()方法进行了一些检查,而私有的则没有:

private Vector AddUnchecked(Vector vector) {
    for (int index = 0; index < Length; index++) {
        this[index] += vector[index];
    }
    return this;
}

3

在私有属性中使用前导下划线是很常见的,但我从未见过在方法中这样做。


3

公共方法:

public void Add()
{
}
this.Add()

私有方法:

private void _Add()
{
}
_Add();

属性:

public int Id {get;set;}
this.Id = 10;

字段:

private bool _isUsed;
_isUsed = false;

本地变量:

bool isUsed;

1
这个做法的合理性是什么? - antonijn
5
这里没有理性的解释,只是对我相当方便。 - Y.Yanavichus
在调用私有方法的地方,它也非常方便易读。您无需去定义方法的地方查看其是否为公共或私有。 - blubberdiblub

2

我会选择采纳队友的建议,并将其作为团队惯例。但在这种特殊情况下,看起来你可以避免这种做法:

public Vector Add(Vector vector) {
    // check vector for null, and compare Length to vector.Length
    for (int index = 0; index < Length; index++) {
        this[index] += vector[index];
    }
    return this;
}

public static Vector Add(Vector vector1, Vector vector2) {
    // check parameters for null, and compare Lengths
    Vector returnVector = vector1.Clone()
    return returnVector.Add(vector2);
}

也许我现在这么晚还在SO上看不太好...

1
EPiServer采用“...Internal”的惯例,例如在此情况下的AddInternal()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接