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

如果我只使用两个 passsengers 发送,默认情况下字符串值为空(没有 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 TypesNothing. 创建它们很容易 - 只需?在变量声明的末尾添加一个:

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)

输出将是5. i被初始化为0,然后5被添加 - 显然,0 + 5 = 5

但是,请注意 a 会发生什么Integer?

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

输出什么都没有!根据编译器的配置方式,它要么不输出任何内容,要么编译失败并出现错误。这是因为在初始化时,i被初始化为Nothing,而不是 0: Nothing + 5 = Nothing。如果你想让它起作用,你必须先明确说明,i = 0然后再尝试使用它。

赋值前参考

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

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

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

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

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


除了这些,Nullable Types将解决您遇到的问题。

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

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 回答