Я недавно прочитал прошлогодний пост Фила Хаака (Наиболее полезные служебные классы .NET, которые разработчики склонны изобретать заново, а не использовать повторно) и подумал, что посмотрю, есть ли у кого-нибудь дополнения к списку.
возможный дубликат Скрытые классы библиотеки базовых классов .NET?





Enum.Parse ()
«Reflection => slow» - нелепое обобщение и чрезмерное упрощение. Чтобы использовать тип, сборка должна быть уже загружена в память. Следовательно, используемое здесь «отражение» - это просто ссылка на существующий массив. Вы не могли бы лучше прокатить свою собственную.
Торо, зачем ты вообще программируешь .NET? Это медленно ..
String.Format.
Сколько раз я видел
return "£" & iSomeValue
скорее, чем
return String.Format ("{0:c}", iSomeValue)
или люди, добавляющие знаки процента - и тому подобное.
String.Format был реализован для миграторов C++. return "£" & iSomeValue написать намного проще. Лично я ненавижу String.Format.
@Stimpy, string.Format () лучше для локализации.
Это не локализация, это замена правильных данных неправильными данными. Если что-то стоит 5 фунтов стерлингов, вы должны показать 5 фунтов стерлингов, а не 5 долларов. 5 фунтов - это не 5 долларов.
String.IsNullOrEmpty()
Хотя пару лет назад была некоторая шумиха о том, что IsNullOrEmpty ломается во вложенных циклах ...
Я не уверен, что помню что-нибудь в этом роде, я использовал его в довольно вложенных циклах и алгоритмах, так как .NET 1.0
Мне нравится создавать метод расширения «IsNullOrEmpty» [и «IsNotNullOrEmpty»] для строк ... считается ли это обновлением?
Проверяет ли IsNullOrEmpty (), также является ли string.Trim () == string.empty пустым?
@KallDrexx Я думаю, они планировали добавить проверку только пробелов в C# 4
@KallDrexx: Нет, это простая проверка на соответствие null и Length == 0
@KallDrexx Существует (по крайней мере, в .NET 4.0) метод String.IsNullOrWhitespace ()
String.Join () (однако почти все знают о string.Split и, кажется, используют его при каждой возможности ...)
Зачем мне использовать String.Join вместо плюса?
Я предполагаю, что вы путаете String.Join (msdn.microsoft.com/en-us/library/57a79xd0.aspx) с String.Concat. (Плюс - это псевдоним последнего.)
+1. Глупо, как часто я вижу, как кто-то изобретает велосипед, создавая StringBuilder, делая логическое значение для isFirstElement и выполняя переход через коллекцию, добавляя "," перед каждым элементом, кроме первого. Просто добавьте элементы в List <string>, затем вызовите ToArray () и string.Join ().
Тем не менее, у PHP есть хорошая возможность: пропускать пустые (или пустые) строки при присоединении. Итак, когда вы выполняете String.Join(", ", LastName, FirstName), а LastName или FirstName внезапно становится null или String.Empty, у вас не уродливые ", Doe" или "John, ", но "Doe" или "John" соответственно.
@JoeWhite Просто для обновления для всех, кто наткнется на это - начиная с .NET 4 есть перегрузки, которые принимают IEnumerable<T> или IEnumerable<string>, поэтому нет необходимости в ToArray(): msdn.microsoft.com/en-us/library/dd992421 :-)
System.Text.RegularExpressions.Regex
На самом деле я бы пошел другим путем - где многие люди немедленно перейдут к решению проблемы с помощью регулярного выражения, даже если есть более простой и быстрый метод без регулярного выражения.
БАШ! Regex УДИВИТЕЛЬНЫЙ. Долой свой пренебрежительный комментарий!
Ура за ответ через 4 года в будущем! Но стоит сказать .. Регулярное выражение ЖАРКОЕ МЕДЛЕННО !!!! String.Split () работает для всех, кроме самых сложных вещей, и если вы используете его с правильными перегрузками, это тоже довольно быстро.
Многим людям, кажется, нравится проходить через XML-файл вручную, чтобы найти что-то, вместо того, чтобы использовать XPathNaviagator.
Мне всегда нравится читать XML в таблице данных, а затем фильтровать ее. Прекрасные, прекрасные данные!
Я не знаком с XML -> DataTables. Разве для этого не требуется, чтобы XML был одноуровневым (это означает, что XML был плохим выбором для данных для начала)
input.StartsWith("stuff") вместо Regex.IsMatch(input, @"^stuff")
кроме input.StartsWith () будет работать примерно в 10 раз лучше. ЯГНИ и ПОЦЕЛУЙ!
Ха! Вы правы. Отредактировано, чтобы расположить их в правильном порядке.
Более того, в StartsWith () встроена хорошая семантика - человек, читающий это, точно знает, что задумано.
Обновление для комментариев, а не для публикации ...
Зачем вам прибегать к RegEx, если уже есть способ сделать именно то, что вам нужно?
Path.GetFileNameWithoutExtension(string path)
Возвращает имя файла из указанной строки пути без расширения.
Path.GetTempFileName()
Создает на диске временный файл нулевого байта с уникальным именем и возвращает полный путь к этому файлу.
Действительно ли GetTempFileName создает на диске файл с нулевым байтом? Что за плохо названный метод, если это так ...
Он избегает условий гонки (которые могут быть дырой в безопасности) - как только он возвращает имя файла, он гарантированно существует.
Метод до сих пор плохо назван. Давайте изобретем метод Path.CreateTempfile (), который возвращает временное имя файла, но на самом деле не создает файл. Это будет плохо из-за условий гонки, но он будет прекрасно называться GetTempFileName.
Эквивалентный метод, с помощью которого не создает файл, называется GetRandomFileName.
@Windowsprogrammer Кажется, это так называется, потому что та же функция в Win32 API называется. Не то чтобы это хорошая причина продолжать плохо называть функции, просто скажу.
Жесткое кодирование / в строку управления каталогом по сравнению с использованием:
IO.Path.DirectorySeparatorChar
Почему бы не использовать Path.Combine и вообще игнорировать DirectorySeparatorChar.
были ситуации, когда мне нужен был один персонаж
Хотя нет никакого реального недостатка в том, чтобы поставить "/" вместо того, чтобы возиться с длинным именем переменной. В любом случае никого не волнует Mono в 99% случаев. И я не вижу другой веской причины его использовать.
"/" отлично работает в Mono. Это "\" специфично для Windows (хотя "/" работает и для большинства WinAPI).
Файловый материал.
using System.IO;
File.Exists(FileNamePath)
Directory.Exists(strDirPath)
File.Move(currentLocation, newLocation);
File.Delete(fileToDelete);
Directory.CreateDirectory(directory)
System.IO.FileStream file = System.IO.File.Create(fullFilePath);
System.IO.File.ReadAllText против логики записи с использованием StreamReader для небольших файлов.
System.IO.File.WriteAllText против логики записи с использованием StreamWriter для небольших файлов.
Я думаю, вы имели в виду System.IO.File.ReadAllText, System.IO.File.WriteAllText.
Люди склонны использовать следующее, что некрасиво и обречено на провал:
string path = basePath + "\" + fileName;
Лучше и безопаснее:
string path = Path.Combine(basePath, fileName);
Также я видел, как люди писали собственный метод чтения всех байтов из файла. Это очень удобно:
byte[] fileData = File.ReadAllBytes(path); // use path from Path.Combine
Как указал Ксеноцид, то же самое относится к File.ReadAllText() и File.ReadAllLines().
То же самое для File.ReadAllText и File.WriteAllText
Я думаю, что я должен быть одним из 5 человек, которые на самом деле используют их вне чана!
Хороший. Я только что узнал кое-что новое.
В материалах, которые я видел, всегда забывают о Path.Append.
Такого метода нет. Вы имеете в виду Path.Combine?
Класс StringBuilder и особенно метод AppendFormat.
P.S .: Если вы ищете измерение производительности String Operations: StringBuilder против операций со строками / быстрыми строками в .NET 2.0
См. Также класс StringWriter!
Пытаюсь выяснить, где находятся Мои документы на компьютере пользователя. Просто используйте следующее:
string directory =
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
В VB.Net: My.Computer.FileSystem.SpecialFolders.MyDocuments
Класс System.Diagnostics.Stopwatch.
Замечательно! Не знал, что это существует. Он делает такую простую вещь, но приятно, что она уже завернута.
Большинство людей забывают, что Directory.CreateDirectory () корректно ухудшается, если папка уже существует, и оборачивают ее бессмысленным вызовом if (! Directory.Exists (....)).
Это неправда. В ASP.NET 2.0 (мой тест) Directory.CreateDirectory (некоторый путь) выдает исключение, если каталог уже существует.
У вас может быть что-то еще, если оно вызывает исключение, например, каталог, доступный только для чтения, или существующий файл с тем же именем, что и путь, который вы пытаетесь создать.
Environment.NewLine
Мне недавно нужно было загрузить некоторые файлы в приложении Windows. Я нашел метод DownloadFile в объекте WebClient:
WebClient wc = new WebClient();
wc.DownloadFile(sourceURLAddress, destFileName);
Вместо создания имени файла с помощью Guid просто используйте:
Path.GetRandomFileName()
myString.Equals (другаяСтрока)
и варианты, в том числе культурно-зависимые.
Готов поспорить, что по крайней мере 50% разработчиков пишут что-то вроде: if (s == "id") {...}
Хотя строка является ссылочным типом, операторы равенства (== и! =) Определены для сравнения значений строковых объектов, а не ссылок. Это делает тестирование на равенство строк более интуитивным. msdn.microsoft.com/en-us/library/362314fe%28VS.80%29.aspx
Многие из новых функций Linq кажутся довольно неизвестными:
Any<T>() & All<T>()
if ( myCollection.Any( x => x.IsSomething ) )
//...
bool allValid = myCollection.All(
x => x.IsValid );
ToList<T>(), ToArray<T>(), ToDictionary<T>()
var newDict = myCollection.ToDictionary(
x => x.Name,
x => x.Value );
First<T>(), FirstOrDefault<T>()
return dbAccessor.GetFromTable( id ).
FirstOrDefault();
Where<T>()
//instead of
foreach( Type item in myCollection )
if ( item.IsValid )
//do stuff
//you can also do
foreach( var item in myCollection.Where( x => x.IsValid ) )
//do stuff
//note only a simple sample - the logic could be a lot more complex
Все действительно полезные маленькие функции, которые вы можете использовать вне синтаксиса Linq.
Несмотря на то, что он скрыт под пространством имен Microsoft.VisualBasic, TextFieldParser на самом деле является очень хорошим парсером csv. Я вижу, что многие люди либо выкручивают свои собственные (плохо), либо используют что-то вроде красивой библиотеки Быстрый CSV в Code Plex, даже не зная, что это уже встроено в структуру.
Это должно быть CW