Создатели FinalBuilder ежегодно проводили опросы своих клиентов (в основном на базе Windows). . Я не могу найти ничего более свежего, чем их опрос 2008 года , но вот как это выглядело тогда.
Как видите, вы должны знать не только одно. Однако было бы глупо не ознакомиться с Subverion и Sourcesafe.
Если бы я мог предсказать, как это изменилось с тех пор, я бы предположил, что Subversion добавила пользователей, SourceSafe немного уступил Team Foundation и что теперь появляется Git, но только с небольшими номерами.
Я думаю, не совсем для Windows, но Subversion (SVN) - необходимость.
В общем, те же типы управления версиями, которые вы используете в UNIX, также могут использоваться в Windows. Конечно, есть те, которых следует избегать в Windows - сразу приходит на ум VSS .
Короткий ответ, это SVN.
Бесплатно:
CVS практически мертв.
Subversion имеет лучшую интеграцию с windows (explorer, visual studio, eclipse, командная строка, WebDAV, и т.д...) у нее также есть GUI для других платформ.
С Git'ом вы вынуждены использовать исключительно командную строку.
Не бесплатно: Perforce - это хорошо, но что бы вы ни делали, не используйте Visual Sourcesafe и не рискуйте тем, что весь ваш репозиторий будет поврежден в какой-то момент времени, и вы не поймете этого гораздо позже.
До DVCS все крутые ребята использовали SVN; все остальные использовали VSS или TFS.
DVCS превращается в интересную конкуренцию, поскольку Git явно имеет преимущество в функциональности, но Mercurial имеет преимущество в интеграции с Windows. Бедный Базар, похоже, не заглядывает.
Его почти необходимо использовать для взаимодействия с базовой структурой данных, используемой API win32. Я полагаю, что очень большая причина иметь его в .net может быть из-за этой причины.
-121--1732734- Это происходит, когда я устанавливаю бок о бок версии Python на Gentoo. При установке новой версии необходимо либо переустановить новые версии, либо создать символьную ссылку на старые пакеты сайта
.
Мы довольно успешно используем msys-git на окнах. Средства графического интерфейса пользователя не являются отличными. Я использую командную строку, и она работает нормально. Мои коллеги используют git-расширения, которые интегрируются в визуальную студию. Кажется, это работает нормально.
Другим вариантом для меня будет SVN. У него отличная поддержка окон.
TortoiseSVN (svn) имеет тесную интеграцию с проводником, и большинство разработчиков, которых я знаю, работающих под Windows и использующих subversion, также используют Tortoise.
VisualSVN также подключается к VS и использует TortoiseSVN в качестве серверной части. Это 50 долларов за лицензию iirc. Работает неплохо. Если вы ищете хорошую связь с Visual Studio, также проверьте AnkSVN.
Определите исключения в самом месторасположении/обертке
, и btw здесь уже определены исключения.
[% IF template.name.match('\.(css|js|txt)');
debug("Passing page through as text: $template.name");
content;
ELSE;
debug("Applying HTML page layout wrappers to $template.name\n");
content WRAPPER site/html + site/layout;
END;
-%]
-121--2991067- Зачем использовать struct
при работе класса
? Потому что иногда класс
не работает.
В дополнение к причинам производительности, упомянутым Ридом Копси (короткая версия: меньше объектов, которые GC должен отслеживать, что позволяет GC выполнять более качественную работу), существует одно место, где структуры должны использоваться: P/Invoke для функций, которые требуют структур с побочными значениями или элементов структуры.
Предположим, что требуется вызвать функцию CreateProcess () . Далее предположим, что требуется использовать структуру STARTUPINFOEX для параметра lpStartupInfo для CreateProcess ()
.
Ну, что STARTUPINFOEX
?
typedef struct _STARTUPINFOEX {
STARTUPINFO StartupInfo;
PPROC_THREAD_ATTRIBUTE_LIST lpAttributeList;
} STARTUPINFOEX, *LPSTARTUPINFOEX;
Обратите внимание, что STARTUPINFOEX
содержит STARTUPINFO в качестве первого участника. STARTUPINFO
- это структура.
Так как классы - справочные типы, если мы объявили соответствующий тип C# таким образом:
[StructLayout(LayoutKind.Sequential)]
class STARTUPINFO { /* ... */ }
class STARTUPINFOEX { public STARTUPINFO StartupInfo; /* ... */ }
соответствующее расположение в памяти было бы неправильно , как , STARTUPINFOEX.StartupInfo
будет указатель (4 байта на платформах ILP32), НЕ структура (как требуется, 68 байтов в размере на платформах ILP32).
Таким образом, для поддержки вызова произвольных функций, которые принимают произвольные структуры (то есть то, о чем все P/Invoke), необходима одна из двух вещей:
Полностью поддерживать типы значений. Это позволяет C # объявлять тип значения для STARTUPINFO
, который будет иметь правильный формат в памяти для маршалинга (т.е. поддержку struct
, как это имеет C #).
Некоторый альтернативный синтаксис в структурах P/Invokeable, который информирует маршалера среды выполнения о том, что этот член должен быть выложен как тип значения, а не как указатель.
(2) является работоспособным решением (и может быть использовано в J/Direct в Visual J++; Я не помню), но учитывая, что правильные типы значений более гибки, позволяют ряд оптимизаций производительности, которые иначе не достижимы, и разумно использовать в сценариях P/Invoke, неудивительно, что C # поддерживает типы значений.
-121--1732727-Я бы согласился: Subversion. Но я совершенно уверен, что это удастся через день.
Да, TortioseSVN довольно хорошо работает в Windows. Также есть Tortoise для git! Хотя я не уверен, так ли это просто, как его кузен SVN.