对于属性中使用的变量,是否有任何C#命名约定?

时间:2012-08-20 21:49:30

标签: c# properties

假设我们有一个变量,我们希望将其命名为Fubar

假设FubarString

这意味着,我们将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;
    }
}

太好了!这一切都很好,花花公子,除了我想将PROPERTY命名为Fubar,而不是原始变量怎么办?

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

这种情况是否有命名惯例?

12 个答案:

答案 0 :(得分:122)

Microsoft's naming conventions,正确的方法是:

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中,有一种新语法可用于声明属性的默认值或创建只读属性,从而减少了对getset和{中没有任何特殊附加逻辑的支持字段的属性的需求{1}}方法。你可以简单地写一下:

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

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

答案 1 :(得分:9)

在私人网址前加上下划线_Fubar

答案 2 :(得分:6)

如果getter / setter中没有逻辑,请使用auto-property:

public string Fubar {get; set;}

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

答案 3 :(得分:6)

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

Refactor-> Enacpsulate Field ...

它将使用Caps命名该属性。

答案 4 :(得分:2)

编码标准的好处在于有很多选择:

选择一个适合您的惯例并一致地使用它。

Microsoft约定 - pascalCase私有字段和CamelCase属性很整洁,但由于拼写错误可能导致错误。我发现领先的下划线约定令人讨厌,因为每次键入名称时它需要两个额外的键击,但是你没有得到这么多的错别字(或者至少编译器首先捕获它们)。

答案 5 :(得分:2)

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

方法1

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

方法2

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

方法3

MonoBehaviour.transform

还有一些框架需要很多创造力,比如使用属性并将其记录为成员变量,因此使用成员的样式而不是属性'造型(是的Unity!我指着你和你的private string fubarValue; //different name. Make sense 99% of times public string Fubar { ... } 的财产/成员)

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

  • 尝试使用更合适的命名,通常在公共财产中使用的成员与公共财产的目的略有不同,因此很可能大多数时候找到不同的名称,如果不可能,其目的是只是持有公共财产的状态,为什么不命名呢 nameValue
  • 尽可能使用autoproperties

我们的方法大部分时间都避免了对下划线的怀疑" _"同时具有更易读的代码。

player

答案 6 :(得分:2)

好吧,Framework Design Guidelines文档指出:

  

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

     

✓务必在字段名称中使用PascalCasing。

     

✓使用名词,名词短语或形容词来命名字段。

     

X请勿为字段名称使用前缀。

     

例如,请勿使用“ g_”或“ s_”表示静态字段。

因此,对于私有领域,没有官方建议。但是,如果在属性上使用VS 2017快速操作“转换为完整属性”,则会发生这种情况:

VS 2017 quick action "Convert to full property"

因此,可以安全地假设在 private 字段下加下划线是某种标准。

答案 7 :(得分:1)

c#方式是

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

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

public string Fubar { get; set; }

无需支持变量或其他任何内容。

答案 8 :(得分:1)

使用默认值

声明的另一种方法
    private string _fubar = "Default Value";
    public string Fubar
    {
        get { return _fubar; }
        set { _fubar = value; }
    }

答案 9 :(得分:0)

尽管大多数开发人员遵循Microsoft的准则,但作为游戏开发人员,我们遵循Unity的风格({one of the script source code here):

static protected Material s_DefaultText = null;
protected bool m_DisableFontTextureRebuiltCallback = false;
public TextGenerator cachedTextGenerator { ... }

答案 10 :(得分:0)

我的意思是,一个名字更好:

public string Fubar { get; private set; }

答案 11 :(得分: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!";