¿El desarrollo de C # es efectivamente inseparable del IDE que usa?


41

Soy un programador de Python que está aprendiendo C # que está tratando de dejar de preocuparse y simplemente ama C # por lo que es, en lugar de compararlo constantemente con Python.

Estoy atrapado en un punto: la falta de información explícita sobre dónde se definen las cosas, como se detalla en esta pregunta de Stack Overflow . En resumen: en C #, using foono le dice de qué nombres fooestán disponibles, lo que es análogo a from foo import *Python, una forma que se desaconseja dentro de la cultura de codificación de Python por ser implícita en lugar del enfoque más explícito from foo import bar.

Me sorprendieron bastante las respuestas de Stack Overflow a este punto de los programadores de C #, que era que, en la práctica, esta falta de explicidad realmente no importa porque en su IDE (presumiblemente Visual Studio) puede pasar el cursor sobre un nombre y se lo dirá El sistema de donde proviene el nombre. P.ej:

Ahora, en teoría, me doy cuenta de que esto significa que cuando buscas con un editor de texto, no puedes saber de dónde provienen los tipos en C # ... pero en la práctica, no creo que eso sea un problema. ¿Con qué frecuencia estás mirando el código y no puedes usar Visual Studio?

Esto es revelador para mí. Muchos programadores de Python prefieren un enfoque de editor de texto para la codificación, usando algo como Sublime Text 2 o vim, donde se trata del código, además de herramientas de línea de comandos y acceso directo y manipulación de carpetas y archivos. La idea de depender de un IDE para comprender el código a un nivel tan básico parece anatema. Parece que la cultura C # es radicalmente diferente en este punto. Y me pregunto si solo necesito aceptar y aceptar eso como parte de mi aprendizaje de C #.

Lo que me lleva a mi pregunta aquí: ¿el desarrollo de C # es efectivamente inseparable del IDE que usa?


77
Python es un lenguaje dinámico, C # estáticamente tipado (como Java), por lo que la forma de codificar es muy diferente.
Oded

66
@Oded using MyType = MyNamespace.MyType;:?
pdr

44
No sé cómo es en Python, pero en C # siempre puedes comenzar global::y trabajar desde allí. usingno pone a disposición nada que no fuera antes; solo facilita el acceso (ya que se necesita menos escritura para usar una clase en particular).
un CVn

55
"Muchos programadores de Python prefieren un enfoque de editor de texto para la codificación, usando algo como Sublime Text 2 o vim, donde todo se trata del código, además de herramientas de línea de comandos y acceso directo y manipulación de carpetas y archivos". - Lo que me suena terriblemente ineficaz. Un IDE es una herramienta que te ayuda a ser más productivo. Claro que puedes construir una casa con un martillo y una sierra manual y cortar los árboles tú mismo, pero creo que lo harías mucho más rápido con algunas herramientas eléctricas y comprando madera precortada.
Andy

2
@ Andy - Puedo ver que suena así. Pero estos editores de texto son realmente muy potentes y ofrecen un montón de herramientas y funciones de eficiencia del programador. Es solo una forma radicalmente diferente de obtener y usar esas herramientas y características que un IDE (y una que puede ser más o menos apropiada para ciertos lenguajes / culturas de programación).
Ghopper21

Respuestas:


26

Visual Studio es tan conveniente que después de trabajar con él por un tiempo es difícil usar un IDE diferente. Tiene muchas herramientas útiles y un montón de complementos disponibles, por lo que prácticamente tiene todas las funciones que necesitaría.

Por otro lado, sea cual sea el idioma que aprenda, se recomienda utilizar la línea de comandos al principio, para que pueda comprender mejor cómo funciona. C # no es una excepción.

¿El desarrollo de C # es efectivamente inseparable del IDE que utiliza?

Teóricamente no, pero prácticamente sí. Es posible escribir en C # usando un editor de texto y una línea de comando, pero si tiene Visual Studio, nunca lo haría. De hecho, muy pocos programadores han ejecutado código C # desde la línea de comandos.

Por cierto, si se siente incómodo using foo, puede usar toda la ruta al usar un tipo.


99
SharpDevelop y MonoDevelop son IDE alternativos a Visual Studio.
Oded

