0

我基本上想做这样的事情

public string Password
{
  set { password = value; }
}

internal string Password
{
  get { return password; }
}

但是不必调用我的第二个函数(上面的代码不会编译,因为我两次使用了名称 Password)。我可以有 setPassword 和 getPassword,但这似乎有点,嗯,垃圾:(

我的场景是我有一个包含核心业务逻辑的单独程序集(类库)。我不希望任何使用类库的项目一旦设置就能够查看密码。

4

6 回答 6

7

它很简单:

public string Password { internal get; set; }

值得注意的是,这是一件不寻常的事情,并且会违反许多人对房产的期望。虽然这是可能的,但最好有一个公共方法 SetPassword和一个内部字段或一个内部GetPassword方法。人们根本不希望遇到他们可以设置但无法获得的属性(即使相反的情况很常见)。这可能是它为数不多的有效用例之一,但为了遵循“最少惊喜”的方法,请考虑使用方法。

于 2013-01-16T18:34:30.977 回答
2

获取和设置可以有不同的访问修饰符:

public string Password {
    internal get { return password; }
    set { password = value; }
}
于 2013-01-16T18:25:03.053 回答
2

我相信你可以这样写:

private string password;
public string Password 
{ 
    internal get 
    { 
       return password; 
    }
    set
    {
        password = value;
    }
}
于 2013-01-16T18:25:33.380 回答
2
string _password;   
public string Password
{
     internal get { return _password; }
     set { _password=value; }
}
于 2013-01-16T18:26:04.437 回答
2

就这么简单:

public String Password
{
    internal get { return m_Password; }
    set { m_Password = value; }
}

这是另一个解决方案:

public string Password
{
    set { m_Password = value; }
}

internal String InternalPassword
{
    get { return m_Password; }
}
于 2013-01-16T18:30:14.190 回答
1

如果您想提高安全意识(就像您看起来那样),那么我建议SecureStringSystem.Security命名空间中。它将字符串的内容加密保存在内存中。

你仍然可以拥有这样的属性:

SecureString password;

public string Password
{
  internal get { return password.ConvertToInsecureString(); }
  set { password = value.ConvertToSecureString();
}

你需要这个扩展方法类:

using System.Runtime.InteropServices; // For Marshal static class
using System.Security;                // For SecureString class

public static class SecureStringExtender
{
  public static SecureString ConvertToSecureString(this string text)
  {
    if (text == null)
      throw new ArgumentNullException("text");

    var secureString = new SecureString();

    foreach(var c in text)
      secureString.AppendChar(c);

    secureString.MakeReadOnly();
    return secureString;
  }

  public static string ConvertToInsecureString(this SecureString secureString)
  {
    if (secureString == null)
      throw new ArgumentNullException("secureString");

    IntPtr unmanagedString = IntPtr.Zero;

    try
    {
      unmanagedString = Marshal.SecureStringToGlobalAllocUnicode(secureString);
      return Marshal.PtrToStringUni(unmanagedString);
    }
    finally
    {
      // Zero out the sensitive text in memory for security purposes.
      Marshal.ZeroFreeGlobalAllocUnicode(unmanagedString);
    }
  }
}
于 2013-01-16T18:45:27.317 回答