C# WPF密码箱&;SecureString:Can';t MakeReadOnly()?
是否可以将C# WPF密码箱&;SecureString:Can';t MakeReadOnly()?,c#,.net,wpf,passwordbox,securestring,C#,.net,Wpf,Passwordbox,Securestring,是否可以将PasswordBox.SecurePassword标记为ReadOnly 考虑以下简单代码: XAML: C#: 它将输出False。为什么? 编辑:为了确保这一点,我尝试了这个方法,结果它输出了预期的“True” private void Button_Click(object sender, RoutedEventArgs e) { SecureString s = new SecureString(); s.MakeReadOnly(); Conso
PasswordBox.SecurePassword
标记为ReadOnly
考虑以下简单代码:
XAML:
C#:
它将输出False
。为什么?
编辑:为了确保这一点,我尝试了这个方法,结果它输出了预期的“True”
private void Button_Click(object sender, RoutedEventArgs e)
{
SecureString s = new SecureString();
s.MakeReadOnly();
Console.WriteLine(s.IsReadOnly());
}
pBox.SecurePassword
将在每次读取属性时返回一个新的安全字符串实例。您可以通过多次调用pBox.SecurePassword
上的GetHashCode
对其进行验证
您还会注意到,使用Visual Studio“Make object id”不会显示#X,因为每次鼠标悬停时它都是一个新实例
在本地变量中创建对
SecureString
对象的引用时,它与您调用的MakeReadOnly()
打开的实例相同,因此它的行为符合预期。pBox。每次读取属性时,SecurePassword
将返回一个新的SecureString实例。您可以通过多次调用pBox.SecurePassword
上的GetHashCode
对其进行验证
private void Button_Click(object sender, RoutedEventArgs e)
{
SecureString s = new SecureString();
s.MakeReadOnly();
Console.WriteLine(s.IsReadOnly());
}
您还会注意到,使用Visual Studio“Make object id”不会显示#X,因为每次鼠标悬停时它都是一个新实例
在本地变量中创建对
SecureString
对象的引用时,它与您调用的MakeReadOnly()
打开的实例相同,因此它的行为与预期一致。谢谢,这很好地解释了这一点。您知道为什么它被设计为返回SecureString的副本吗?一个额外的安全层?我认为既然SecurePassword
是只读的,他们真的希望它是只读的,所以既然SecureString
是一种引用类型,人们可以操纵该实例,所以它不会在不可变对象(比如System.String
是)的情况下被只读。谢谢,这很好地解释了这一点。您知道为什么它被设计为返回SecureString的副本吗?一个额外的安全层?我认为既然SecurePassword
是只读的,他们真的希望它是只读的,所以既然SecureString
是一种引用类型,我们就可以操纵该实例,这样它就不会在不可变对象(比如System.String
是)的情况下是只读的。
private void Button_Click(object sender, RoutedEventArgs e)
{
SecureString s = new SecureString();
s.MakeReadOnly();
Console.WriteLine(s.IsReadOnly());
}