VB.net字符串反向属性根据Env

时间:2017-04-19 22:35:26

标签: 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]

为什么不同环境中的值会有所不同?

2 个答案:

答案 0 :(得分:1)

首先看一下这行:

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算法,对吗? 右!?

答案 1 :(得分:0)

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

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

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

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