49

比方说,我们有一个变量,我们想要命名Fubar

假设这Fubar是一个String

这意味着,我们将 Fubar 定义为:

public string Fubar;

现在,假设我们想要Fubar一个 getter 和 setter(或者换句话说,成为一个 C# 属性)!

private string Fubar;
public string Fubar_gs
{
    get
    {
        //Some fancy logic
        return Fubar;
    }
    set
    {
        //Some more fancy logic
        Fubar = value;
    }
}

太好了!这一切都很好,花花公子,除了,如果我希望将属性命名为 Fubar,而不是原始变量怎么办?

很明显,我只想重命名这两个变量。但问题是,原始变量的最佳名称是什么?

这种情况有命名约定吗?

4

12 回答 12

138

根据Microsoft 的命名约定,正确的方法是:

private string fubar;
public string Fubar { get { return fubar; } set { fubar = value; } }

但是,许多人更喜欢在私有字段前加上下划线,以帮助在他们打算使用该属性时尽量减少大写错误和使用该字段的可能性,反之亦然。

因此,通常会看到:

private string _fubar;
public string Fubar { get { return _fubar; } set { _fubar = value; } }

你采取的方法最终取决于你。StyleCop 将默认执行前者,而 ReSharper 将执行后者。

在 C# 6 中,有用于声明属性默认值或制作只读属性的新语法,从而减少了对在getandset方法中没有任何特殊附加逻辑的支持字段的属性的需求。你可以简单地写:

public string Fubar { get; set; } = "Default Value";

或者

public string Fubar { get; } = "Read-only Value";

于 2012-08-20T21:54:15.260 回答
8

用下划线作为私有前缀 _fubar

作为一个很好的指南,您可以使用 CLR 运行时团队编码风格指南,它超出了 Microsoft 的标准命名指南

https://github.com/dotnet/runtime/blob/main/docs/coding-guidelines/coding-style.md

于 2012-08-20T21:50:25.910 回答
7

如果您以小写开头命名您的私有变量,您可以右键单击它们并让 VS 为您生成您的 getter/setter 代码;

重构->封装字段...

它将使用 Caps 命名该属性。

于 2012-08-20T21:54:35.760 回答
6

如果 getter/setter 中没有逻辑,请使用自动属性:

public string Fubar {get; set;}

http://msdn.microsoft.com/en-us/library/bb384054.aspx

于 2012-08-20T21:51:56.270 回答
4

不幸的是,没有共同的约定,你必须选择最适合你的情况,我已经在不同的代码库中看到了以下所有方法。

方法一

private string _fubar;   //_camelCase
public string Fubar { ... }

方法二

private string fubar;    //camelCase
public string Fubar{ ... }

方法 3

private string _Fubar;    //_PascalCase
public string Fubar{ ... }

还有一些框架需要很多创造力,比如使用属性并将其记录为成员变量,因此使用成员的样式而不是属性的样式(是的 Unity!我指的是你和你MonoBehaviour.transform的属性/成员)

为了在我们的代码库中消除歧义,我们使用我们自制的规则

  • 尝试使用更恰当的命名,通常在公共属性中使用的成员与其公共对应成员的用途略有不同,因此大多数时候很有可能找到不同且正确的名称,如果不可能,其目的只是保持状态对于公共财产,为什么不将其命名为nameValue呢?
  • 尽可能使用自动属性

通过我们的方法,大多数时候我们避免了对下划线“_”的怀疑,同时拥有更易读的代码。

private string fubarValue; //different name. Make sense 99% of times
public string Fubar { ... } 
于 2017-02-16T11:51:53.260 回答
3

好吧,框架设计指南文档说明了以下内容:

字段名称 字段命名准则适用于静态公共和受保护字段。内部和私有字段不包含在指南中,并且成员设计指南不允许公共或受保护的实例字段。

✓ 请在字段名称中使用 PascalCasing。

✓ DO 使用名词、名词短语或形容词命名字段。

X 不要为字段名称使用前缀。

例如,不要使用“g_”或“s_”来表示静态字段。

所以,对于私有领域,没有官方推荐。但是,如果您对属性使用 VS 2017 快速操作“转换为完整属性”,则会发生这种情况:

VS 2017 快速行动

因此,可以安全地假设在私有字段前加上下划线是有些标准的。

于 2019-01-10T12:56:24.437 回答
2

c#的方式是

private string _fubar;
public string Fubar
{
    get
    {
        return _fubar;
    }
    set
    {
        _fubar = value;
    }
}

但是,如果它只是一个没有额外逻辑的基本 getter/setter,你可以写

public string Fubar { get; set; }

不需要支持变量或任何东西。

于 2012-08-20T21:51:45.007 回答
2

编码标准的好处是有很多可供选择:

选择一个适合您的约定并始终如一地使用它。

Microsoft 约定——pascalCase 私有字段和 CamelCase 属性是整洁的,但可能由于拼写错误而导致错误。我发现前导下划线约定很烦人,因为每次键入名称时它都需要两次额外的击键,但是您并没有那么多错别字(或者至少编译器首先捕获它们)。

于 2012-08-20T23:14:50.790 回答
2

我觉得,一个名字更好:

public string Fubar { get; private set; }
于 2019-09-05T11:47:37.480 回答
1

使用默认值声明的另一种方法

    private string _fubar = "Default Value";
    public string Fubar
    {
        get { return _fubar; }
        set { _fubar = value; }
    }
于 2015-05-21T02:32:09.423 回答
0

虽然大多数开发人员都遵循 Microsoft 的指南,但作为游戏开发人员,我们遵循 Unity 的风格(此处为脚本源代码之一):

static protected Material s_DefaultText = null;
protected bool m_DisableFontTextureRebuiltCallback = false;
public TextGenerator cachedTextGenerator { ... }
于 2019-01-04T06:21:44.137 回答
0

我看到了大量过时的答案(以及代表 C#6 的非标准方法),所以这是 2020 年的答案:

// "fubar" works, too, but "_" prevents CaSe typo mistakes
private string _fubar;
public string Fubar
{
    get => _fubar;
    set => _fubar = value;
}

// Read-only can just use lambda to skip all those shenannigans
public string ReadOnlyFoo => "This is read-only!";
于 2020-03-14T13:48:27.670 回答