Подтвердить что ты не робот

Руководство по присвоению имен в поле С#?

Я собираюсь работать над небольшим количеством кода С# самостоятельно, но я хочу убедиться, что я следую наиболее широко принятым соглашениям об именах на случай, если я захочу привлечь других разработчиков, выпустить мой код или продать свой код. Прямо сейчас я следую соглашению об именах, которое Microsoft установило, поскольку они кажутся наиболее широко принятыми. Единственная вещь, которую они не упоминают, это названия частных полей. По большей части я видел их имена в CamelCase, как защищенные поля, однако это вызывает у меня проблему, поскольку имена параметров должны быть в camelCase. Возьмите следующий конструктор, например:

public GameItem(string baseName, string prefixName, string suffixName)
{
    //initialize code
}

Теперь, если я использую camelCase для приватных полей, возникает конфликт имен, если только я не использую "this" для доступа к полям класса (что, я думаю, противоречит большинству стандартов, не говоря уже о том, чтобы больше печатать). Одно из решений состоит в том, чтобы дать параметру другое имя, но это не имеет логического смысла давать одинаковые данные двум различным именам. Единственное другое известное мне решение, которое было распространено в кодировании C++, - это дать частным членам подчеркивание в начале (_camelCase). Является ли это решение общепринятым в кодировании С#? Есть ли другое решение этой проблемы (например, использование только свойств (которые используют PascalCase) для доступа к полям, даже в самом классе)?

4b9b3361

Ответ 1

Следуйте Принципы именования Microsoft. Руководства для использования в полевых условиях указывают, что это должен быть camelCase, а не префикс. Обратите внимание, что общее правило не является префиксом; конкретное правило не префикс для различения статических и нестатических полей.

Не применять префикс к именам полей или статическим именам полей. В частности, не применяйте префикс к имени поля, чтобы различать статические и нестатические поля. Например, неправильное применение префикса g_ или s_.

и (из Общие соглашения об именах)

Не используйте символы подчеркивания, дефисы или любые другие неалфанумерные символы.

EDIT. Я хочу отметить, что документы не являются специфическими для частных полей, но указывают, что защищенные поля должны быть только camelCase. Я полагаю, вы могли бы сделать вывод, что любое соглашение для частных полей приемлемо. Конечно, публичные статические поля отличаются от защищенных (они капитализируются). Мое личное мнение состоит в том, что защищенные/частные не настолько различны по своему охвату, чтобы гарантировать разницу в соглашении об именах, тем более, что все, что вам кажется нужно сделать, это отличить их от параметров. То есть, если вы будете следовать рекомендациям для защищенных полей, вам придется рассматривать их по-другому в этом отношении, чем частные поля, чтобы отличать их от параметров. Я использую this при обращении к членам класса в классе, чтобы сделать различие понятным.

РЕДАКТИРОВАТЬ 2

Я принял соглашение, используемое в моем текущем задании, которое предназначено для префикса переменных частного экземпляра с подчеркиванием и, как правило, только открытые защищенные переменные экземпляра в качестве свойств с использованием PascalCase (как правило, autoproperties). Это было не мое личное предпочтение, но это то, с чем мне стало комфортно, и, вероятно, последует, пока что-то лучше не появится.

Ответ 2

_camelCase для полей является общим из того, что я видел (это то, что мы используем на нашем месте, и Microsoft предпочитаем для .NET Framework).

Мое личное обоснование использования этого стандарта состоит в том, что проще набрать _ для идентификации частного поля, чем this.

Например:

void Foo(String a, String b)
{
    _a = a;
    _b = b;
}

Против

void Foo(String a, String b)
{
    this.a = a;
    this.b = b;
}

Я нахожу, что первое гораздо проще вводить, и это мешает мне когда-либо случайно назначать параметр a вместо this.a. Это подкрепляется Code Analysis Правило полезности, которое гласит:

  • CA1500 Имена переменных не должны совпадать с именами полей.

