在VB.NET中不对短变量赋值

在VB.NET中不对短变量赋值,vb.net,Vb.net,我下面有一行这样的代码 Private Sub SomeFunction(ByRef SomeShortVariable As Nullable(Of Short)) Dim SomeStringVariable As String = "" 'Let's assume it is "", that's how I am getting it in real time code SomeShortVariable = IIf(SomeStringVariable = "",

我下面有一行这样的代码

Private Sub SomeFunction(ByRef SomeShortVariable As Nullable(Of Short))

    Dim SomeStringVariable As String = "" 'Let's assume it is "", that's how I am getting it in real time code

    SomeShortVariable = IIf(SomeStringVariable = "", Nothing, SomeStringVariable)  'I want to set SomeShortVariable to Nothing but I am getting 0

End Sub
SomeShortVariable变量始终设置为0,即使我希望它为空

我知道Short默认情况下会将变量设置为0

但我怎么能让它一文不值呢。我使用的是.NET2.0。

将SomeShortVariable作为一个短变量

编辑:

此外,您的声明应如下所示:

SomeShortVariable = If(String.IsNullOrEmpty(SomeStringVariable), Nothing, New Nullable(Of Short)(Short.Parse(SomeStringVariable)))
第二次编辑:

如果您使用的是VisualStudio2005,则上述操作将不起作用,因为该操作符仅在VS2008中引入。所以你要做的是:

If String.IsNullOrEmpty(SomeStringVariable) Then
    SomeShortVariable = Nothing
Else
    SomeShortVariable = Short.Parse(SomeStringVariable)
End If

当然,您首先要验证SomeStringVariable是否为数字字符串:

关于您的更新,这是因为它很短,并且在参数中不能为null。把它设为空,你就完成了。虽然我会重构以避免ByRef,但我会使用一个字符串参数SomeStringVariable并返回一个NullableOfShort。然后事情就会变得更有意义了

Private Shared Function SomeFunction(SomeStringVariable As String) _
                                                            As Nullable(Of Short)
  If String.IsNullOrEmpty(SomeStringVariable) Then
    Return Nothing
  Else
    Return Convert.ToInt16(SomeStringVariable)
  End If
End Function

编辑:实际上速记语法在这种情况下不起作用,原因是我在评论中概述了对If的更改。不要使用速记。

在输入字符串可能不是空字符串,而不是用户提供的输入数字的情况下,请注意使用Convert或Parse的建议。通常最好使用TryParse,除非您绝对确定某人没有通过您不期望的内容。考虑以下事项:

Dim someString = "a"
Dim someShort as new Nullable(Of Short) 
Dim tempShort as Short

Console.WriteLine(someShort)

If Integer.TryParse(someString, tempShort) then
    someShort = tempShort
end if 

console.WriteLine(someShort)

if Not String.IsNullOrEmpty(someString) then
    someShort = Short.Parse(someString) ' Throws FormatException
end if

Console.WriteLine(someShort)

最好不要将字符串变量直接放在短字符串中,您应该转换它。对于你的问题,我不确定它是否是在2.0中添加的,但是你可以使用NullableOf Short,如果不存在,则您唯一的选择是使用第二个变量作为标志。是的,它是在2.0中引入的。您的意思是,此代码在子函数/函数中运行,并且变量SomeShortVariable作为参数由调用代码传递?我建议您将子函数转换为函数,并将可为null的值作为返回值。在您的示例中,没有理由将其作为ByRef。@the_lotus…将尝试转换为函数。通常最好使用该函数,以避免不必要的表达式求值。否则+1您的答案中到底发生了什么?如果SomeStringVAriable是空的,那么就不赋值,这在我的代码中不是也发生过吗。我对我的问题做了一些编辑。@Crono1981:这就是我的意思。如果你还没有-应该在任何VB或.NET版本中工作,请检查我的答案。@Neolisk是的,我想我的大脑故意忽略了评论的这一部分。我已经使用If很久了,现在我完全忘记了IIf的行为方式不一样。抢手货当然,考虑到字符串确实表示有效的短值,它现在应该可以完美地工作了。如果你有任何问题,请写在这里,我会尽力帮助你。我已经尝试过了……如果你看到我的更新,我的变量已经可以为空了。Mebbe我在你写这个答案的时候编辑过。@user2322507:上面的帖子有更多的想法。这也是最好的实践来考虑。我不太清楚你对Sub和ByRef是什么意思,但我最好的猜测是你真的想要一个。现在,如果你像你所希望的那样编写你想要的代码,你会得到更少的问题。问题是有一个可以是短值或空值的变量。+1…看起来我需要在调用中初始化new NullableOf Shortfunction@user2322507“SomeStringVariable”到底是从哪里来的?它似乎不是函数的参数,所以我猜它是同一类的成员?@Crono1981,它来自当前函数中的函数。没问题。它要么返回一个整数值,如1,2,3…等等,要么返回我想设置为零但在.Net 2.0中无法执行的值。@user2322507使用NullableShort贯穿,并且根本不传递字符串。VB8不支持nullables的C快捷语法?但它确实支持Nullables。即使是4.5,你也不能设置一个空。您可以将其设置为默认值,但这将是0,而不是零。如果绝对必要,可以将其设置为Short.MinValue,然后与MinValue进行比较,以检查是否没有提供值作为替代值。