• Account account2 = account1 as Account; и Account account2 = (Account)account1; Есть различия?

    MikhailD
    @MikhailD
    Developer
    Различия есть:

    1. account1 as Account
    В этом случаи происходит приведение типа с проверкой. Если account1 не является типом Account, результат этого выражения будет null

    2. (Account) account1
    В этом случаи, если account1 не является типом Account, будет брошено исключение InvalidCastException

    В вашем случаи я рекомендовал бы такой вариант:
    Account account2 =  account1 as Account;
    if (account2 == null)
    {
        // account1 - это не Account
    }
    else
    {
        // account1 - это Account
    }
    Ответ написан
    Комментировать
  • Почему для использования дженериков нужен интерфейс?

    Вопрос конечно не совсем корректен, интерфейс не обязателен.

    Вы просто в этом примере создаете интерфейс IPerson. Этот интерфейс могут по факту реализовывать сколько угодно классов. Например Person1, Person2, Person3. Все по своему.
    Теперь вам нужно сделать метод SpeakTo, который позволит вам поговорить с любым из этих классов. Окей, пишем дженерик и пишем ограничение на интерфейс. (where T : IPerson )
    Теперь в метод вы можете передать любой класс, реализующий интерфейс IPerson.

    Но вы также можете написать например класс PersonBase вместо интерфейса, унаследовать наши Person1, Person2, Person3 от базового класса. Тогда вам нужно будет написать ограничение не на интерфейс, а на базовый класс where T : PersonBase. И вы также сможете передавать в метод SpeakTo любой класс, унаследованный от PersonBase.
    public class PersonBase
    {
      public virtual string GetFirstName() {return "MY name is base"; }
      public virtual string GetLastName() { return "MY lastname is base"; }
    }
    
    //либо через абстрактный класс
    //public abstarct class PersonBase
    //{
    //  public abstract string GetFirstName();
    //  public abstract string GetLastName();
    //}
    
    class Speaker 
    {
      public void SpeakTo<T>(T person) where T : PersonBase
      {
        string name = person.GetFirstName();
        this.say("Hello, " + name);
      }
    }

    Еще бывают ограничения на конструктор, ограничения ссылочного типа и ограничения типа значения.
    Ответ написан
    Комментировать
  • Как добавить элемент в массив когда цикл с этим массивом запущен?

    WNeZRoS
    @WNeZRoS
    Ваш код:
    List<BlueprintLink> blueprintLinks = new List<BlueprintLink>();
    BlueprintLink parentBlueprintLink = db.BlueprintLinks.FirstOrDefault(m=>m.BlueprintId == helper.BlueprintId && m.ProductId == product.Id);
    blueprintLinks.Add(parentBlueprintLink);
    foreach (var blLink in blueprintLinks.ToArray()) // .ToArray() создаёт копию blueprintLinks, в котором будет один добавленный элемент на предыдущей строчке
    {
        List<BlueprintLink> _blueprintLinks = db.BlueprintLinks.Where(m=>m.ParentId == blLink.BlueprintId && m.ProductId == blLink.ProductId).ToList();
        blueprintLinks.AddRange(_blueprintLinks); // добавляем новые элементы в оригинальный список
    } // выходим из цикла потому что в копии сделанной ToArray всего один элемент


    Правильный вариант:
    var blueprintLinks = new List<BlueprintLink>();
    blueprintLinks.Add(db.BlueprintLinks.First(m => m.BlueprintId == helper.BlueprintId && m.ProductId == product.Id));
    for(int i = 0; i < blueprintLinks.Count; i++) // Идём по оригинальному списку от 0 до конца
    {
        blueprintLinks.AddRange(db.BlueprintLinks.Where(m => m.ParentId == blLink.BlueprintId && m.ProductId == blLink.ProductId)); // добавляем новые элементы в список
    } // blueprintLinks.Count увеличился на кол-во добавленных элементов и есть куда идти дальше
    Ответ написан
    Комментировать
  • Как узнать сколько будет выполняться вызванная функция?

    yarosroman
    @yarosroman Куратор тега C#
    C# the best
    Как вариант, функцию в отдельный поток, и через callback обновлять прогресс.
    Ответ написан
    Комментировать
  • Как правильно спроектировать службу?

    Во-первых вам нужно ОЧЕНЬ ЧЕТКО понять принципиальную разницу между терминами "WCF service" и "windows service", т.к. общего между ними немного. Первое это про веб-сервисы, второе - это тоже что и демоны в *nix-системах. Первое это про архитектуру распределенной системы, второе это про жизненный цикл программы (как, когда и кем запускается/останавливается).

    Поэтому:
    1) если разработка под Винду, и
    "служба должна выполнять в фоне некоторые действия с бд"

    то почитайте про Windows Service - на шарпе такие пишутся относительно просто. Это не единственный способ запустить процесс, который будет крутиться и сам что-то делать в базе, но он предпочтителен.
    2) если взаимодействие с клиентом подразумевается не по самодельному протоколу, а например по HTTP, то вам срочно нужно ознакомиться с тем, что такое веб-сервисы/веб-API и какие они бывают. Если вы уже понимаете что это такое, то вам нужно выбрать способ реализации под Дотнетом.

    Подскажите, это можно сделать в рамках одной службы или нет?

    Если под службой понимается Windows-служба, то можно. Стоит ли - другой вопрос, зависит от тех действий, которые вы хотите выполнять в фоне, архитектуры БД и политики работы с ней.
    Ответ написан
    Комментировать