2016-01-18 2 views
2

У меня есть введенное пользователем значение для проверки на набор зарезервированных номеров для проверки. Набор зарезервированных номеров никогда не изменяется. Таким образом, будучи программистом C в глубине души, я вытащил зарезервированные числа в массив и добрался до своего бластера const.Как сравнить с коллекцией констант в VB.Net?

Const ReservedAddresses() As Byte = {10, 12, 75} 'I wish... 

Однако досадно VS сообщил мне таким образом:

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

Каким образом следует правильно содержать набор неизменных чисел, через которые в какой-то момент в будущем можно было бы зацикливать или иным образом проверить против?

+5

Язык C * const * имеет очень мало общего с VB.NET Const. Вместо этого используйте Shared ReadOnly. –

+1

FWIW, я предлагаю изменить объявление массива от C-стиля до .NET-стиля: другими словами, поставьте '()' за * тип *, а не переменную. Оба действительны, но не имеют смысла. –

+0

@ KonradRudolph Обычно я был в VB, не уверен, что натолкнулось на меня - мой ум C должен полностью овладеть! : 0 – Toby

ответ

4

Как объясняется в других ответах, Const работает совсем по-другому в .NET и, как правило, не очень полезно.

Вы можете использовать

Private Shared ReadOnly m_ReservedAddresses = {10, 12, 75} 
Public Shared ReadOnly ReservedAddresses As New ReadOnlyCollection(Of Integer)(m_ReservedAddresses) 

Но если честно, я бы, вероятно, просто использовать ReadOnly массив.

+0

Я изменил ответ, первая версия использовала синтаксис [инициализатор коллекции] (https://msdn.microsoft.com/en-us/library/dd293617.aspx), но поскольку для этого требуется метод расширения «Добавить», он, вероятно, не работает с 'ReadOnlyCollection' (я не на Windows, поэтому я не могу проверить). –

3

Константы должны быть характеристической типа (Boolean, Byte, Date, Decimal, Double, Integer, Long, Object, SByte, Short, Single, String, UInteger, ULong или UShort), или Enum, основанный на одном из интегральных типов. (MSDN)

Почему вместо этого только вместо этого?

Public Shared ReadOnly ReservedAddresses() As Byte = { 10, 12, 75 } 

Update: По Вашему неизменного значения требования, IList будет делать трюк:

Public ReadOnly ReservedAddresses As IList(Of Byte) = New List(Of Byte)() From { 10, 12, 75 }.AsReadOnly() 

... но @answer Конрада чище.

+2

Что [не останавливается] (http://imgur.com/x8S8CkS), вы меняете значения, содержащиеся в массиве, и это то, что появляется после OP. –

+0

, который не будет принимать значения в массиве ReadOnly. Это просто означает, что вы можете переназначить весь массив, как в 'ReservedAddresses = {1, 21, 7}' – Plutonix

+0

Так как это не останавливает значения, которые вообще меняются, то la ReservedAddresses (0) = 11' работает без проблем: ( – Toby

1

Это сделать довольно много , что вы хотите, только не совсем, как вы хотите это сделать:

Class ReservedAddresses 
    Public Shared ReadOnly A As Int32 = 10 
    Public Shared ReadOnly B As Int32 = 12 
    Public Shared ReadOnly C As Int32 = 75 
End Class 

В нем отсутствует обертку массива, но содержательные названия, казалось бы яснее, чем ReservedAddresses(0).

+0

Как можно было бы проверить значения? Скажем, у меня есть значение 'x' Мне нужно что-то вроде' If x <> .A AndAlso x <> .B AndAlso .. .', что не лучше, чем просто использовать числа непосредственно как литералы, нет? – Toby

+1

Исправить, за исключением того, что они будут сгруппированы вместе со значимым именем (мало чем отличается от Enum). В 'ReservedAddress.FooName' vs' ReservedAddressFooName'. Это просто вариант; там нет прямой версии того, что вы хотите. – Plutonix

Смежные вопросы