Решил почистить код, а то поднадоело листать портянку предупреждений которую выдает Visual Studio. Этих Warnings она выдает в количестве аж 912 штук, включая установленных вручную используя #warning и несколько Maximum number of warnings has been exceeded. (Максимальное количество предупреждений для одного проекта - 100). Так что предупреждений реально больше!
Что мне попалось:
Variable declaration without an 'As' clause; type of Object assumed.
Примеры:
Public Shared Function FooRRM(ByVal Id) As String
Dim vFoo
Dim FooDetails(FooThes.RecordCount - 1)
Public Const Empty = Nothing
Решение:
добавить декларативную часть с типом переменной, те:
Public Shared Function FooRRM(ByVal Id As String) As String
Dim vFoo As String = String.Empty
Dim FooDetails(FooThes.RecordCount - 1) As Object
Public Const Empty As Object = Nothing
Function 'Foo' doesn't return a value on all code paths. A null reference exception could occur at run time when the result is used.
Примеры:
Private Function Foo(ByRef vFoo As String) As String
vFoo = InputBox("Введите значение параметра (число)", "", vFoo)
End Function
Private Function Foo(ByVal stFoo As FooState) As String
Select Case stFoo
Case Actual : Return "у"
Case Historical : Return "л"
Case Deleted : Return "а"
End Select
End Function
часто встречается в функциях с Select Case без Case Else части, причем на вход Case поступает Enum значение. Для такого случая можно один из вариантов сделать Case Else.
Для остальных случаев:
- Присвоить значение переменной с именем функции до вызова Exit Function или End Function
- Добавить оператор Return с возвращаемым значением
"Variable 'Foo1' is used before it has been assigned a value"
Примеры:
Dim Foo1, Foo2 As String
Foo2 = "Test"
Foo1 = Foo1 & Foo2 & " or "
Предупреждение возникает как правило в случае использования неинициализированных переменных, либо если инициализация происходит в блоках - try catch finally или Select Case.
Перед использованием значения переменных необходимо инициализировать хотя бы nothing , в случае блока - try catch finally до входа в блок, в случае Select Case сделать один из вариантов Case else.
"Name '__Foo' is not CLS-compliant"
Пример:
Protected Overrides Sub __Foo()
Если имя начинается с одного или нескольких подчеркиваний "_".
Visual Basic Language Concepts - Declared Element NamesElement names starting with an underscore (_) are not part of the Common Language Specification (CLS), so CLS-compliant code cannot use a component that defines such names. However, an underscore in any other position in an element name is CLS-compliant.
Уделение подчеркиваний решает проблему.
Статистика предупреждений по solution:
30% "Variable is used before it has been assigned a value";
13% "Variable is passed by reference before it has been assigned a value.";
11% "Name is not CLS-compliant.";
12% "Access of shared member, constant member, enum member or nested type through an instance; qualifying expression will not be evaluated.";
10% "Function doesn't return a value on all code paths. ";
13% "Operands of type Object used in expressions for , statements; runtime errors could occur.";
Дополнительные материалы:
Больше половины уже заборол, но вот что делать с не CLS-compliant именами ума не приложу, на них уже ссылаются из других (прикладных) сборок.