Ответы пользователя по тегу .NET
  • Вопрос про лицензию на Visual Studio

    VenomBlood
    @VenomBlood
    Насколько я знаю для SQL, например, «не имеете права использовать в производственной среде» — значит что если у вас крутится продакшн, то вы не можете developer лицензию SQL сервера туда поставить, при этом для разработки и тестов, например на билд-машине, использовать ее можно. По крайней мере у меня на прошлой работе были куплены именно розничные коробки VS 2010 Pro и компания даже прошла сертификацию на партнера MS, т.е. надо полагать их это устроило.
    Не могу представить где студию можно использовать в продакшене просто.

    Бескоробочные лицензии подразумевают что у вас все же будет сертификат, который имеет такую же юридическую силу как и коробка, поэтому можно свободно покупать студию за 15К, но там могут быть ограничение на минимальное количество приобретаемых копий — например не менее 5.
    Ответ написан
    4 комментария
  • Доступ к контролу Windows Forms из другого потока (C#)?

    VenomBlood
    @VenomBlood
    Раз используется .net 4.0 — то вместо потоков лучше использовать задачи:
    Task task = new Task(Download);
    task.ContinueWith(CodeAfterJoin);
    task.Start();

    Только тут надо учитывать, что продолжение запустится в своем собственном потоке.
    Ответ написан
    Комментировать
  • Наследование C#

    VenomBlood
    @VenomBlood
    Все правильно делает. Тип указан как A, метод — виртуальный, иерархия метода кончается на B, создается подтип типа B. При вызове метода производится проверка перегрузок по иерархии наследования, где наиболее подходящая перегрузка — у класса B.
    Ответ написан
    Комментировать
  • Почему именно лямбда-выражения?

    VenomBlood
    @VenomBlood
    Type inference и expression trees + более лаконичный синтаксис.
    Ответ написан
    Комментировать
  • Задачка на многопоточность (.NET)?

    VenomBlood
    @VenomBlood
    Предложу своё решение:
        public class Endpoint
        {
            private Mutex _sendLock;
            private Mutex _receiveLock;
    
            private int _amount;
            public int Amount
            {
                get
                {
                    return _amount;
                }
            }
    
            public Endpoint(int amount)
            {
                _sendLock = new Mutex();
                _receiveLock = new Mutex();
    
                _amount = amount;
            }
    
            public static void Transmit(Endpoint source, Endpoint destination, int amount)
            {
                WaitHandle[] transmittingPartiesHandles = new WaitHandle[] { source._sendLock, destination._receiveLock };
                WaitHandle.WaitAll(transmittingPartiesHandles);
    
                // Do smth.
    
                Interlocked.Decrement(ref source._amount);
                Interlocked.Increment(ref destination._amount);
    
                source._sendLock.ReleaseMutex();
                destination._receiveLock.ReleaseMutex();
            }
        }
    


    public class Program
        {
            public static void Main(string[] args)
            {
                Endpoint detroit = new Endpoint(1000000);
                Endpoint london = new Endpoint(0);
    
                int amount = detroit.Amount;
    
                Thread thread = new Thread(() => Transfer(detroit, london, amount));
                
                thread.Start();
                Transfer(london, detroit, amount / 2);
                thread.Join();
    
                Console.Out.WriteLine("source.Amount = {0}", detroit.Amount);
                Console.Out.WriteLine("target.Amount = {0}", london.Amount);
                Console.ReadLine();
            }
    
            private static void Transfer(Endpoint source, Endpoint target, int amount)
            {
                for (int i = 0; i < amount; i++)
                {
                    Endpoint.Transmit(source, target, amount);
                }
            }
        }
    


    Во первых — делаем объект Endpoint потокобезопасным сам по себе. Ведь по сути изменять свойство Amount из внешнего кода нельзя.
    Во вторых — избавляемся от локов на реальные объекты (это плохо, т.к. может существовать параллельно другой сценарий, в котором для совершенно других целей опять возьмётся лок на тот же объект Endpoint)
    В третьих — выделяем процесс передачи в отдельный метод. Общий лок здесь не пройдет если будет настроенно сразу несколько передач в разных местах (будет много объектов «общей» блокировки для одной и той же пары конечных точек, из за чего возникнут проблемы).
    Ответ написан
    Комментировать
  • .Net Неверный формат аргумента функции: ArgumentException или FormatException?

    VenomBlood
    @VenomBlood
    На мой взгляд форматные исключения возникают в строках или при явной передаче объекта который может иметь несколько «форматов» представления (хотя в этом случае лучше реализовать конвертер по возможности и не выкидывать эксепшены вообще).
    Если мы передали вообще неверные данные — ArgumentException, если передали верные данные, но в неверном формате — FormatException. Только здесь надо определять уже в контексте конкретного приложения, могут ли входные данные быть вообще неверными (имея один формат представления) или все данные верны, но из за разных форматов может возникнуть ошибка. Например при формировании даты из строки для строки типа «dfdfdsfsf» я бы выдавал исключение неверного формата, а для данных «32.09.2010» — ошибку неверного аргумента (генериться оно будет соотв. уже на более низком уровне, при проверке даты).
    Ответ написан
    Комментировать