Моя другая причина заключается в том, что this. является необязательным (resharper предлагает удалить их), если он не сталкивается с локальной переменной или именем параметра, зная, какую переменную вы используете более жестко. Если у вас есть _ в начале всех частных полей, вы всегда знаете, что является полем и имеет локальную область.

Ответ 3

Как правило, существуют два широко используемых способа названия полей (всегда с использованием camelCase):

Использование пресета подчёркивания

void F(String someValue) {
  _someValue = someValue;
}

Используя this. для доступа к полю и избежания конфликтов имен

void F(String someValue) {
  this.someValue = someValue;
}

Лично я предпочитаю более позднюю версию, но я буду использовать любое соглашение, указанное организацией, в которой я работаю.

Ответ 4

В нашем магазине мы начали наш первый проект С# с использованием рекомендованного Microsoft руководства для частных членов, т.е.

camelCaseFieldName

Но вскоре мы столкнулись с путаницей между частными членами и параметрами и переключились на

_camelCaseFieldName

который работал намного лучше для нас.

Частный член обычно имеет состояние, которое сохраняется за пределами вызова метода - ведущее подчеркивание имеет тенденцию напоминать вам об этом.

Также обратите внимание, что использование синтаксиса AutoVariable для свойств может свести к минимуму необходимость в частных подписях, т.е.

public int PascalCaseFieldName { get; set;}

Для хорошего краткого набора стандартов, которые (в основном) следуют рекомендациям MS, посмотрите net-naming-conventions-and-programming-standards---best-practices

Ответ 6

Самое главное - выбрать один стандарт и придерживаться его. Ознакомьтесь со стандартом кодирования iDesign С# на IDesign (это ссылка справа). Это отличный документ, который охватывает такие вещи, как рекомендации по именованию. Они рекомендуют использовать верблюд для локальных переменных и аргументов метода.

Ответ 7

Мы используем StyleCop для обеспечения согласованности кода. StyleCop используемый в Microsoft, обеспечивает общий набор лучших практик для макета, удобочитаемости, ремонтопригодности и документации исходного кода С#.

Вы можете запускать StyleCop во время сборки и генерировать предупреждения о нарушениях стиля.

Чтобы ответить на ваш конкретный вопрос, частные поля должны быть в camelCase и с префиксом "this".

Ответ 8

Как уже упоминалось, Microsoft Naming Guidelines не распространяется на частные поля и локальные переменные именования. И вы не найдете согласованности в самой Microsoft. Если вы сгенерируете класс или шаблон Disposable в Visual Studio, он создаст что-то вроде

public MyClass(int value)
{
    this.value = value;
}

или же

private bool disposedValue = false; // To detect redundant calls

protected virtual void Dispose(bool disposing)
{
    if (!disposedValue)
    {
        ...
    }
}

К счастью, все больше и больше кода было открыто Microsoft, поэтому давайте взглянем на их репозитории, например, ASP.NET Core MVC

private readonly IControllerActivator _controllerActivator;
private readonly IControllerPropertyActivator[] _propertyActivators;

Или .NET Core

private T[] _array;

Вы можете сказать, что это на самом деле не Microsoft, а .NET Foundation. Справедливо, давайте взглянем на репозитории Microsoft:

private readonly MetricSeries zeroDimSeries;

Но вот древняя реализация Microsoft MVC

private IActionInvoker _actionInvoker;

Таким образом, не существует какой-либо общепринятой практики или официального руководства в отношении именования частных полей. Просто выберите тот, который вы предпочитаете, и придерживайтесь его.

Ответ 9

Следуя соглашениям об именах в Microsoft, частные поля должны иметь префикс с подчеркиванием.

Например:

private int _myValue;

Удачи!

Ответ 10

Соглашение, которое я использую, чтобы различать переменные частного класса и параметры метода:

private string baseName;
private string prefixName;
private string suffixName;

public GameItem(string baseName, string prefixName, string suffixName)
{
    this.baseName = baseName;
    this.prefixName = prefixName;
    this.suffixName = suffixName;
}

