内部吸气剂,公共设定者c#

时间:2013-01-16 18:22:23

标签: c# setter public getter internal

我基本上想做这样的事情

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

internal string Password
{
  get { return password; }
}

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

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

6 个答案:

答案 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);
    }
  }
}