У меня возникла ситуация, когда мне нужно создать класс DTO, в котором хранится список подпунктов, но количество подпунктов в списке должно быть исправлено. Поскольку это DTO, мне нужно иметь возможность изменять значение каждого элемента в списке, но я не хочу, чтобы потребительский код мог добавлять или удалять элементы из списка.Возможно ли создать свойство массива фиксированной длины
Например, скажем, что мне нужен класс Person
, и мне нужен класс Person
для хранения списка номеров телефонов. Ради примера, давайте просто скажем, что у человека может быть только три телефонных номера. На любом другом языке я просто создаю список как массив, так как массивы на других языках не могут быть изменены. Однако в VB.NET вы всегда можете вызвать ReDim
на любом массиве, даже если вы используете атрибут VBFixedArray
. Так, например, это делает не делать то, что мне нужно:
Public Sub Main()
Dim p As New Person()
p.PhoneNumbers(0) = "555-555-5555"
ReDim Preserve p.PhoneNumbers(5) ' Successfuly changes the size of the array--not good
End Sub
Public Class Person
<VBFixedArray(2)>
Public PhoneNumbers As String() = {"", "", ""}
End Class
Если я пытаюсь использовать IReadOnlyList
, то размер становится фиксированной, но так как и сами предметы. Например, это не будет работать:
Public Sub Main()
Dim p As New Person()
p.PhoneNumbers(0) = "555-555-5555" ' Compile error: Property 'Item' is 'ReadOnly'.
End Sub
Public Class Person
Public ReadOnly Property PhoneNumbers As IReadOnlyList(Of String)
Get
Return _phoneNumbers.AsReadOnly()
End Get
End Property
Private _phoneNumbers As New List(Of String)({"", "", ""})
End Class
Итак, как я могу, в VB.NET, сделать общественную собственность на мой DTO класс, в котором содержится список фиксированной длины элементов, где значение элементы могут быть изменены, но количество элементов не может.
Интересная идея.Я стараюсь избегать параметров по свойствам, поскольку они плохо поддерживаются другими языками, но это хороший момент. Я предполагаю, что другой подход к этому подходу состоял бы в том, что потребительский код не смог бы получить счет, не добавляя для этого другого свойства, хотя обычно это была бы известная константа в этих ситуациях. Спасибо за ввод +1 –