Ответ 11

Краткий ответ: используйте _privateField, т.е. используйте _privateField подчеркивание для приватных полей.

Длинный ответ: здесь идет...

Давным-давно Microsoft раньше предлагала использовать camelCase для полей. Смотрите здесь. Обратите внимание, когда этот документ был создан, 22.10.2008. Довольно древний.

Недавняя кодовая база Microsoft, однако, изображает другую картину.

  1. Взгляните на стиль С# Coding в репозитории gitub.NET CoreFX. № 3 - обсуждаемый вопрос. Вот соответствующая часть

    Мы используем _camelCase для внутренних и частных полей и используем только для readonly где это возможно.

  2. Также взгляните на стиль кодирования в репозитории Roslyn, в котором говорится, что он соответствует соглашениям .NET CoreFX.
  3. Взгляните еще раз на стандартную страницу поддержки .NET, где также сказано (по крайней мере, на данный момент) следовать тому же руководству, что и .NET CoreFX.
  4. CoreCLR также предлагает следовать тому же руководству, что и CoreFX.
  5. Даже репозиторий Winforms говорит об использовании этого же стандарта.
  6. Я думаю, что сказал достаточно. Итак, в заключение, если вы хотите следовать руководству, которое предлагает Microsoft, я думаю, вы знаете, что делать; используйте _privateField подчеркивание для закрытых полей, таких как: _privateField.

Мое мнение: я тоже лично предпочитаю использовать нижнее подчеркивание для моих личных полей - делает его очень легко различимым, не нуждаясь в this.

Ответ 12

Посмотрите на ReSharper. Он будет подчеркивать все места, где ваши имена не подтверждают обычные рекомендации, и вы можете настроить его. Плюс, конечно, есть нагрузки и нагрузки других улучшений производительности.

Ответ 13

Я делаю это; это в значительной степени соответствует MSDN.

class MyClass : MyBaseClass, IMyInterface
{
    public event EventHandler MyEvent;
    int m_MyField = 1;
    int MyProperty {
        get {
            return m_MyField;
        }
        set {
            m_MyField = value;
        }
    }

    void MyMethod(int myParameter) {
        int _MyLocalVaraible = myParameter;
        MyProperty = _MyLocalVaraible;
        MyEvent(this, EventArgs.Empty);
    }
}

Здесь немного больше деталей: http://jerrytech.blogspot.com/2009/09/simple-c-naming-convention.html

Ответ 14

Я сделал гораздо больше с VB, чем с С#, так что я предполагаю перенести некоторые практики (предубеждения?) С первого на второе.

Мне нравится, что частные поля свойств имеют подчеркивание, особенно в С#, из-за чувствительности к регистру (чья это была идея?) И я также префикс module-/общеклассовых переменных с помощью "m" также усиливает их объем.

Если вам это не нравится, вам это не понравится: я обычно использую префиксы типов (кроме полей свойств) - "o" для объекта, "s" для строки, "i" для целого числа и т.д.,

Я не могу защитить это с помощью рецензируемой статьи или чего-то еще, но это работает для нас и означает, что мы не запутались из-за путаницы в регистре или поле/параметр.

Так...

Class MyClass

    Private msClassVariable  As String = ""

    Private _classProperty As Integer = 0
    Property Readonly ClassProperty() As Integer
        Get
            Return _classProperty
        End Get
    End Property

    Sub New()

        Dim bLocalVariable As Boolean = False
        if _classProperty < 0 Then _classProperty = 0
        msClassVariable  = _classProperty.ToString()
        bLocalVariable = _classProperty > 0
    End Sub

End Class

Ответ 15

private string baseName; 
private string prefixName; 
private string suffixName; 

public GameItem(string _baseName, string _prefixName, string _suffixName) 
{ 
    this.baseName = _baseName; 
    this.prefixName = _prefixName; 
    this.suffixName = _suffixName; 
}