在C#中使用构造函数填充列表

时间:2014-02-20 21:35:45

标签: c# wpf constructor initializer

也许这是一个如此简单的问题或者不可能做到这一点。我不知道我只是在问。

我有一个这样的课程:

    namespace Perimeter_Distance
{
    class Station
    {
        public string Name { get; set; }
        public decimal Lng { get; set; }
        public decimal Lat { get; set; }
    }
}

我正在wpf:

的主窗口中填写课程
public partial class MainWindow : Window
    {
        // initializing class with definitions
        List<Station> stations = new List<Station>()
            {   new Station {Name = "01 -- Söğütlüçeşme -- 45",Lat=40.994864M,Lng=29.037337M},
                new Station {Name = "02 -- Fikirtepe -- 44",Lat=40.993824M,Lng=29.047972M},
                new Station {Name = "03 -- Uzunçayır -- 43",Lat=40.998778M, Lng=29.056474M}
            };

我的问题是我做得对,还是可以在构造函数中填充/初始化类。

我希望我的所有空位都可以访问wpf中的类。

对不起,我的英语不够好,但我希望我能正确地写下这个问题。

2 个答案:

答案 0 :(得分:2)

你正在做的很好,然而,如果你为Station提供一个构造函数,你的调用代码不仅会更干净,而且调用代码也不需要决定实体内应该补充什么。 information expert principle表示最了解如何做某事的班级应该是这样做的。这意味着添加一个带有三个参数的构造函数:Name,Lng,Lat。

class Station
{
    public string Name { get; set; }
    public decimal Lng { get; set; }
    public decimal Lat { get; set; }

    public Station(string name, decimal longitude, decimal latitude)
    {
        this.Name = name;
        this.Lng = longitude;
        this.Lat = latitude;
    }
}

现在您的调用代码不需要决定应该发送什么来创建有效对象。它可以这样做:

var station = new Station("01 -- Söğütlüçeşme -- 45", 40, 29);

如果一个工作站无效,除非它具有所有三个属性,添加构造函数可以帮助强制执行有效的对象。

我还建议不要缩写你的属性名称以便将来维护。

修改

如果您的问题确实是在UI中添加数据:

您应该从业务逻辑中获取数据,而不是在UI的主窗口中。而且你不必在代码中输入这些数据;它应该存在于某种持久性存储(DB,文件等)中。请参阅stackoverflow.com/a/13790722/279516

答案 1 :(得分:1)

您显示Object Initialization的初始化最适合当类具有许多需要分配的属性或者有一个进程(想想实体框架)时,可以通过反射初始化实例并提供这种场景的构造函数比使用默认构造函数和使用对象初始化更有用。

我更喜欢对构造函数进行对象初始化,因为有很多POCO对象创建构造函数非常耗时,而不必创建坦率的构造函数。 否则为超过3+的参数使用构造函数与某些人的规则冲突而不具有多个参数方法/构造函数。因此,人们可以对其使用进行反复的战争。

在对象初始化中,混合类似值(在您的示例中为小数)也不太可能发生。

请记住,实例创建期间的属性赋值发生在构造之后。因此,在将属性设置为外部之后,构造函数中设置的任何属性都将丢失。如果一个人正在练习依赖注入,那么内部属性将被外部操作(思考测试)的属性赋值覆盖,这一点很重要。这允许在施工期间设置一个操作(作为属性),以便在以后为了测试目的而被安全地覆盖。