Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
34 / 20 / 4
Регистрация: 07.03.2015
Сообщений: 334

Какой вариант кода правильнее и эффективнее использовать?

22.07.2017, 01:53. Показов 1115. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Первый или второй вариант, и вообще есть ли принципиальная разница, между ними?
C#
1
2
3
4
5
6
7
8
9
10
11
List<string> files = new List<string>();
GetFolderFiles(files);
 
private List<string> GetFolderFiles(List<string> files)
{
     files.AddRange(...);
     ...
     files.AddRange(...);
 
     return files;
}
C#
1
2
3
4
5
6
7
8
9
10
11
List<string> files = GetFolderFiles();
 
private List<string> GetFolderFiles()
{
     List<string> files = new List<string>();
     files.AddRange(...);
     ...
     files.AddRange(...);
 
     return files;
}
И как реализовать такой вариант использования?
C#
1
List<string> files = new List<string>(GetFolderFiles());
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.07.2017, 01:53
Ответы с готовыми решениями:

Какой вариант лучше? 6 похожих строчек кода vs вызов функции с использованием лямбда-выражения
delegate void изменить &lt;T&gt;(T элемент, bool включить); void Управлять&lt;T&gt;(bool включить, изменить&lt;T&gt; действие, params T элемент) ...

Считывание файла: какой из приведенных методов эффективнее
у меня есть 2 класа которые считывают даны с 1 файла но делают это по разному: Вопрос: какой делает это ефективные ? клас№1 ...

Как правильнее и удобнее использовать методы из класса
Всем доброго времени суток, я хочу задать вопрос про правильность использования методов из класса. Допустим, что есть класс с именем...

17
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
22.07.2017, 02:06
Оба неверные и не скомпилируются. Что в итоге тебе нужно? Зачем тебе такой вариант использования?
0
34 / 20 / 4
Регистрация: 07.03.2015
Сообщений: 334
22.07.2017, 02:29  [ТС]
Цитата Сообщение от ViterAlex Посмотреть сообщение
Оба неверные и не скомпилируются. Что в итоге тебе нужно? Зачем тебе такой вариант использования?
Что значит не скомпилируются? я только что выдернул код из рабочей проги, и сделал обрезание лишнего кода)
Если так интересно то вот тело, тут просто получение файлов в каталоге.
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
SearchOption so = sf.cbSearchSubfolders.Checked ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly;
if (sf.cbFileMask.SelectedIndex == 0 || sf.cbFileMask.SelectedIndex == 2) 
     files.AddRange(Directory.GetFiles(Settings.lastSearchPath, "*.txt", so));
if (sf.cbFileMask.SelectedIndex == 0 || sf.cbFileMask.SelectedIndex == 1)
     files.AddRange(Directory.GetFiles(Settings.lastSearchPath, "*.tmp", so));
if (sf.cbFileMask.SelectedIndex == 0 || sf.cbFileMask.SelectedIndex == 3)
     files.AddRange(Directory.GetFiles(Settings.lastSearchPath, "*.ini", so));

Просто в голову моча стукнула), хочу знать в чем принципиальная разница есть ли она?
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
22.07.2017, 02:40
Первый вариант не будет работать, потому что вызов GetFolderFiles во 2 строке висит в воздухе
Второй вариант — потому что инициализацию полей можно делать только статическими методами
0
34 / 20 / 4
Регистрация: 07.03.2015
Сообщений: 334
22.07.2017, 02:49  [ТС]
Цитата Сообщение от ViterAlex Посмотреть сообщение
вызов GetFolderFiles во 2 строке висит в воздухе
инициализацию полей можно делать только статическими методами
А вот ты про что, я забыл сказать что те строчки, располагаются в другом методе откуда вызывается GetFolderFiles, ну в общем это не поля)
0
34 / 20 / 4
Регистрация: 07.03.2015
Сообщений: 334
03.08.2017, 11:04  [ТС]
Ну так что никто не скажет какой вариант лучше?, мне что-то кажется что первый вариант использования вызова метода производительнее будет)
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
03.08.2017, 11:37
Fakels,
1 метод) мы можешь передать уже наполненный список и его дополнит новыми ( или дублями если такое будет уже) значениями
2 метод) список всегда будет новым
0
Эксперт .NET
 Аватар для Usaga
14297 / 9382 / 1353
Регистрация: 21.01.2016
Сообщений: 35,370
03.08.2017, 11:41
Fakels, оба варианта принципиально одинаковы.

Второй вариант немного "правильнее" только в том смысле, что возвращает собственноручно созданный список, а не использует сторонний, который может содержать что-то не связанное с файлами или быть неинициализированным (null). Т.е. это только с точки зрения архитектуры.