@Oded, nunca los he usado, pero es interesante echar un vistazo. Gracias))
superM

Gracias superM: ¿puedes dar una idea de los tipos de características que hacen que Visual Studio sea tan indispensable? Sé que tiene muy buena terminación de código, pero ¿qué más? ¿Es más o menos como Eclipse para C #, o hay algo más específico al respecto en el que confían los desarrolladores de C #?
Ghopper21

2
@ Ghopper21: Sugeriría que es más comparable a IntelliJ que a Eclipse (especialmente cuando incluye Resharper), excepto que, en el mundo .NET, los complementos de la comunidad generalmente están escritos para Visual Studio.
pdr

55
+1: Estoy de acuerdo, aunque puedes escribir código en la línea de comandos con el bloc de notas, serías un idiota si ignoras las herramientas que VS o Sharp Develop traen a la mesa.
Binario Worrier

33

La idea de depender de un IDE para comprender el código a un nivel tan básico parece anatema.

No se trata de entender su código: dado el tiempo suficiente, siempre puede localizar la variable correcta con un editor de texto básico o incluso en una copia impresa. En lo que respecta a la comprensión del código, la dependencia IDE no existe en absoluto.

Localizar sus referencias de manera eficiente es un tema completamente diferente: me encanta la capacidad de encontrar usos de variables Java en Eclipse tanto como me encanta encontrar puntos de declaración en Visual Studio, tanto para C # como para C ++. Prefiero pasar mi tiempo codificando, en lugar de buscar puntos de declaración manualmente. Esto es similar a hacer matemáticas: puedo multiplicar números de varios dígitos en una hoja de papel, pero prefiero usar la calculadora para ahorrarme uno o dos minutos.

Comenzando en un cierto "tamaño crítico" del código, un buen IDE se vuelve muy útil independientemente del lenguaje de programación. El tamaño puede variar de un idioma a otro, pero una vez que cruza varios miles de líneas, tener un IDE ayuda independientemente de su idioma. Esto tiene más que ver con las limitaciones de una mente humana que con un lenguaje de programación particular: en algún momento, su memoria a corto plazo está destinada a "desbordarse".

Hay trucos que le permiten aumentar ese tamaño crítico donde IDE se vuelve útil. Por ejemplo, podría seguir una convención de nomenclatura (los nombres húngaros fueron importantes en el mundo de C ++ en algún momento, especialmente entre los profesionales de Windows). Otro truco común es calificar las variables de instancia this.incluso en contextos donde no se requiere dicha calificación.

Estos trucos vienen con compensaciones: casi inevitablemente, hacen que su programa sea menos legible al ocultar nombres o al insertar las referencias explícitas que la encapsulación pretendía ocultar. Ante la elección, elijo un código de aspecto limpio más un IDE sobre un código de aspecto menos limpio menos un IDE. Sin embargo, reconozco plenamente que las elecciones de otras personas pueden diferir de las mías.


1
Probablemente debería haber dicho "leer rápidamente el código" ... Es un cambio mental para mí no tener todas las referencias allí mismo en el mismo archivo fuente, y en su lugar utilizar herramientas para localizar esas referencias.
Ghopper21

55
No es que no pudiera elegir usar thisidiosincráticamente, pero la codificación no es un arte aislado y creo que es mejor seguir (o al menos comenzar) las normas de una cultura de codificación, es decir, ser "Pythonic" con Python y cualquiera que sea el equivalente "C # way" es con C #. Y está claro por las respuestas y comentarios aquí que usar un buen IDE como Visual Studio es fundamental para la "forma C #" (si esa es la forma correcta de decirlo).
Ghopper21

3
@ Ghopper21 Lo que te encontrarás con C # no es que no puedas escribirlo sin un IDE, sino que la gran mayoría del código C # se escribió en un IDE y todos los desarrolladores usan ese IDE. Este hecho, combinado con Intellisense, hace que los desarrolladores caigan en la trampa de la memoria de Google, ya que los estudios han hablado sobre huffingtonpost.com/2011/07/15/… "Según los hallazgos de los estudios, las personas con acceso al índice web masivo de Google tienen menos probabilidades de recuerdan un hecho cuando se les solicita; sin embargo, recuerdan dónde y cómo ubicar ese hecho en línea "
Jimmy Hoffa

