【问题标题】:Internal getter, public setter c#内部getter,公共setter c#
【发布时间】:2013-01-16 18:22:23
【问题描述】:

我基本上想做这样的事情

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

internal string Password
{
  get { return password; }
}

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

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

【问题讨论】:

  • 您可以对 get 和 set 应用访问修饰符。
  • 是的,我最终想通了。在链接到该项目(核心逻辑)的单独项目中,这是一个类似的错误,它引用了引发错误的类的内部部分。我被编译器错误抛出,认为我所做的是非法的。任何这篇文章都应该对人们有用仍然非常感谢:)

标签: c# setter public getter internal


【解决方案1】:

很简单:

public string Password { internal get; set; }

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

【讨论】:

  • 非常符合用户期望。我会推荐 SetPassword(...) 方法而不是只写属性。
  • 很好的解释。我想知道,如果人们尝试分配给该字段,是否有可能使用元信息引发编译时错误?
  • @Prof 这就是使用自动实现属性的好处;在编译时无法分配给该字段。
【解决方案2】:

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

public string Password {
    internal get { return password; }
    set { password = value; }
}

【讨论】:

    【解决方案3】:

    我相信你可以这样写:

    private string password;
    public string Password 
    { 
        internal get 
        { 
           return password; 
        }
        set
        {
            password = value;
        }
    }
    

    【讨论】:

      【解决方案4】:

      就这么简单:

      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】:
        string _password;   
        public string Password
        {
             internal get { return _password; }
             set { _password=value; }
        }
        

        【讨论】:

          【解决方案6】:

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

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

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

          【讨论】:

            猜你喜欢
            • 2011-08-21
            • 2011-05-31
            • 1970-01-01
            • 2011-01-02
            • 1970-01-01
            • 1970-01-01
            • 2017-06-27
            • 2012-07-25
            • 2021-09-03
            相关资源
            最近更新 更多