0

私は基本的にこのようなことをしたい

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

internal string Password
{
  get { return password; }
}

ただし、2 番目の関数を別の方法で呼び出す必要はありません (Password という名前を 2 回使用したため、上記のコードはコンパイルされません)。setPassword と getPassword を使用することもできますが、それは少し、まあ、ゴミのようです :(

私のシナリオは、コア ビジネス ロジックを含む別のアセンブリ (クラス ライブラリ) があるというものです。クラス ライブラリを使用するプロジェクトで、一度設定したパスワードを表示できるようにしたくありません。

4

6 に答える 6

7

次のように簡単です。

public string Password { internal get; set; }

これは珍しいことであり、プロパティに関する多くの人々の期待に反するものであることに注意してください。これは可能ですが、パブリックメソッド SetPasswordと、内部フィールドまたは内部GetPasswordメソッドのいずれかを使用することをお勧めします。人々は、設定できるが取得できないプロパティに出くわすことを期待していません (その逆はよくあることですが)。これはおそらく数少ない有効な使用例の 1 つですが、「驚きを最小限に抑える」方法論に従うために、代わりにメソッドを使用することを検討してください。

于 2013-01-16T18:34:30.977 に答える
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 に答える
2

取得と設定では、異なるアクセス修飾子を使用できます。

public string Password {
    internal get { return password; }
    set { password = value; }
}
于 2013-01-16T18:25:03.053 に答える
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);
    }
  }
}
于 2013-01-16T18:45:27.317 に答える