2

我对各种转换方法进行了一些研究,并且已经掌握了explicitor的用法implicit operators

注意到这System.Security.SecureString是一个sealed类(它不能被继承),是否可以编写一个explicitimplicit operator能够在 aSystem.Security.SecureString和 a之间执行转换System.String(利用这里描述的方法)。

例如,我知道您必须在要转换的对象的(部分)类中编写operator。因此,我认为最好的方法是继承类,并编写必要的operators.

是否可以 a) 使用 aexplicitimplicit operatorfor aSystem.Security.SecureString执行System.String转换,b) 执行类对象的转换sealed

如果没有,除了使用类方法之外是否还有另一种方法可以执行转换?

假设我是微软产品的消费者,请提供一个务实的答案。

4

2 回答 2

8

注意到这System.Security.SecureString是一个密封类,是否可以编写一个能够在 aSystem.Security.SecureString和 a之间执行转换的显式或隐式运算符System.String

是的,如果您是基类库团队的成员,您可以这样做。当然,这样做是个坏主意。

如果您不是 BCL 团队的成员,那么没有。您需要能够更改两个类之一的源代码。

于 2013-10-01T19:04:41.450 回答
4

正如在其他地方所讨论的那样,对原始问题的简单回答是否定的,不可能将运算符添加到 SecureString 以执行任何操作,因为它是密封的。

“(b)执行一个类被密封的类对象的转换”的答案更复杂。

你可以做的是创建你自己的struct,例如名为 EncryptedString ,它有一个SecureString作为private字段。然后,您可以自由添加任何SecureString<->string转换和比较运算符和方法struct以满足您的需要。严格来说,这并不是执行 [ing] 类对象的转换,而是组成一个新对象type以满足您的需求。俗话说“组合优于继承”(参见http://en.wikipedia.org/wiki/Composition_over_inheritance),所以实际上这种方法既满足您的需求,又被视为 OO 的“最佳实践”。

现在为免责声明:

的全部意义SecureString在于,与 不同string,它是安全的。如果您开始将 a 转换SecureString为 a string(或允许SecureString从 a 创建 a string),您将破坏课程的全部意义。

因此,如果您需要进行比较,请使用Marshal.SecureStringToBSTR()andMarshal.StringToBSTR()将两者转换为BSTR structures,比较它们,擦除内存并释放它,或一些类似的机制,以尽量减少损害SecureStrings.

于 2013-10-02T13:03:01.657 回答