Заполнение списка конструктором в С#

Может быть, это такой простой вопрос или невозможно сделать это. Я не знаю, я просто спрашиваю.

у меня есть такой класс:

    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.

Извините, мой английский недостаточно хорош, но я надеюсь, что правильно записал проблему.


person c0demaster    schedule 20.02.2014    source источник
comment
"all of my voids" что это значит?   -  person Selman Genç    schedule 21.02.2014
comment
То, что вы делаете, правильно. Голосование за закрытие как не проблема или что-то еще, что на самом деле говорит причина закрытия.   -  person Simon Whitehead    schedule 21.02.2014
comment
это так же просто, как сделать Station общедоступной?   -  person kenny    schedule 21.02.2014
comment
Не существует такой вещи, как пустота. Вы имеете в виду методы (которые могут быть отмечены ключевым словом void, обозначающим, что они не имеют возвращаемого значения).   -  person O. R. Mapper    schedule 21.02.2014
comment
all of my voids означает, что объект station должен быть доступен через все пространство имен voids perimeterdistance   -  person c0demaster    schedule 21.02.2014


Ответы (2)


То, что вы делаете, прекрасно, однако, если вы предоставите конструктор для Station, ваш вызывающий код не только будет более чистым, но и вызывающему коду не нужно будет решать, что следует гидратировать внутри организация. принцип информационного эксперта гласит, что класс с наибольшим знанием того, как сделать что-то должен быть тот, кто это сделает. Это означало бы добавление конструктора, который принимает три аргумента: 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);

Если станция недействительна, если у нее нет всех трех свойств, добавление конструктора может помочь обеспечить создание допустимых объектов.

Я бы также рекомендовал не сокращать имена свойств для удобства сопровождения в будущем.

Изменить

Если ваш вопрос действительно о добавлении данных в пользовательский интерфейс:

Вы должны получать данные из своей бизнес-логики, а не из главного окна пользовательского интерфейса. И вам не нужно вводить эти данные в код; он должен существовать в каком-то постоянном хранилище (БД, файл и т. д.). См. stackoverflow.com/a/13790722/279516

person Bob Horn    schedule 20.02.2014
comment
Спасибо за быстрый ответ, моя проблема в том, правильно ли я поступаю? Я пытаюсь кодировать свое приложение как эксперты. к списку нужно добавить еще 48 пунктов. я просто хочу заполнить свои данные в классе, а не в главном окне. - person c0demaster; 21.02.2014
comment
Ага, так это совсем другая тема. Вы должны получать данные из своей бизнес-логики, а не из главного окна пользовательского интерфейса. И вам не нужно вводить эти данные в код; он должен существовать в каком-то постоянном хранилище (БД, файл и т. д.). См. stackoverflow.com/a/13790722/279516. - person Bob Horn; 21.02.2014
comment
это ответ, что мне нужно, спасибо, Боб - person c0demaster; 21.02.2014

Инициализация, которую вы показываете Object Initialization, лучше всего подходит, когда у класса есть много свойств, которые необходимо назначить, или у одного есть процесс (например, Entity Framework), где экземпляр может быть инициализирован с помощью отражения, и предоставление конструктора для такого сценария было бы будет больше работы, чем использование конструктора по умолчанию и использование инициализации объекта.

Я предпочитаю инициализацию объекта, которая у вас есть, а не конструктор, потому что с большим количеством объектов POCO требуется много времени для создания конструкторов, которые, откровенно говоря, не нужно создавать. В противном случае использование конструктора для аргументов, превышающих 3, противоречит правилу некоторых людей не использовать несколько методов/конструкторов аргументов. Таким образом, можно вступить в войну из-за его использования.

Кроме того, смешивание похожих значений, в вашем примере десятичных знаков, с меньшей вероятностью произойдет при инициализации объекта.

Просто помните, что назначение свойств во время создания экземпляра происходит после построения. Таким образом, любое свойство, установленное в конструкторе, потеряет значение после того, как свойство будет установлено снаружи. Это важно, если кто-то практикует внедрение зависимостей, когда внутреннее свойство будет переопределено назначением свойства внешней операцией (мысленный тест). Это позволяет операции (как свойства), которая может быть настроена во время построения, чтобы ее можно было безопасно переопределить, если это необходимо позже для целей тестирования.

person ΩmegaMan    schedule 20.02.2014