【问题标题】:C# get and set properties for a List CollectionC# 获取和设置列表集合的属性
【发布时间】:2011-11-19 18:09:24
【问题描述】:

集合集的属性如何?

我创建了一个具有 Collection 属性的类。我想在设置新值时添加到列表中。在 set 方法中使用 _name.Add(value) 不起作用。

Section newSec = new Section();

newSec.subHead.Add("test string");
newSec.subHead.Add("another test string");

public class Section
{
    public String head { get; set; }
    private List<string> _subHead = new List<string>();
    private List<string> _content = new List<string>();

    public List<string> subHead
    {
        get
        { return _subHead; }
        set
        {
            _subHead.Add(value);
        }
    }
    public List<string> content
    {
        get
        { return _content; }
        set
        {
            _content.Add(value);
        }
    }
}

更新我的解决方案:

public class Section
{

    private List<string> _head = new List<string>();
    private List<string> _subHead = new List<string>();
    private List<string> _content = new List<string>();

    public List<string> Head
    {
        get
        { return _head; }
    }

    public List<string> SubHead
    {
        get
        { return _subHead; }
    }
    public List<string> Content
    {
        get
        { return _content; }
    }

    public void AddHeading(string line)
    {
        Head.Add(line);
    }

    public void AddSubHeading(string line)
    {
        SubHead.Add(line);
    }

    public void AddContent(string line)
    {
        Content.Add(line);
    }

}

【问题讨论】:

    标签: c#


    【解决方案1】:

    将它作为 setter 的一部分是不合适的 - 这不像你是 真的 设置整个字符串列表 - 你只是试图 添加 一个。

    有几个选项:

    • AddSubheadingAddContent 方法放在您的类中,并且只公开列表的只读版本
    • 仅使用 getter 公开可变列表,并让调用者添加到其中
    • 放弃所有封装的希望,只让它们具有读/写属性

    在第二种情况下,您的代码可以是:

    public class Section
    {
        public String Head { get; set; }
        private readonly List<string> _subHead = new List<string>();
        private readonly List<string> _content = new List<string>();
    
        // Note: fix to case to conform with .NET naming conventions
        public IList<string> SubHead { get { return _subHead; } }
        public IList<string> Content { get { return _content; } }
    }
    

    这是相当实用的代码,尽管它确实意味着调用者可以按照他们想要的任何方式改变你的集合,这可能并不理想。第一种方法可以保持最大程度的控制(只有您的代码会看到可变列表),但对于调用者来说可能不太方便。

    使集合类型的设置器实际上只是向现有集合添加单个元素既不可行也不会令人愉快,所以我建议你放弃这个想法。

    【讨论】:

      【解决方案2】:

      如果我正确理解您的要求,您必须执行以下操作:

      public class Section 
      { 
          public String Head
          {
              get
              {
                  return SubHead.LastOrDefault();
              }
              set
              {
                  SubHead.Add(value);
              }
      
          public List<string> SubHead { get; private set; }
          public List<string> Content { get; private set; }
      } 
      

      你可以这样使用它:

      var section = new Section();
      section.Head = "Test string";
      

      现在“测试字符串”已添加到 subHeads 集合中,并可通过 getter 获得:

      var last = section.Head; // last will be "Test string"
      

      希望我理解正确。

      【讨论】:

        【解决方案3】:

        或者

        public class Section
        {
          public String Head { get; set; }
          private readonly List<string> _subHead = new List<string>();
          private readonly List<string> _content = new List<string>();
        
          public IEnumerable<string> SubHead { get { return _subHead; } }
          public IEnumerable<string> Content { get { return _content; } }
        
          public void AddContent(String argValue)
          {
            _content.Add(argValue);
          }
        
          public void AddSubHeader(String argValue)
          {
            _subHead.Add(argValue);
          }
        }
        

        一切都取决于您要隐藏多少内容和子标题。

        【讨论】:

          【解决方案4】:

          您的二传手很奇怪,这就是您可能会遇到问题的原因。

          首先,考虑您是否需要这些设置器 - 如果需要,它们应该使用 List&lt;string&gt;,而不仅仅是 string

          set
          {
              _subHead = value;
          }
          

          这些行:

          newSec.subHead.Add("test string");
          

          正在调用 getter,然后在返回的 List&lt;string&gt; 上调用 Add - 未调用 setter。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-11
            • 2011-08-09
            相关资源
            最近更新 更多