2
@ Ghopper21 No digo que esta trampa de memoria sea mala , es una fuente de productividad extremadamente aumentada para la mayoría, razón por la cual solo aquellos con largos recuerdos de los días en que podían memorizar toda la API con la que trabajaban realmente se quejan de ello. Simplemente estoy señalando esto porque este hecho afecta directamente el código de C # que leerá y el estilo y la cultura del desarrollo de C #.
Jimmy Hoffa

1
Nunca bajé a las API de BIOS de bajo / bajo nivel; pero mi primer idioma / entorno fue Borland TurboPascal; y probablemente tenía ~ 90% de la biblioteca de idioma / estándar memorizada en un punto. Las excepciones principales están relacionadas con la incapacidad total de entender de qué se suponía que se trataba OO.
Dan Neely

8

Muchos programadores de Python prefieren un enfoque de editor de texto para la codificación, usando algo como Sublime Text 2 o vim, donde se trata del código, además de herramientas de línea de comandos y acceso directo y manipulación de carpetas y archivos.

Eso es genial, pero se pierde el punto de VS IDE. El objetivo de un IDE como VS es un rápido soporte de desarrollo a través de herramientas de código fuertes como refactorización e intellisense. VS es un editor muy muy bueno para el código C #.

Ahora C # le permite codificar en un estilo que depende de su IDE en mayor medida (puede usar muchas varpalabras clave y similares). Algunas personas prefieren ser más explícitas, por ejemplo, utilizando alias de espacio de nombres para tener claro a qué espacio de nombres pertenece una clase (como importen Java o Python). Esa es más una opción de estilo de codificación que una característica del lenguaje.

Como C # se escribe estáticamente (aunque con algunas extensiones dinámicas, a partir de v4) siempre es bastante fácil averiguar a qué tipos se hace referencia; si están equivocados, el código no se compilará y VS no es el único IDE con soporte para C # intellisense. Sin embargo, es probablemente el mejor.

Desarrollar C # sin un IDE potente (como VS) es como martillar clavos con la mano cuando ya tienes una pistola de clavos de alta gama; puede que sea el momento extraño que necesites hacerlo, pero los profesionales usan la herramienta adecuada para el trabajo .

Yo diría que lo mismo es probablemente cierto también para Java. Si hay un IDE poderoso con intellisense y herramientas de refactorización de código, probablemente debería estar usándolo.

Sin embargo, mírelo al revés: si no desea intellisense, compile la verificación de código de tiempo y el análisis / refactorización de código, entonces un IDE hinchado no es el camino a seguir, y tampoco lo es un lenguaje estáticamente tipado. Creo que es al revés:

Muchos programadores que prefieren un enfoque de editor de texto para la codificación no obtienen tanto de los lenguajes tipados estáticamente (como C # y Java) y, por lo tanto, podrían estar mejor si se adhieren a los dinámicos como Python y Javascript.

Yo creo que:

  • Los lenguajes dinámicos se adaptan a herramientas livianas (los IDE pesados ​​confieren menos beneficios aquí)
  • Los lenguajes estáticos se adaptan a IDE potentes (las herramientas pueden ayudar con el código a costa de la flexibilidad)

+1 para la cotización invertida.
fbmd

5

Para responder a su pregunta: aunque está cambiando lentamente, el entorno de desarrollo de Microsoft ha sido en gran medida un monocultivo .

Este enfoque tiene muchos aspectos positivos y negativos, que podrían discutirse extensamente (por ejemplo, considere los pros y los contras de las plataformas abiertas y cerradas, como las PC frente a una Xbox), pero al final del día, la herramienta de Microsoft es lo que más La gente usa. La compañía también ha demostrado que su toma de decisiones es a menudo una especie de proceso de "dar el mayor valor a la mayoría de nuestros usuarios", siempre buscando compromisos prácticos (más recientemente, considere la posibilidad de Typecript ). Básicamente, no me sorprendería descubrir que el desarrollo de C # se hizo / se hace con las herramientas (VS) en mente.


Por cierto, se podría argumentar que Python también es su propio monocultivo, dada su fuerte adhesión a lo que se considera "Pitónico" en el estilo y enfoque de codificación, y el principio de diseño central del lenguaje de tener una forma obvia y correcta de hacer las cosas. Tiendo a pensar que la programación de monocultivos en este sentido puede ser muy buena, ya que crea una comunidad coherente y un código que se puede compartir. Es simplemente (¿muy malo? ¿Y / o una oportunidad para expandir mi mente?) Que las culturas Python y C # sean tan ... ¡diferentes!
Ghopper21

2
@ Ghopper21 Ese es un muy buen punto sobre Python. Creo que la versión de MS de "debería haber una forma única y obvia de hacerlo" se extiende a la elección de IDE :)
Daniel B

