2008-10-07 9 views
55

Recientemente leí esta publicación de Phil Haack (The Most Useful .NET Utility Classes Developers Tend To Reinvent Rather Than Reuse) del año pasado, y pensé que vería si alguien tiene alguna adición a la lista.Los desarrolladores de clases de utilidad .NET más útiles tienden a reinventar en lugar de reutilizar

+7

Esto debería ser CW – abatishchev

+0

posible duplicado de [Clases de biblioteca de clases base ocultas .NET?] (Http://stackoverflow.com/questions/122784/hidden-net-base-class-library-classes) –

Respuesta

22

Enum.Parse()

+0

Utiliza reflection = > lento –

+10

"reflexión => lento" es una generalización ridícula y una simplificación excesiva. Para usar el tipo, el ensamblaje ya debe estar cargado en la memoria. Por lo tanto, el "reflejo" utilizado aquí es solo obtener una referencia a una matriz existente. No podrías hacer mejor rodando el tuyo. –

+2

Toro, ¿por qué programa .NET en absoluto? Es lento ... – Valentin

23

String.Format.

El número de veces que he visto

return "£" & iSomeValue 

en lugar de

return String.Format ("{0:c}", iSomeValue) 

o personas añadiendo signos de porcentaje - cosas por el estilo.

+1

String.Format se implementó para los migradores de C++. return "£" e iSomeValue es mucho más fácil de escribir. Personalmente, odio String.Format. –

+2

@Stimpy, string.Format() es mejor para la localización. –

+7

Esto no es una localización, esto está reemplazando datos correctos con datos incorrectos. Si algo es £ 5, debería mostrar £ 5, no $ 5. £ 5 no es $ 5. –

36

String.IsNullOrEmpty()

+0

Aunque hubo algunos problemas sobre IsNullOrEmpty rompiendo si en los bucles anidados hace un par de años ... –

+0

No estoy tan seguro de recordar algo por el estilo, lo he usado en loops y algoritmos bastante anidados desde .NET 1.0 – TheXenocide

+0

... ¡ahora dime! – bouvard

19

string.join() (sin embargo, casi todo el mundo conoce string.split y parece usarlo cada vez que pueden ...)

+0

¿Por qué usaría String.Join sobre un signo más? – Karl

+0

Supongo que está confundiendo String.Join (http://msdn.microsoft.com/en-us/library/57a79xd0.aspx) con String.Concat. (Además es un alias para este último.) –

+10

+1. Es tonto con qué frecuencia veo a alguien reinventar la rueda creando un StringBuilder, haciendo un booleano para isFirstElement, y buscando a través de una colección, anteponiendo "," antes de cada elemento excepto el primero. Simplemente agregue los elementos a una lista , luego llame a ToArray() y string.Join(). –

8

System.Text.RegularExpressions.Regex

+0

De hecho, iría por el otro lado, donde muchas personas irán inmediatamente a una solución de expresiones regulares para un problema, incluso si hay un método no regex más simple y más rápido. –

+0

BAH! Regex es FRIGGEN AWESOME. ¡Fuera con tu comentario desdeñoso! – Will

+0

¡Yay por responder 4 años en el futuro! Pero vale la pena decirlo ... Regex es FRIGGEN SLOW !!!! String.Split() funciona para todo menos para las cosas más complicadas y si lo usas con las sobrecargas correctas también es bastante rápido. – TheFuzzyGiggler

4

Parece que a muchas personas les gusta recorrer manualmente un archivo XML para encontrar algo en lugar de utilizar XPathNaviagator.

+0

Siempre me gusta leer el XML en una tabla de datos y luego filtrarlo. Encantadoras y encantadoras tablas de datos –

+0

No estoy familiarizado con XML -> DataTables. ¿No requiere que el XML tenga un nivel (significa que XML fue una mala elección para los datos para comenzar) –

8

input.StartsWith("stuff") en lugar de Regex.IsMatch(input, @"^stuff")

+4

, excepto la entrada. StarsWith() tendrá un rendimiento aproximadamente 10 veces mejor. YAGNI y KISS! –

+0

¡Hah! Estás en lo correcto. Editado para ponerlos en el orden correcto. – mmacaulay

+1

No solo eso, sino que StartsWith() tiene una buena semántica incorporada: la persona que lee esto sabe exactamente lo que se pretende. –

35
Path.GetFileNameWithoutExtension(string path) 

Devuelve el nombre del archivo de la cadena de ruta especificada sin la extensión.

Path.GetTempFileName() 

Crea un archivo temporal de cero bytes con nombre único en el disco y devuelve la ruta completa de ese archivo.

+1

¿GetTempFileName realmente crea un archivo de cero bytes en el disco? Qué método tan mal nombrado si ese es el caso .... – Carl

+0

Evita las condiciones de carrera (lo que podría ser un agujero de seguridad): una vez que se devuelve el nombre del archivo, se garantiza que existe. –

+3

El método aún está mal nombrado. Inventemos el método Path.CreateTempfile() que devuelve un nombre de archivo temporal pero no crea realmente el archivo. Va a ser malo debido a las condiciones de carrera, pero será tan bien nombrado como GetTempFileName. –

14

duro de codificación a/en una cadena de manipulación frente a la utilización de directorios:

IO.Path.DirectorySeparatorChar 
+3

¿Por qué no Path.Combine e ignora DirectorySeparatorChar por completo. – user7116

+2

ha habido situaciones en las que he necesitado el personaje solo – TheXenocide

+0

Aunque no hay una desventaja real al poner un "/" en lugar de molestar con el nombre de la variable larga. A nadie le importa Mono el 99% de las veces de todos modos. Y no veo ninguna otra buena razón para usarlo. –

6

materia de archivos.

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); 
6

System.IO.File.ReadAllText vs escritura lógica usando un StreamReader para archivos pequeños.

System.IO.File.WriteAllText frente a la lógica de escritura utilizando un StreamWriter para archivos pequeños.

+1

Creo que se refería a System.IO.File.ReadAllText, System.IO.File.WriteAllText. –

46

La gente tiende a usar los siguientes, que es feo y destinada al fracaso:

string path = basePath + "\\" + fileName; 

mejor y más segura manera:

string path = Path.Combine(basePath, fileName); 

También he visto gente que escribe método personalizado para leer todos los bytes desde el archivo. Este viene bastante práctico:

byte[] fileData = File.ReadAllBytes(path); // use path from Path.Combine 

Como TheXenocide señalado, mismo se aplica para File.ReadAllText() y File.ReadAllLines()

+0

Lo mismo para File.ReadAllText y File.WriteAllText – TheXenocide

+0

¡Creo que debo ser una de las 5 personas que realmente los utilizan fuera de la cuba! – RCIX

+0

Agradable. Acabo de aprender algo nuevo. – Phil

-5

Path.Append siempre se olvida en cosas que he visto.

+3

No hay tal método. ¿Te refieres a Path.Combine? –

20

Tratando de averiguar dónde vive Mis documentos en el ordenador de un usuario. Simplemente use lo siguiente:

string directory = 
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 
+5

En VB.Net: My.Computer.FileSystem.SpecialFolders.MyDocuments –

28

Clase System.Diagnostics.Stopwatch.

+0

¡Eso es genial! No sabía que esta existía. Hace algo tan simple, pero es bueno tenerlo terminado ya. – Sambo

4

La mayoría de las personas se olvidan de que Directory.CreateDirectory() se degrada graciosamente si la carpeta ya existe, y la envuelve con una llamada inútil, if (! Directory.Exists (....)).

+0

Esto no es cierto. En ASP.NET 2.0 (mi prueba), Directory.CreateDirectory (alguna ruta) lanzará una excepción si el directorio ya existe. –

+0

Puede que ocurra algo más si arroja una excepción, como que el directorio sea de solo lectura o un ** archivo ** existente con el mismo nombre que la ruta que está intentando crear. –

12
Environment.NewLine 
20

Necesito descargar algunos archivos recientemente en una aplicación de Windows. He encontrado el método DownloadFile en el objeto cliente Web:

WebClient wc = new WebClient(); 
    wc.DownloadFile(sourceURLAddress, destFileName); 
12

En lugar de generar un nombre de archivo con un GUID, sólo tiene que utilizar:

Path.GetRandomFileName() 
1

myString.Equals (anotherString)

y opciones, incluyendo los específicos de la cultura.

apuesto a que al menos el 50% de los desarrolladores escribir algo como: if (s == "id") {...}

+1

Aunque string es un tipo de referencia, los operadores de igualdad (== y! =) Se definen para comparar los valores de los objetos de cadena, no de las referencias. Esto hace que las pruebas de igualdad de cadenas sean más intuitivas. http://msdn.microsoft.com/en-us/library/362314fe%28VS.80%29.aspx – atamanroman

10

Muchas de las nuevas características de Linq parece bastante desconocida:

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 

Todos pequeñas funciones muy útiles que se pueden utilizar fuera de la sintaxis de LINQ.

7

Por todo lo que está escondido bajo el espacio de nombres Microsoft.VisualBasic, TextFieldParser es en realidad un muy buen analizador de csv. Veo a mucha gente hacer rodar los suyos (mal) o usar algo como la buena biblioteca Fast CSV en Code Plex, sin saber siquiera que esto ya está incluido en el marco.

Cuestiones relacionadas