4

在 VB.Net 中,我正在使用它的变体,因此当使用 SearchModel 时,会有一个空的标签列表可供使用。

Public Class SearchModel
    Public Property Tags As New List(Of TagDetails)
End Class 

一个简单的转换结果,但“标签”为空:

public class SearchModel
{
    public List<TagDetails> Tags { get; set; }
}

这是创建“标签”属性并同时创建新的空列表的可接受方式吗?

public class SearchModel
{
    public List<TagDetails> Tags = new List<TagDetails>();
}

还是我应该经历所有的仪式?

public class SearchModel
{
  private List<TagDetails> _TagDetails;
    public List<TagDetails> Tags
    {
        get { return _TagDetails ?? (_TagDetails = new List<TagDetails>()); }
        set { _TagDetails = value; }
    }
}
4

5 回答 5

8

常规方法是使用构造函数:

public class SearchModel
{
    public SearchModel()
    {
        Tags = new List<TagDetails>();
    }
    public List<TagDetails> Tags { get; set; }
}
于 2012-10-10T21:43:29.540 回答
5

在构造函数中实例化它:

public class SearchModel
{
    public List<TagDetails> Tags { get; set; }

    public SearchModel()
    {
        Tags = new List<TagDetails>();
    }

    public SearchModel(List<TagDetails> tagDetails)
    {
        Tags = tagDetails;
    }
}

我在 C# 中做到了这一点,因为您的大部分代码都在 C# 中。您可以保持自动属性这样做。您还可以添加一个重载的构造函数,该构造函数接受一个要使用的列表(如果您不想要它,请删除它)。

于 2012-10-10T21:42:45.717 回答
0

最直接的转换如下(这是 VB 在幕后所做的):

public class SearchModel
{
    private List<TagDetails> _Tags = new List<TagDetails>();
    public List<TagDetails> Tags
    {
        get
        {
            return _Tags;
        }
        set
        {
            _Tags = value;
        }
    }
}
于 2012-10-10T21:51:24.913 回答
0

根本不公开具体列表类也有很好的论据。我当然会质疑 setter 是否明智,您可能会在对象生命周期和垃圾收集器方面弄得一团糟。

public class SearchModel
{
    private List<TagDetails> _tags;

    public SearchModel()
    {
        _tags = new List<TagDetails>();
    }

    public IEnumerable<TagDetails> Tags {get {return _tags;}}

}

本来是我的第一次尝试,然后添加我需要的任何其他列表类型方法,清除,追加等。

于 2012-10-10T21:55:56.883 回答
0

如果要保持列表的惰性实例化:

public class SearchModel
{
  private Lazy<List<TagDetails>> tags = new Lazy(() => new List<TagDetails>());

  public List<TagDetails> Tags
  {
    get { return this.tags.Value; }
  }
}

但是,您将无法设置该值。

于 2012-10-10T22:02:09.883 回答