4

Por un lado, C # no es Python. Existen diferentes metodologías de diseño.

Ahora, para responder a su pregunta, es completamente posible usar su Python-esque usando declaraciones.

using FooBar=MyName.Foo.FooBar; 

Es solo que definitivamente no es la norma porque no es tan fácil. Sin embargo, creo que debería preocuparse menos por saber exactamente de dónde viene exactamente cada clase. Sin embargo, no entiendo el punto completo de hacerlo de esta manera en Python.

Y también, C # es un lenguaje que se presta muy bien para usar IDEs para hacerlo más fácil. Intellisense es increíblemente simple de implementar, especialmente en comparación con lenguajes dinámicos como Ruby y Python. Sin embargo, no tiene que estar atascado en su IDE. He oído hablar de personas que usan Eclipse. También hay, por supuesto, MonoDevelop (que uso bastante), e incluso puedes trabajar desde una línea de comandos. En mi servidor a veces, editaré archivos C # viy luego los usaré xbuildpara reconstruirlos ... Es solo que usar un IDE hace las cosas mucho más fáciles en comparación con la línea de comandos para casos típicos.


4

¿Alguien se molesta en leer aquí?

Resumo diciendo que la funcionalidad IDE masivamente compleja es indispensable y que (debería) evolucionar al Zen de Sublime VimNess algún día ...

Nuestro software tiene 129 proyectos de aproximadamente 2M LOC. Agregue la masividad del marco .NET y dado todo lo que puedo decir es que el IDE es vital, trascendiendo las motivaciones de la pregunta de este hilo.

Información sobre la base del código

Período. Conoces el tipo de características de las que estamos hablando; excepto que su conveniencia se vuelve indispensable y esencial con el tipo de código base con el que trato.

Escribo un código mejor debido al IDE. Siempre agrego mensajes personalizados a mis pruebas de Nunit porque es fácil, rápido y preciso. Estoy a favor de enumeraciones sobre cadenas debido en gran parte a intellisense. No dudo en usar nombres descriptivos / largos: una declaración de varias líneas se compone de forma rápida y limpia.

Pero incluso esta inteligencia es demasiado a veces. A menudo uso la búsqueda de texto "buscar en archivos".

Ayuda de codificación

Aquí es donde a menudo lloro "¡suficiente!". Imagine una pantalla llena con una docena de colores en su mayoría oscuros, algunas variables particulares resaltadas en todas partes, resaltando las llaves ocultando lo que realmente es la llave, subrayando onduladamente en todas partes porque "quiere" que escriba literatura, no códigos, iconos para menús contextuales de Resharper (usted solo tengo que hacer clic en él y luego ignorarlo la mayor parte del tiempo), una ventana emergente de ayuda de la firma que abarca 2/3 de la pantalla horizontalmente, verticalmente mostrando varias sobrecargas, una ventana emergente debido a donde acabas de dejar el cursor del mouse ... I ¡Ni siquiera puedo ver el & ^!% line * s * del código en el que estoy trabajando!

Vis.Stud. necesita abrazar el minimalismo para que pueda centrarme en la codificación y no pasar por cientos (miles si cuenta cada configuración de codificación de color y todos esos complementos) de configuraciones en una batalla perdida para recuperar la cordura. Una tecla " Pareto " sería genial.


1
Realmente aprecio tus pensamientos aquí, ya que parece que realmente "lo entiendes" en términos de los enfoques de IDE y "Sublime VimNess" de las cosas. Estoy contigo en todo lo que dices aquí. Espero que suceda.
Ghopper21

3

¿El desarrollo de C # es efectivamente inseparable del IDE que utiliza?

