2012-10-10 121 views
4

在VB.Net中,我使用了这种变体,所以当使用SearchModel时,有一个空的标签准备就绪。如何在C#中实例化一个属性的新实例

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

回答

8

的传统方法是使用一个构造函数:

public class SearchModel 
{ 
    public SearchModel() 
    { 
     Tags = new List<TagDetails>(); 
    } 
    public List<TagDetails> Tags { get; set; } 
} 
+0

+1。通常情况下,你会在这种情况下将'set'设置为private,所以不能替代List本身,但内容仍然可以修改。 (也编辑答案)。 –

+0

那么,如果你希望它是私人的,那么只能让它成为一个私人设置者。仅仅因为你在构造函数中实例化了它,并不意味着你有*使它成为一个私有的setter。 – Gromer

+0

@AlexeiLevenkov:我会同意Gromer。私人二传手并不是必须具有构造函数的人。 –

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#。你可以保持自动属性这样做。你也可以添加一个重载的构造函数,它接受一个要使用的列表(如果你不需要,就删除它)。

0

最直接的转换为以下(这是VB做幕后):

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

也有没有公开具体的列表类的好论据。我当然会质疑,二传手是否明智,在物体寿命和垃圾收集器方面,你会得到一个正确的解决方案。

public class SearchModel 
{ 
    private List<TagDetails> _tags; 

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

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

} 

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

0

如果你想保持列表中的延迟实例:

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

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

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

相关问题