我基本上想做这样的事情
public string Password
{
set { password = value; }
}
internal string Password
{
get { return password; }
}
但是不必调用我的第二个函数(上面的代码不能编译,因为我使用了密码两次)。我可以使用setPassword和getPassword,但这似乎有点,好吧,垃圾:(
我的场景是我有一个包含核心业务逻辑的独立程序集(类库)。我不希望任何使用类库的项目一旦设置就能够查看密码。
答案 0 :(得分:7)
这很简单:
public string Password { internal get; set; }
值得注意的是,这是一件不寻常的事情,并且会违反很多人对房产的期望。虽然这是可能的,但最好是使用公共方法 SetPassword
以及内部字段或内部GetPassword
方法。人们根本不希望遇到他们可以设置但却得不到的财产(尽管反过来很常见)。这可能是为数不多的有效用例之一,但只要遵循“最少惊喜”方法,请考虑使用方法。
答案 1 :(得分:2)
获取和设置可以有不同的访问修饰符:
public string Password {
internal get { return password; }
set { password = value; }
}
答案 2 :(得分:2)
我相信你可以写下这个:
private string password;
public string Password
{
internal get
{
return password;
}
set
{
password = value;
}
}
答案 3 :(得分:2)
string _password;
public string Password
{
internal get { return _password; }
set { _password=value; }
}
答案 4 :(得分: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; }
}
答案 5 :(得分:1)
如果你想要保持安全意识(就像你看起来那样),那么我建议在SecureString
命名空间中System.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);
}
}
}