Por supuesto no. ¿Por qué no importarías todo el espacio de nombres? La elección de usar un IDE integrado o un editor de texto no tiene nada que ver con eso. Importar todo el espacio de nombres no hace que sea más difícil leer el código o usarlo.

Recuerde, C # es un lenguaje escrito. Si importa varios espacios de nombres que tienen la misma clase, obtendrá un error de compilación.

Yo personalmente no uso tanto las declaraciones de tipo de ninguna manera. En cambio, uso la varpalabra clave en su lugar por las razones que describo aquí: http://blog.gauffin.org/2012/08/to-var-or-not-to-var-is-that-really-the-question/


1
El problema es leer, no escribir código. (La pregunta de desbordamiento de pila a la que enlazo arriba da un ejemplo). Al leer el código, ¿cómo sabe de dónde viene algo? Con Python, puede buscar una importación explícita (suponiendo que el código siga las convenciones fuertes de Python para usar tales importaciones). Con C #, parece que el consenso es que en la práctica usas un IDE como VS.
Ghopper21

Si no sabe de dónde proviene la clase, es probable que tenga que buscarla de cualquier manera para saber cómo está funcionando. Simplemente google msdn <classname>y haga clic en el primer enlace. Allí obtienes el espacio de nombres también.
jgauffin

Ese enfoque ejemplifica la diferencia cultural. No es que los programadores de Python no busquen en Google, por supuesto que sí, es solo la forma de pensar que es diferente.
Ghopper21

En una nota separada, var en C # es un buen atajo sintético de azúcar / compilador que me gusta para hacer que el código sea menos detallado y repetitivo. Solo desearía poder usarlo en todas partes, no solo dentro de los métodos.
Ghopper21

@ Ghopper21: Sí, lo sé. Mi punto es que Google indexa MSDN bastante bien y obtendrá la documentación directamente al hacerlo. Por lo tanto, realmente no necesita documentar cada clase que utiliza al incluir la ruta completa a la misma.
jgauffin

1

Entendí que en Python, "todo es público" o algo por el estilo. En C #, el diseñador del módulo decide qué es público y qué no lo es, por lo que cuando lo haces importsolo obtienes la API pública de todos modos. Esa podría ser una razón de la diferencia que estás describiendo.


Definitivamente, esa es una gran diferencia entre Python y C #, pero en realidad no me ayuda a entender por qué hay tanta falta de claridad en las importaciones. Como @pbr señaló en su comentario, Java (que también tiene la distinción público / privado) es similar a Python en su preferencia cultural por las importaciones explícitas.
Ghopper21

55
@ Ghopper21: la única razón para preferir las importaciones explícitas en Java (y C ++, por ejemplo) es evitar las colisiones de nombres. C # tomó la decisión de diseño para lidiar con este problema a través de alias de importación / tipo, ya que se manejan mejor cuando realmente tiene una colisión de nombres junto con el beneficio de no tener un montón de importaciones repetitivas que saturan su fuente.
Telastyn

1

¿El desarrollo de C # es efectivamente inseparable del IDE que utiliza?

En mi trabajo anterior, usaba principalmente vim para codificar en lenguajes como C #, JavaScript, Powershell, Perl, C ++, y bastantes desarrolladores solían hacer algo similar. El proyecto era demasiado grande para Visual Studio.

Dicho esto, la mayoría de los desarrolladores de C # se ocupan de proyectos mucho más pequeños y están muy contentos de usar VS.


0

Esta es una vista interesante sobre el desarrollo de C #. Sin embargo, lo que está pidiendo va más allá de C #, si está preguntando sobre el IDE.

Como usted dice, en Python, puede usar varios editores para escribir su código. También puede hacerlo con el marco .NET. También hay otras herramientas IDE que puede usar, como SharpDevelop. Visual Studio está muy desarrollado en conjunto con el marco .NET y es relativamente costoso. Existen herramientas como SharpDevelop y las versiones "Express" de VS para atraer a más desarrolladores a usar .NET. Esencialmente, todo lo que un IDE hace por usted es proporcionar un entorno organizado, generalmente con complementos inteligentes para la productividad y un "ayudante" para ensamblar lo que puede terminar siendo una línea de comandos de aspecto muy aterrador para pasar a su compilador. Lo mismo es cierto para Java, las herramientas como Eclipse solo nos proporcionan mejoras en la organización y la productividad. Bajo el capó, no ocurre nada mágico hasta que construyes o compilas tu proyecto y ese respeto,

