【问题标题】:Populating a list on constructor in C# [closed]在 C# 中填充构造函数列表 [关闭]
【发布时间】:2014-03-22 02:57:10
【问题描述】:

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

我有这样的课程:

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

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

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

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

【问题讨论】:

  • "all of my voids" 是什么意思?
  • 你所做的是正确的。投票以“不是问题”或任何关闭原因实际说明的方式结束。
  • 就是把Station公开这么简单吗?
  • 没有所谓的“空虚”。您的意思是“方法”(可能用void 关键字标记,表示它们没有返回值)。
  • 我所有的空白意味着站对象应该可以通过所有空白命名空间周长距离访问

标签: c# wpf constructor initializer


【解决方案1】:

你所做的很好,然而,如果你为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 的主窗口中。而且您不必在代码中输入这些数据;它应该存在于某种持久性存储(数据库、文件等)中。请参阅 stackoverflow.com/a/13790722/279516

【讨论】:

  • 感谢您的快速回答,我的问题是我做得对吗?我尝试像专家一样编写我的应用程序。将有更多的 48 项添加到列表中。我只想在类中而不是在主窗口中填充我的数据。
  • 是的,这完全是另一个问题。您应该从业务逻辑中获取数据,而不是在 UI 的主窗口中。而且您不必在代码中输入这些数据;它应该存在于某种持久性存储(数据库、文件等)中。见stackoverflow.com/a/13790722/279516
  • 这就是我需要的答案,谢谢鲍勃
【解决方案2】:

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

我更喜欢对象初始化,而不是构造函数,因为有很多 POCO 对象,创建坦率地说不必创建的构造函数很耗时。 否则,对超过 3 个以上的参数使用构造函数与某些人的规则冲突,即不具有多个参数方法/构造函数。因此,人们可能会就其使用情况进行一场来回的战争。

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

请记住,实例创建期间的属性分配发生在构造之后。因此,在构造函数中设置的任何属性在设置外部属性后都会失去价值。如果一个人正在练习依赖注入,其中内部属性将被外部操作(想想测试)分配给属性所覆盖,这一点很重要。这允许在构造过程中设置操作(作为属性),以便在以后有必要时安全地覆盖以进行测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多