VB.net 字符串反向属性因环境而异



我正在调试在服务器上运行的应用程序,用户将在另一台服务器上访问该应用程序。该应用程序使用加密,作为密钥的一部分,我正在使用String.Reverse属性。

Dim Mystring As String = "123abc"
Dim reverse = String.Format("{0},{1}", Mystring.Reverse)

当我从一台计算机(RDP/Citrix 环境 ASP.NET 4.6.1)运行时,字符串reverse是不同的。值为:

System.Linq.Enumerable+<ReverseIterator>d__a2`1[System.Char]

相同的字符串,但从另一台计算机运行(RPD 非 Citrix 环境 ASP.NET 4.5.2)。reverse的值为:

System.Linq.Enumerable+<ReverseIterator>d__73`1[System.Char]

为什么不同环境中的值不同?

先看这一行:

Dim reverse = String.Format("{0},{1}", Mystring.Reverse)

具体来说,这个表达式:

Mystring.Reverse

Reverse是一个函数,而不是一个属性,但它缺少括号()。这里的诀窍是String.Format()方法接受基Object类型作为参数,编译器能够将MyString.Reverse表达式视为可转换为对象的委托类型。在输出中看到的值是对该函数委托调用.ToString()的结果。它是函数的类型名称,与MyString对象的值无关。由于该类型是在运行时动态随机生成的,因此您不仅会在不同的平台上看到不同的值,而且在同一台计算机上看到不同的运行。

在 VB6 时代,调用不带括号的方法是正常的。在 .Net 世界中,调用方法时始终使用括号。

你想要的是这个:

Dim reverse As String = String.Format("{0},{1}", Mystring.Reverse())

即使在这里,您也缺少与格式字符串匹配的第二个参数。我怀疑你会得到你期望的结果。

最后,在加密方面,将字符串反转为密钥似乎非常错误。您正在使用System.Security.Cryptography库中的真实 cyrptogrpahic 算法,对吧?右!?

您输出的不是反转String的值,而是用于执行反转的类型的名称。 该类型是动态创建和随机命名的。 这两个名称中的"d"表示"动态","a2"和"73"部分是随机的。

基本上,你认为是一个问题不是问题。 问题是您实际上并没有从反向输出创建String。 你说"String.Reverse财产,但那不是财产。 它是一个方法,它不是String类的成员,而是IEnumerable(Of T)接口上的扩展方法。 您将String视为Char值的可枚举列表并反转。 如果你想要一个String,那么你需要创建一个,即

MyReversedString = New String(Mystring.Reverse().ToArray())

这会将迭代器的内容推送到数组中,然后从该数组创建新的String对象。

最新更新