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());
}