В плане производительности разницы не будет, ибо всё тоже самое, только порядок действий немного отличается.
0
34 / 20 / 4
Регистрация: 07.03.2015
Сообщений: 334
03.08.2017, 19:12  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
В плане производительности разницы не будет, ибо всё тоже самое, только порядок действий немного отличается.
Почему не отличается?
В первом случае мы передаем ссылку на созданный объект, во втором создается и инициализируются два объекта и один из них потом уничтожается сборщиком.
0
310 / 318 / 119
Регистрация: 29.10.2011
Сообщений: 1,006
03.08.2017, 20:30
Вы не там ищите проблему. Оба подхода не ахти, но первый особенно. Либо меняйте название метода, либо тот, кто будет пользоваться вашим методом рехнется Изменение объектов, которые поступают в метод через аргументы, должно быть очевидным для пользователя. Он отправляет данные и ожидает на выходе результат, а вы меняете исходные и возвращаете ему. Зачем? для создания цепочных вызовов? Метод должен вернуть файлы, а добавлять их в какую-то коллекцию или что-то другое с ними делать - это уже не его дело. По семантике метод GetFolderFiles должен вернуть файлы какой-то папки. Какой? Не ясно. Исходя из названия метода сделайте хотя бы так GetFolderFiles(string path) или меняйте название на более конкретное.
Я понимаю, что вы хотите написать более оптимизированный код, но тот выигрыш, за которым вы гонитесь, ничтожен по сравнению с теми проблемами, которые он породит. Да, вы пока работаете один и проект небольшой. Но стоит взяться за что-то крупное или же начать работать в команде, то это даст о себе знать.
1
Эксперт .NET
 Аватар для Usaga
14297 / 9382 / 1353
Регистрация: 21.01.2016
Сообщений: 35,370
04.08.2017, 02:43
Fakels, передача одного параметра идёт через регистр процессора, а это настолько быстро, что разницу в «скорости» не увидеть даже под микроскопом.

Что и с чего вдруг во втором случае сборщиком мусора уничтожается я не понял.

sldp, приём с возвращением изменённого параметра довольно распространён. Другое дело, что конкретно в данном случае принимать внешнюю коллекцию особого смысла не имеет. Разве что автор планирует завести несколько схожих методов, результаты работы которых он хотел бы сложить в одну коллекцию без дополнительного копирования из промежуточных коллекций...
0
34 / 20 / 4
Регистрация: 07.03.2015
Сообщений: 334
04.08.2017, 02:57  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Что и с чего вдруг во втором случае сборщиком мусора уничтожается я не понял.
List<string> files = new List<string>(); вот это вот)
0
Эксперт .NET
 Аватар для Usaga
14297 / 9382 / 1353
Регистрация: 21.01.2016
Сообщений: 35,370
04.08.2017, 03:05
Fakels, серьёзно?
0
34 / 20 / 4
Регистрация: 07.03.2015
Сообщений: 334
04.08.2017, 03:47  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Fakels, серьёзно?
В серьезных книжках так написано, же не вру)

вот к примеру
C#
1
2
3
4
5
6
7
8
9
public void start() { 
    List<string> files0 = GetFolderFiles();
}
private List<string> GetFolderFiles()
{
     List<string> files1 = new List<string>();
     files1.Add("ВАСЯ");
     return files1;
}
тут будет два объекта(files0 и files1) создано или один?
если два то, что files1 так и останется на куче висеть без дела?
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
04.08.2017, 04:45
Цитата Сообщение от Fakels Посмотреть сообщение
тут будет два объекта(files0 и files1) создано или один?
Один тут будет создан. И ссылка на него будет возвращена в как результат метода
0
Эксперт .NET
 Аватар для Usaga
14297 / 9382 / 1353
Регистрация: 21.01.2016
Сообщений: 35,370
04.08.2017, 05:59
Цитата Сообщение от Fakels Посмотреть сообщение
В серьезных книжках так написано, же не вру)
Вы либо не по С# книгу читали, либо поняли не правильно.
0
310 / 318 / 119
Регистрация: 29.10.2011
Сообщений: 1,006
04.08.2017, 08:59
Usaga, Да, но не для подобного типа методов. По этому я и говорю, что нужно либо переименовывать метод, либо менять подход
0
Эксперт .NET
 Аватар для Usaga
14297 / 9382 / 1353
Регистрация: 21.01.2016
Сообщений: 35,370
04.08.2017, 09:22
sldp, ну да, с такой подачей "GetFolderFilesList" звучало бы более правильно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.08.2017, 09:22
Помогаю со студенческими работами здесь

Какой контейнер в STL и для чего эффективнее использовать?
Какой контейнер в STL и для чего эффективнее использовать? И почему

Как правильнее и эффективнее реализовать перевод минут в часы и минуты?
Здравствуйте недавно начал изучать C++ смотрю примеры в книги, а на те примеры которые в учебнике нет ответов сверяюсь с их решение у вас...

Какой вариант конструктора использовать правильней?
Два примера кода, какой из них использовать более корректно и профессионально? 1) card(){ } card (deck_1 value_1, deck_2...

Какой вариант кода лучше ?
Я плохо разбираюсь в асме, и хотелось бы услышать мнение от профессионалов, какой из вариантов будет на много эффективней и быстрее...

Какой синтаксис эффективнее?
Здравствуйте! Может кто-нибудь знает, или есть соображения на тему как правильно составлять сроку со значениями переменных, с точки зрения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru