44

是否有命名我在_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;
}
4

13 回答 13

35

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

如果方法名称与公共方法冲突,是时候变得更具描述性了;如果像您的情况一样,它包含公共方法的实际方法实现,则一种约定是调用它*Impl。即AddImpl在你的情况下。

于 2008-12-20T23:04:32.647 回答
33

我通常将 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;
}
于 2008-12-20T23:16:43.497 回答
31

我通常会看到并使用“AddCore”或“InnerAdd”

于 2008-12-20T23:22:55.433 回答
15

就个人而言,对于方法,无论可见性如何,我都有相同的命名约定。

这些是我对 C# 的命名约定:

  • 命名空间、类型、方法、属性:PascalCase
  • 局部变量:camelCase
  • 方法的参数:camelCase
  • 私有字段:带有下划线前缀的_PascalCase,如果是属性的支持字段,则与仅带有下划线前缀的属性同名

编辑:注意,我为私有方法使用前缀名称而感到内疚。我第一次阅读时没有抓住你问题的那个特定部分。

例如,如果我有 7 种不同的方式通过我的 DatabaseCommand 类执行我的 SQL 语句,例如 QueryDataTable、QueryEnumerable、、QueryEnumerable<T>QueryDataReader 等。那么所有这些都想调用相同的私有方法,我倾向于调用这个方法 InternalQuery或私人查询。

于 2008-12-20T23:11:01.107 回答
6

由于公共 Add() 做了一些检查,而私人没有:

private Vector AddUnchecked(Vector vector) {
    for (int index = 0; index < Length; index++) {
        this[index] += vector[index];
    }
    return this;
}
于 2008-12-21T12:04:41.653 回答
6

我见过的常用的两种变体是:

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

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

两者都不是特别令人满意,但它们是我所看到的。

我从未见过所有私有方法都应该有前缀的约定——光是想到它就让我不寒而栗!

与所有在视线中的每个成员都加上“_”前缀的 C++ 开发人员打交道已经够糟糕的了——而且我说的是以前的 Delphi 开发人员,他们过去常常在每个成员前面加上“F”。我还在恢复中!

于 2008-12-22T03:11:33.833 回答
3

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

于 2008-12-20T23:08:43.420 回答
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;
于 2010-10-28T18:32:53.277 回答
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);
}

或者也许我只是不应该这么晚...

于 2008-12-20T23:14:33.797 回答
1

我认为在大多数约定中,私人物品有更多的自由。但是我看到了很多:

private Vector AddCore(Vector vector)

或者

private Vector DoAdd(Vector vector)

但是,我可能会放弃私有 add 方法,而只有一个:

public static Vector Add(Vector vector1, Vector vector2) 
{
    // check if vector1 is null
    Vector returnVector = vector1.Clone()
    return returnVector.Add(vector2);
}

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

也把那些花括号放在正确的位置:-)

于 2008-12-20T23:06:20.180 回答
1

AddInternal()在这种情况下,EPiServer 使用“...内部”的约定。

于 2015-07-07T19:09:00.370 回答
0

使用方法名称进行描述以创建自我解释的代码,不应该有任何冲突,因为您不应该有两个方法做完全相同的事情,因此您应该没有理由需要一个字符来为方法名称添加前缀。

有些人用“m_”前缀私有字段,我没有看到私有方法有任何类似的样式。

于 2008-12-20T23:08:54.743 回答
0

不幸的是,我经常遇到这种约定,并且倾向于使用前导下划线来命名表单上的控件(例如“_txtFirstname”而不仅仅是“txtFirstname”)。从不再推荐使用下划线命名私有变量的做法来看,这似乎是一种奇怪的溢出效应。那,或者程序员只是喜欢使用下划线键,我无法弄清楚。

不要使用这个约定,当你的同事坚持它时,挑战他在网上找到推荐这种做法的东西(任何东西)。

于 2008-12-20T23:54:57.833 回答