0

私はこの種の値に問題があります。

私は WebServices クラスを使用していますが、変更できません。このようなものです..

Public ClientReference As String

Public Passenger1_Salutation As String
Public Passenger1_FamilyName As String
Public Passenger1_FirstName As String
Public Passenger1_PassengerType As String
Public Passenger1_PassengerAge As Integer

Public Passenger2_Salutation As String
Public Passenger2_FamilyName As String
Public Passenger2_FirstName As String
Public Passenger2_PassengerType As String
Public Passenger2_PassengerAge As Integer

そしてフォローまでPassenger12(彼の5つの属性で)

送信に 2 つの passengers のみを使用する場合、デフォルトでは文字列値は空 (xml タグなし) ですが、値がない場合は整数値であり、0 を出力します。これが私にとっての値です。そして、値が空または0の場合、値がタグを作成しないようにしたくありません。

私のクラスはこれを作成します..

  <ClientReference>9124983</ClientReference>
  <Passenger1_Salutation>MR/S</Passenger1_Salutation>
  <Passenger1_FamilyName>TestAp11</Passenger1_FamilyName>
  <Passenger1_FirstName>Test11</Passenger1_FirstName>
  <Passenger1_PassengerType>AD</Passenger1_PassengerType>
  <Passenger1_PassengerAge>30</Passenger1_PassengerAge>
  <Passenger2_Salutation>MR/S</Passenger2_Salutation>
  <Passenger2_FamilyName>TestAp12</Passenger2_FamilyName>
  <Passenger2_FirstName>Test12</Passenger2_FirstName>
  <Passenger2_PassengerType>CH</Passenger2_PassengerType>
  <Passenger2_PassengerAge>10</Passenger2_PassengerAge>
  <Passenger3_PassengerAge>0</Passenger3_PassengerAge>
  <Passenger4_PassengerAge>0</Passenger4_PassengerAge>
  <Passenger5_PassengerAge>0</Passenger5_PassengerAge>
  <Passenger6_PassengerAge>0</Passenger6_PassengerAge>
  <Passenger7_PassengerAge>0</Passenger7_PassengerAge>
  <Passenger8_PassengerAge>0</Passenger8_PassengerAge>
  <Passenger9_PassengerAge>0</Passenger9_PassengerAge>
  <Passenger10_PassengerAge>0</Passenger10_PassengerAge>
  <Passenger11_PassengerAge>0</Passenger11_PassengerAge>
  <Passenger12_PassengerAge>0</Passenger12_PassengerAge>

しかし、整数属性をxmlにインスタンス化しないようにする方法を知る必要があります(クラスを変更せずに、この属性を文字列として配置できますが、変更することはできません)

  <ClientReference>9124983</ClientReference>
  <Passenger1_Salutation>MR/S</Passenger1_Salutation>
  <Passenger1_FamilyName>TestAp11</Passenger1_FamilyName>
  <Passenger1_FirstName>Test11</Passenger1_FirstName>
  <Passenger1_PassengerType>AD</Passenger1_PassengerType>
  <Passenger1_PassengerAge>30</Passenger1_PassengerAge>
  <Passenger2_Salutation>MR/S</Passenger2_Salutation>
  <Passenger2_FamilyName>TestAp12</Passenger2_FamilyName>
  <Passenger2_FirstName>Test12</Passenger2_FirstName>
  <Passenger2_PassengerType>CH</Passenger2_PassengerType>

誰かが私を助けることができますか?

4

1 に答える 1

0

nullプリミティブ型 (整数など) には( ) 値がありません。Nothing割り当てられていない整数は0です。ただし、VB.NET はNullable Types、プリミティブを にすることができる を提供しますNothing。作成は簡単?です。変数宣言の最後に a を追加するだけです。

Public Passenger1_Salutation As String
Public Passenger1_FamilyName As String
Public Passenger1_FirstName As String
Public Passenger1_PassengerType As String
Public Passenger1_PassengerAge As Integer?

この時点で、値が割り当てられる前の出力は次のとおりです。

Console.WriteLine("Passenger1_PassengerAge: " & Passenger1_PassengerAge)

次のようになります。

Passenger1_PassengerAge: 

ではありません Passenger1_PassengerAge: 0。を安全にテストできるようになりましたPassenger1_PassengerAge Is Nothing

ただし、注意すべき落とし穴がいくつかあります。

値の変更

通常の整数でこれを試した場合:

Dim i As Integer
i += 5
Console.Write(i)

出力は になります5iとして初期化され05追加されます-明らかに、0 + 5 = 5

ただし、次の場合に何が起こるかを見てInteger?ください。

Dim i As Integer?
i += 5
Console.Write(i)

出力は何もありません!コンパイラの構成方法に応じて、何も出力しないか、コンパイルに失敗してエラーが発生します。これは、初期化時に:ではなくiとして初期化されるためです。これを機能させたい場合は、合計で使用する前に、最初にそれを明示的に述べる必要があります。Nothing 0Nothing + 5 = Nothingi = 0

代入前の参照

通常Integerの を使用すると、それを宣言してすぐにその型を取得できます。

Dim i As Integer
Console.Write(i.GetType())

どちらが出力されますSystem.Int32か (これは がInteger32 ビット コンピューターで内部的に表現される方法です)。問題ない。ただし、次のように同じことを試みると、より大きな問題が発生しInteger?ます。

Dim i As Integer?
Console.Write(i.GetType())

クラッシュ!あなたのプログラムは a をスローしNullReferenceExceptionて死にます。ここで間違っている場合は誰かが私を編集できますが、これInteger?は内部的にプリミティブではなくオブジェクトとして表されているためだと思います-GetType()まだ存在しないオブジェクトのタイプを取得しようとしているため、クラッシュします。


それらはさておき、Nullable Typesあなたが抱えている問題を解決します。

とにかく、あなたのクラス設計は非常に非効率的であるように思われることを指摘しておく必要があります。クラスまたは構造体を作成し、上記のコードをs のPassengerコレクションを含むクラスに完全に置き換えることを検討してください。Passenger

Structure Passenger
    Public Passenger_Salutation As String
    Public Passenger_FamilyName As String
    Public Passenger_FirstName As String
    Public Passenger_PassengerType As String
    Public Passenger_PassengerAge As Integer?
End Structure

Class MyClass
    Public Passengers() As Passenger
    'etc
End Class
于 2013-07-23T09:49:18.313 に答える