++ 在 VB.NET 中做什么(如果有的话)?
What (if anything) does ++ do in VB.NET?
我是 Visual Basic 的新手(我的背景主要是 C#)所以我最近才发现 ++i
与 VB.NET 中的 i+=1
不同。但是,当我将 ++i
作为参数传递时,我的 VB.NET 代码仍然可以编译,即使它没有增加变量:
++i 'doesn't compile
i++ 'doesn't compile
Foobar(i++) 'doesn't compile
Foobar(++i) 'compiles, but doesn't increment i
上面最后一条语句没有导致错误的事实让我想知道 ++
是否确实在 VB.NET 中确实意味着什么,只是不是我一开始认为的意思。如果没有,是否有其他原因没有导致错误?
VB 中没有 ++
运算符。 +
一元运算符就像应用于数字的 -
一元运算符。默认情况下,数字是正数,但是,正如您可以通过在数字前面加上 -
运算符来显式地使它为负数一样,您可以通过在它前面加上 +
运算符来使它显式地为正数。您可以根据需要使用任意数量的 +
运算符。同样,您可以使用任意数量的 -
运算符。不同之处在于 +
运算符不会更改 -
运算符所做的值。
在基于 C 的语言中,赋值实际上 return 一个在 VB 中没有的值。在 C# 中,您可以这样做:
i += 1
它将获得 i
的值,将其加 1,将结果分配回 i
然后 return 该结果,因此您可以在其中使用该表达式期望值。在 VB 中,它在赋值之前执行所有相同的操作,但它没有 return 值,因此您不能在需要值的地方使用该表达式。
在基于 C 的语言中,放置 ++
运算符的位置会有所不同。表达式:
++i
增加 i
和 returns 最终值,而这个表达式:
i++
增加 i
和 return 原始值。这就是为什么有些人认为 C++ 语言实际上应该命名为 ++C。
它只是应用了两次 +
运算符(参见 docs)的一元版本。
Foobar(++i)
Foobar(+(+i))
Foobar(+(+(i)))
' These are all the same
对于数值,一元 +
(即没有第二个操作数的 +
运算符)什么都不做:
If expression2 is absent, the + operator is the unary identity operator for the unchanged value of an expression.
但是,文档中并未完全清楚它将对非数字值执行的操作。文档用 两个 操作数解释了各种情况,这些操作数似乎都不适用于此处。
甚至有一句话听起来可以应用,但如果与一元一起使用,它就不会像它所说的那样+
:
If either Object
expression evaluates to Nothing
or DBNull
, the +
operator treats it as a String
with a value of ""
.
所以你会期望 +Nothing
也给出 ""
,但它给出 0
。事实上,一元 +
似乎将非数字类型转换为 Double
,包括 +
否则意味着连接的字符串(例如 +"1.234"
给出 1.234
,并且 +"Hello"
给出了一个错误,该字符串无法转换为 Double
- 而对于 Option Strict On
,您无论如何都无法隐式转换任何字符串)。它的行为似乎更像是一个二进制 +
,第一个操作数是 0.0
。
您还可以 overload 一元 +
与二进制 +
分开,并赋予它完全不同的含义*。 (或者做相反的事情 - 即使在非数字类型上也不做任何事情,例如 TimeSpan
所做的 - 当一元 +
应用于它时,它再次 returns 原始时间跨度,而不是 Double
.)
*:但这可能不是一个好主意。重载运算符时,其含义应始终直观。
我是 Visual Basic 的新手(我的背景主要是 C#)所以我最近才发现 ++i
与 VB.NET 中的 i+=1
不同。但是,当我将 ++i
作为参数传递时,我的 VB.NET 代码仍然可以编译,即使它没有增加变量:
++i 'doesn't compile
i++ 'doesn't compile
Foobar(i++) 'doesn't compile
Foobar(++i) 'compiles, but doesn't increment i
上面最后一条语句没有导致错误的事实让我想知道 ++
是否确实在 VB.NET 中确实意味着什么,只是不是我一开始认为的意思。如果没有,是否有其他原因没有导致错误?
VB 中没有 ++
运算符。 +
一元运算符就像应用于数字的 -
一元运算符。默认情况下,数字是正数,但是,正如您可以通过在数字前面加上 -
运算符来显式地使它为负数一样,您可以通过在它前面加上 +
运算符来使它显式地为正数。您可以根据需要使用任意数量的 +
运算符。同样,您可以使用任意数量的 -
运算符。不同之处在于 +
运算符不会更改 -
运算符所做的值。
在基于 C 的语言中,赋值实际上 return 一个在 VB 中没有的值。在 C# 中,您可以这样做:
i += 1
它将获得 i
的值,将其加 1,将结果分配回 i
然后 return 该结果,因此您可以在其中使用该表达式期望值。在 VB 中,它在赋值之前执行所有相同的操作,但它没有 return 值,因此您不能在需要值的地方使用该表达式。
在基于 C 的语言中,放置 ++
运算符的位置会有所不同。表达式:
++i
增加 i
和 returns 最终值,而这个表达式:
i++
增加 i
和 return 原始值。这就是为什么有些人认为 C++ 语言实际上应该命名为 ++C。
它只是应用了两次 +
运算符(参见 docs)的一元版本。
Foobar(++i)
Foobar(+(+i))
Foobar(+(+(i)))
' These are all the same
对于数值,一元 +
(即没有第二个操作数的 +
运算符)什么都不做:
If expression2 is absent, the + operator is the unary identity operator for the unchanged value of an expression.
但是,文档中并未完全清楚它将对非数字值执行的操作。文档用 两个 操作数解释了各种情况,这些操作数似乎都不适用于此处。
甚至有一句话听起来可以应用,但如果与一元一起使用,它就不会像它所说的那样+
:
If either
Object
expression evaluates toNothing
orDBNull
, the+
operator treats it as aString
with a value of""
.
所以你会期望 +Nothing
也给出 ""
,但它给出 0
。事实上,一元 +
似乎将非数字类型转换为 Double
,包括 +
否则意味着连接的字符串(例如 +"1.234"
给出 1.234
,并且 +"Hello"
给出了一个错误,该字符串无法转换为 Double
- 而对于 Option Strict On
,您无论如何都无法隐式转换任何字符串)。它的行为似乎更像是一个二进制 +
,第一个操作数是 0.0
。
您还可以 overload 一元 +
与二进制 +
分开,并赋予它完全不同的含义*。 (或者做相反的事情 - 即使在非数字类型上也不做任何事情,例如 TimeSpan
所做的 - 当一元 +
应用于它时,它再次 returns 原始时间跨度,而不是 Double
.)
*:但这可能不是一个好主意。重载运算符时,其含义应始终直观。