1. C# / Говнокод #3198

    +118

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    #region копирование в буфер
            private void copia_Click(object sender, EventArgs e)
            {
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < listBox1.Items.Count; i++)
                {
                    sb.Append(listBox1.Items[i].ToString());//Добавляем строчку из листБокса
                    sb.Append((char)13);//Перенос строки
                    sb.Append((char)10);//Перевод каретки
                }
                Clipboard.SetText(sb.ToString());//Отправляем всё в КлипБорд
            }
            #endregion
    
            #region Сохранить в файл
    
            private void save_Click(object sender, EventArgs e)
            {
                saveFileDialog1.DefaultExt = ".txt";
                saveFileDialog1.OverwritePrompt = true;
                saveFileDialog1.Title = "Координаты";
                saveFileDialog1.Filter = "Text Files|*.txt";
    
                if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    StreamWriter sw = new StreamWriter(saveFileDialog1.FileName);
                    StringBuilder sb = new StringBuilder();
                    for (int i = 0; i < listBox1.Items.Count; i++)
                    {
                        sb.Append(listBox1.Items[i].ToString());//Добавляем строчку из листБокса
                        sb.Append((char)13);//Перенос строки
                        sb.Append((char)10);//Перевод каретки
                    }
                    sw.WriteLine(sb);
                    sw.Flush();
                    sw.Close();
                }
            }
            #endregion

    Запостил: L5D, 12 Мая 2010

    Комментарии (28) RSS

    • >Перенос строки
      Хоть не понос.
      Ответить
    • а как должно быть? на мой взгляд, не говнокод. Ну разве что комментарии ))
      Ответить
    • При копировании в буфер вместо
      sb.Append((char)13);//Перенос строки
      sb.Append((char)10);//Перевод каретки

      пишем
      sb.Append(Environment.NewLine);


      Сохранение в файл:
      StreamWriter sw = new StreamWriter(saveFileDialog1.FileName);
      for (int i = 0; i < listBox1.Items.Count; i++)
      {
          sw.WriteLine(listBox1.Items[i].ToString());
      }
      sw.Close();


      Так?
      Ответить
      • а конструкция типа foreach возможна?
        Ответить
        • а тебя чем-то цикл for смущает ?)
          Ответить
          • меня смущает "лишний" индекс i и слишком частое вычисление размера массива
            Ответить
            • Там все кешируется в память. Вычисления будут проводится только 1 раз
              Ответить
              • а второй поток(предположительно) не изменит массив? - сужу по ситуевине в яве
                Ответить
                • Если поменяется коллекция Items то и Count соответственно будет для другой коллекции. Но если Items та же, то Count вычисляется 1 раз
                  Ответить
                  • А что если obj.Items.Add() / obj.Items.Remove() ?

                    Лучше всё-таки юзать foreach, он проверяет collection._version и в случае чего сразу выкинеть InvalidOperationException, .
                    Ответить
                    • Я рефлектором поковырял System.Windows.Forms.ListBox.ObjectColle ction. приватная переменная count изменяется при Add/Remove и она же возвращается пропертей Count
                      Ответить
                      • в итоге пришли к выводу, что с foreach и красивей, и спокойней
                        Ответить
                        • Смотря чего вы ожидаете.
                          Используя foreach вы создадите еду для габидж колектора (класс энумератора). При теоретическом изменении коллекции процесс прекратится екзепшном.
                          Используя цикл фор вы создадите одну лишнюю 4х байтную переменную. И при теоретическом изменении коллекции процесс пройдет нормально (Count вернет точное количество элементов в массиве)
                          Ответить
                          • > Используя foreach вы создадите еду для габидж колектора (класс энумератора)

                            Ололо, энумератор - структура, хранится в стеке. ВНЕЗАПНО: public struct Enumerator : IEnumerator, IDisposable, IEnumerator<T>

                            > И при теоретическом изменении коллекции процесс пройдет нормально (Count вернет точное количество элементов в массиве)

                            Да ну? Поток #1 получил значение collection.Count, сравнил с i, условие верно => вошёл в блок цикла. В это же время другой поток удалил/добавил один объект. Первый поток, УЖЕ будучи в итерации, до сих пор считает, что объектов 4, а не 3 или 5. В итоге непонятные баги и прочее (итерация продолжается дальше потому что). А с foreach сразу ясно, что ошибка в синхронизации (хотя непонятные баги тоже могут вылезти, но вероятность меньше).
                            Ответить
                            • ох, кажется, задел я за живое )
                              с вами согласен, в яве (от шарпа я убег едва познакомившись) именно так.
                              Ответить
                              • > от шарпа я убег едва познакомившись

                                почему?
                                Ответить
                                • 1. имена методов с заглавной буквы - дико. Все равно что Кот васька.
                                  2. слишком длинные имена.
                                  3. вообще дотнет значит мелкософт и виндоуз, а это секта. То бишь если повязать себя с ним, то заставят и другие мелкософт-решения юзать. Даешь свободу в опенсорсе и кроссплатформенности!
                                  4. многое слизано с той же явы, но по-своему и не всегда удачно

                                  ну и еще 100 ньюансов (лень перечислять), из за которых я сказал дотнету:"изыди!"
                                  не хочу будоражить холивареров, но ЛИЧНО мне ява приятнее со всеми ее недостатками
                                  Ответить
                                  • 1. Ну это на вкус и цвет... Мне наоборот больше нравятся имена методов с большой буквы. Связано это с моей нелюбовью к андерскорам. Так я могу приватные методы/свойство-поля делать с маленькой буквы, а публичные - с большой.
                                    2. В смысле?
                                    3. Ну это фигня, моно давно вышла в продакшн-режим, от МС не зависит.
                                    4. Если взглянуть со стороны, то то, что "слизано с явы", было придумано ещё лет за 20 до явы. Чего только ява не слизала...

                                    > ну и еще 100 ньюансов

                                    Ну эти нюансы все какие-то несерьёзные.
                                    Вот я выбрал моно потому что:
                                    1) можно собрать в натив в один экзешник
                                    2) простой доступ к C api.
                                    3) скорость за счёт классов в стеке, т.е. структур
                                    4) большая продуктивность засчёт компонентно-ориентированности (евенты, свойства, и т. д.)
                                    (мне эти четыре пункта важнее нейминг конвеншонз)

                                    Кросплатформ вообще хрень в том числе и у явы. Порой легче написать что-то кросплатформенное на си, чем пытаться собрать в кучу яву, JNI, HERNI и прочий шлаг вместе под каждую платформу.
                                    Ответить
                                    • 1. никогда не юзал андерскоры, именно потому что удлиняют имя. а так же тот же кэмелкейс. А ClassA.ClassB - это внутренний класс или статическая переменная? ClassA.сlassB понятнее. А публик\приват различаются по модификатору и месту обьявления
                                      2. ну, из головы пример: modify() короче и приятнее чем AddSingleNameModifier()
                                      3. моно еще не так полон, как дотнет
                                      4. хотя бы ява сделала это более-менее удобно. Или мне так показалось - с первого взгляда, и кажется до сих пор

                                      Насчет потому что: меня заинтересовал D, в качестве "продвинутого" нативного С, но не столь сложного, как С++
                                      Ответить
                                      • > никогда не юзал андерскоры, именно потому что удлиняют имя. а так же тот же кэмелкейс.

                                        ничо не нравится. и как же жить теперь?

                                        > А ClassA.ClassB - это внутренний класс или статическая переменная?

                                        Ну вам прямо не угодишь. Сделал майкрософт венгерскую нотацию - жаловались. Убрали все вспомогательные префиксы - опять жалуются. Одни жалуются на I в IDisposable. Другие жалуются, что нет A у абстрактных классов. КАКИХ ИХ РАЗЛИЧАТЬ??!!!

                                        > А ClassA.ClassB - это внутренний класс

                                        В сишарпе внутренние классы редко используются, не существенно.

                                        > А ClassA.ClassB - это внутренний класс или статическая переменная?

                                        Если сидеть с интеллисенсом, то таких проблем совсем нет. Я даже не помню ни разу, чтобы вот сидел и думал: это свойство или статическая переменная или класс?.. Сразу как-то всё понятно. (там для особо вдумчивых картинки для каждого типа сделали, сразу видно, что где)

                                        > 3. моно еще не так полон, как дотнет

                                        Да ну? clr2.0 реализован весь за исключением пары редко исопльзуемых методов и классов. А больше и не надо.
                                        Ответить
                                  • > имена методов с заглавной буквы - дико. Все равно что Кот васька

                                    Аналогию не понял. "Кот васька" это скорее объявление переменной "васька" класса "Кот". Вот это почему-то в обоих языках вас не смущает :) По такой аналогии (с естественными языками) классы должны писаться с маленькой буквы, а instances - с большой. (Напр., как в русском языке: "президент" как класс и "Президент" как какой-то конкретный президент.)

                                    Да и лично на мой вкус выглядит солиднее, идентификаторы с маленькой буквы ассоциируются с локальными переменными . Почему имена публичных методов, интерфейсов, "идущих в свет", должны прибедняться и идти с маленькой буквы? :)
                                    Ответить
                                    • с большой буквы - сущности (классы обьектов), с маленькой - их части. Тогда как вам такая аналогия: сущность Я и моя рука, но не: я и моя Рука )

                                      скромность - сестра таланта ))
                                      Ответить
                            • фор даст екзепшн тоьлко в том случае если вы будете доступаться до 4го элемента, а их всего лишь 3 (что мне кажется вполне логичным).
                              public virtual object this[int index]
                                          {
                                              get
                                              {
                              if ((index < 0) || (index >= this.InnerArray.GetCount(0)))
                                                  {
                                                      throw new ArgumentOutOfRangeException("index", System.Windows.Forms.SR.GetString("InvalidArgument", new object[] { "index", index.ToString(CultureInfo.CurrentCulture) }));
                                                  }

                              Если же количество элементов увеличилось то цикл пройдет без екзепшна (Что мне тоже кажется логичным)
                              Ответить
                            • По поводу энумератора.
                              Сами посмотрите
                              System.Windows.Forms.ListBox.ItemArray.E ntryEnumerator

                              private class EntryEnumerator : IEnumerator
                              Ответить
                          • ок, судя по рефлектору, именно для System.Windows.Forms.ListBox.ObjectColle ction создаётся класс, в общем, надо уточнять, что имеется в виду, когда говорится "Используя foreach вы создадите еду для габидж колектора " - конкретный этот случай или вообще. в основном foreach реализуется структурами.

                            для этого случая это не так важно, что выделяется память, проход по коллекции контрола по идее не должен совершаться очень часто (в отличие от, например, прохода по коллекции спрайтов, чтобы отрисовать 2д).
                            Ответить
                  • )))) Сам-то пробовал?
                    Ответить
                • В WinForms по умолчанию нельзя менять контролы из другого потока, выкинет исключение. Надеюсь, это относится и к ListBox.Items.
                  Ответить

    Добавить комментарий