我正在调试在服务器上运行的应用程序,用户将访问另一台服务器上的应用程序。该应用程序使用加密,作为密钥的一部分,我使用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]
为什么不同环境中的值会有所不同?
答案 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
对象。