Использование символа подчеркивания в именах переменных классов
На одной из наших встреч мы говорили о качестве кода и о том, можно ли использовать "_" в именах переменных классов. Мне казалось, что символ подчеркивания нельзя (не желательно) использовать, оппонент говорил, что можно. Давайте разберемся.
Раздел "Naming" из .NET Coding Guidelines говорит, что не нужно использовать "_" в именах переменных (а для различения локальных переменных и переменных классов использовать this в C# и Me в VB.NET).
Do not use a prefix for member variables (_, m_, s_, etc.). If you want to distinguish between local and member variables you should use “this.” in C# and “Me.” in VB.NET.
Кроме того, использование нижнего подчеркивания приводит к warning на этапе компиляции: "Something is not CLS-compliant".
Если ваш код является CLSCompliant, то его можно использовать также в приложениях, написанных на любых других .NET языках (VB.NET, IronPython и т.д.).
Детальнее:
You can apply the CLSCompliant attribute on an assembly (or a program element) and have the compiler check if your code is CLS (Common Language System) compliant. This means it works properly when consumed by other .NET languages. For example, you can place the following attribute on your .NET AssemblyInfo.cs files:
[assembly: CLSCompliant(true)]
Some of the things the compiler checks:
- Class and member names cannot differ only by case. For example, you can't have one property named Counter and another named counter. This is important for cross-language compatibility since VB .NET isn't case sensitive.
- Overloaded class methods cannot differ only by out or ref parameter designations.
- Publicly exposed members cannot start with an underscore ( _ ).
- Operators can't be overloaded
- Unsigned types can't be part of the public interface of a class
Unfortunately, although you can apply the CLSCompliant attribute in VB .NET, the VB .NET compiler doesn't check for CLS compliance. In VB.NET 2005, this has apparently been fixed.
Таким образом, использовать символ подчеркивания для методов и переменных классов не рекомендуется, но можно использовать их для наименования локальных и private переменных.