vb.net - 형식 - 엑셀 vba const




VB.NET에서 고정 길이 문자열을 선언하는 방법? (7)

VBFixedString 특성을 사용하십시오. here MSDN 정보보기

<VBFixedString(256)>Dim strBuff As String

어떻게 이런 식으로 문자열을 선언합니까 :

Dim strBuff As String * 256

VB.NET에서?


문자열을 사용할 대상에 따라 다릅니다. 파일 입출력에이 파일을 사용하는 경우 바이트 배열을 사용하여 인코딩 문제를 피할 수 있습니다. vb.net에서 256 문자 문자열은 256 바이트 이상일 수 있습니다.

Dim strBuff(256) as byte

인코딩을 사용하여 바이트에서 문자열로 전송할 수 있습니다.

Dim s As String
Dim b(256) As Byte
Dim enc As New System.Text.UTF8Encoding
...
s = enc.GetString(b)

데이터를 수신하는 데 사용해야 할 경우 문자열에 256자를 할당 할 수 있지만 매개 변수 전달은 vb.net에서와 다를 수 있습니다.

s = New String(" ", 256)

또한 vbFixedString을 사용할 수 있습니다. 그러나 이렇게 선언 된 변수에 다른 길이의 문자열을 할당하면 새로운 길이가되기 때문에 이것이 무엇을하는지 확신 할 수 없습니다.

<VBFixedString(6)> Public s As String
s = "1234567890" ' len(s) is now 10

이 VB 6 코드를 작성하려면 :

Dim strBuff As String * 256

VB.Net에서는 다음과 같은 것을 사용할 수 있습니다 :

Dim strBuff(256) As Char

이 객체는 하나의 생성자와 두 개의 속성이있는 구조로 정의 할 수 있습니다.

Public Structure FixedLengthString
     Dim mValue As String
     Dim mSize As Short

     Public Sub New(Size As Integer)
         mSize = Size
         mValue = New String(" ", mSize)
     End Sub

     Public Property Value As String
         Get
             Value = mValue
         End Get

         Set(value As String)
             If value.Length < mSize Then
                 mValue = value & New String(" ", mSize - value.Length)
             Else
                 mValue = value.Substring(0, mSize)
             End If
         End Set
     End Property
 End Structure

https://jdiazo.wordpress.com/2012/01/12/getting-rid-of-vb6-compatibility-references/


이것은 완전히 테스트되지는 않았지만 다음은이 문제를 해결하는 클래스입니다.

''' <summary>
''' Represents a <see cref="String" /> with a minimum
''' and maximum length.
''' </summary>
Public Class BoundedString

    Private mstrValue As String

    ''' <summary>
    ''' The contents of this <see cref="BoundedString" />
    ''' </summary>
    Public Property Value() As String
        Get
            Return mstrValue
        End Get

        Set(value As String)
            If value.Length < MinLength Then
                Throw New ArgumentException(String.Format("Provided string {0} of length {1} contains less " &
                                                          "characters than the minimum allowed length {2}.",
                                                          value, value.Length, MinLength))
            End If

            If value.Length > MaxLength Then
                Throw New ArgumentException(String.Format("Provided string {0} of length {1} contains more " &
                                                          "characters than the maximum allowed length {2}.",
                                                          value, value.Length, MaxLength))
            End If

            If Not AllowNull AndAlso value Is Nothing Then
                Throw New ArgumentNullException(String.Format("Provided string {0} is null, and null values " &
                                                              "are not allowed.", value))
            End If

            mstrValue = value
        End Set
    End Property

    Private mintMinLength As Integer
    ''' <summary>
    ''' The minimum number of characters in this <see cref="BoundedString" />.
    ''' </summary>
    Public Property MinLength() As Integer
        Get
            Return mintMinLength
        End Get

        Private Set(value As Integer)
            mintMinLength = value
        End Set

    End Property

    Private mintMaxLength As Integer
    ''' <summary>
    ''' The maximum number of characters in this <see cref="BoundedString" />.
    ''' </summary>
    Public Property MaxLength As Integer
        Get
            Return mintMaxLength
        End Get

        Private Set(value As Integer)
            mintMaxLength = value
        End Set
    End Property

    Private mblnAllowNull As Boolean
    ''' <summary>
    ''' Whether or not this <see cref="BoundedString" /> can represent a null value.
    ''' </summary>
    Public Property AllowNull As Boolean
        Get
            Return mblnAllowNull
        End Get

        Private Set(value As Boolean)
            mblnAllowNull = value
        End Set
    End Property

    Public Sub New(ByVal strValue As String,
                   ByVal intMaxLength As Integer)
        MinLength = 0
        MaxLength = intMaxLength
        AllowNull = False

        Value = strValue
    End Sub

    Public Sub New(ByVal strValue As String,
                   ByVal intMinLength As Integer,
                   ByVal intMaxLength As Integer)
        MinLength = intMinLength
        MaxLength = intMaxLength
        AllowNull = False

        Value = strValue
    End Sub

    Public Sub New(ByVal strValue As String,
                   ByVal intMinLength As Integer,
                   ByVal intMaxLength As Integer,
                   ByVal blnAllowNull As Boolean)
        MinLength = intMinLength
        MaxLength = intMaxLength
        AllowNull = blnAllowNull

        Value = strValue
    End Sub
End Class

Microsoft.VisualBasic.Compatibility 를 사용할 수 있습니다.

Imports Microsoft.VisualBasic.Compatibility

Dim strBuff As New VB6.FixedLengthString(256)

하지만 64 비트 프로세스 에서는 지원되지 않는 것으로 표시되었으므로 긴 값을 설정하는 경우 잘리고 짧은 값을 입력 할 때는 공백을 사용하여 오른쪽으로 패딩하는 기능을 복제하는 자체 작성하십시오. 또한 위와 같이 "초기화되지 않은"값을 null로 설정합니다.

LinqPad의 샘플 코드 (필자는 Imports Microsoft.VisualBasic.Compatibility 를 허용 할 수 없지만 사용하지 않기로 결정했기 때문에 생각합니다.)

Imports Microsoft.VisualBasic.Compatibility

Dim U As New VB6.FixedLengthString(5)
Dim S As New VB6.FixedLengthString(5, "Test")
Dim L As New VB6.FixedLengthString(5, "Testing")
Dim p0 As Func(Of String, String) = Function(st) """" & st.Replace(ChrW(0), "\0") & """"
p0(U.Value).Dump()
p0(S.Value).Dump()
p0(L.Value).Dump()
U.Value = "Test"
p0(U.Value).Dump()
U.Value = "Testing"
p0(U.Value).Dump()

이 출력은 다음과 같습니다.

"\ 0 \ 0 \ 0 \ 0 \ 0"
"테스트 "
"테티"
"테스트 "
"테티"


Dim a as string

a = ...

If a.length > theLength then

     a = Mid(a, 1, theLength)

End If




vb6-migration