Cuando habla sobre la declaración de "uso" en C # y la compara con Python, no es realmente lo mismo que sucede debajo del capó. El compilador utiliza las instrucciones de uso para ayudarlo a transformar su código C # en MSIL. En MSIL, no existe la directiva "importar todas estas clases desde este espacio de nombres". Cuando el código de tiempo está en el nivel MSIL, todas las clases han sido etiquetadas con sus nombres completos. Estas declaraciones de "uso" e "importación" son para ayudar a la legibilidad humana. No son comandos de optimización del compilador. Después de que todo este "etiquetado inicial de nombres completamente calificados" haya continuado, podría haber una especie de "minificación" de bajo nivel para los FQN, pero esto es para ayudar al compilador / intérprete a ejecutarse más rápido.

Una diferencia fundamental final entre todos estos lenguajes mencionados aquí es que algunos de ellos son interpretados por máquinas virtuales, algunos son interpretados al estilo JIT y otros están completamente compilados. La forma en que se implementan estas directivas de uso en esos compiladores e intérpretes es muy diferente.

HTH.


"Estas declaraciones de 'uso' e 'importación' son para ayudar a la legibilidad humana". Sí, esa es una diferencia filosófica clave en el trabajo aquí. La legibilidad a nivel textual es un principio clave de diseño de Python de primer orden. C # no es estrictamente necesario, pero prácticamente confía en un buen IDE como VS para ser "legible". Por cierto, "importar" en Python también tiene más que ver con la legibilidad, a diferencia de "usar" en C #.
Ghopper21

0

Creo que históricamente la respuesta es más o menos sí: conseguir que el desarrollo de C # se ejecute de manera efectiva en cualquier cosa fuera de Visual Studio, Xamarin o SharpDevelop fue una experiencia demasiado desagradable.

Pero recientemente han surgido muchos proyectos que lo hacen más fácil, por ejemplo:

OmniSharp , proporciona una base para intellisense y refactorización, junto con vim, emacs, atom y complementos sublimes. En realidad no lo he usado, así que no sé qué tan bien funciona, pero parece prometedor.

Los generadores Yeoman ASP.NET MVC ayudan a arrancar un nuevo proyecto MVC (quizás existan otros generadores).

paket , una alternativa a NuGet donde puede agregar paquetes NuGet a su proyecto desde la línea de comandos y actualizar sus archivos .csproj (aunque había una herramienta de línea de comandos NuGet, actualizar los proyectos para usar los paquetes era parte del IDE integración, no herramientas de línea de comandos).

Paket tiene la implicación de que tiene que adaptar su código fuente para usarlo, por lo que si se sienta como el único miembro de un equipo y quiere usar un editor de texto para la codificación, y todos los demás usan Visual Studio, tendría que convencer a todos más para adaptar la solución a sus necesidades :(

Por lo tanto, debería poder ponerse en funcionamiento, pero hay mucho más trabajo por hacer para que su cadena de herramientas funcione de manera eficiente.


-1

Ya no:

http://www.omnisharp.net/

OmniSharp es una familia de proyectos de código abierto, cada uno con un objetivo: permitir un excelente desarrollo de .NET en el editor de su elección.

Es divertido decir Cross Platform .NET. ¿Pero es razonable que alguien desarrolle .NET sin Visual Studio y Windows?

¿Es divertido hacer .NET en una Mac en Sublime? Ubuntu y Emacs? Windows y Atom? Puede usar su editor ADEMÁS para usar excelentes funciones como Intellisense (no solo Autocompletar), Agregar referencia, Formatear documento y mucho más. Desarrolle en cualquier lugar, implemente en cualquier lugar (¡y en Azure!)

He probado esto con subime3 y osx

Más muestras en

http://blog.jonathanchannon.com/2014/11/12/csharp-first-class-citizen-sublime-text/


Omnisharp hace posible usar C # con editores de texto, como sublime y emacs. Entonces, ¿por qué se rechaza?
mamcx
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.