空整数值,无需打印任何vb.net

时间:2012-07-25 09:32:58

标签: null integer

我对这种价值存在疑问。

我使用WebServices Classes并且我无法修改,它们就像这样..

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(带有他的五个属性)

如果我只使用两个派对发送,默认情况下字符串值为空(没有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>

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

原始类型(整数等)没有nullNothing)值 - 未分配的整数为0。但是,VB.NET提供Nullable Types,它允许原语为Nothing。创建它们很简单 - 只需在变量声明的末尾添加?

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初始化为0,然后添加5 - 显然,0 + 5 = 5

但是,请注意Integer?

会发生什么
Dim i As Integer?
i += 5
Console.Write(i)

输出什么都没有!根据编译器的配置方式,它将不输出任何内容或无法编译并出现错误。这是因为初始化时,i初始化为Nothing 0Nothing + 5 = Nothing。 如果你希望这个工作,那么在尝试使用它之前,你必须先明确说明i = 0

分配前引用

使用普通Integer,您可以声明它并立即获取其类型:

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

将输出System.Int32(这是在{32}计算机上内部表示Integer的方式)。没问题。但是,使用Integer?尝试相同的问题时会出现更大的问题:

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

崩溃!您的程序会抛出NullReferenceException并死亡。如果我在这里错了,有人可以编辑我,但我相信这是因为Integer?在内部表示为一个对象而不是一个原语 - GetType()试图获取一个对象的类型还没有存在,所以它崩溃了。


除此之外,Nullable Types将解决您遇到的问题。

我应该指出,无论如何,你的班级设计似乎效率很低。考虑编写一个Passenger类或结构,并将上面的代码完全替换为包含Passenger s集合的类:

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