versiones usos sirve quién que programacion para evolucion creó caracteristicas antecedentes c# language-features language-design

usos - quién creó c#?



¿Tiene C#muchas características de lenguaje? (13)

¿Debería ser difícil aprender un lenguaje de programación moderno?

Para: idealmente quiere usar el lenguaje más poderoso que pueda, que le permita expresar las cosas correctamente.

En contra: quiere estar pensando en el problema en cuestión en lugar de cómo funciona el lenguaje.

En general: estoy buscando idiomas más potentes, incluso si son más difíciles. Me siento irritado cuando no puedo hacer que el idioma haga lo que necesito, así que tengo que solucionarlo o convertirlo en otro patrón estúpido. No me importa en particular enfrentarme a una nueva sintaxis extraña, porque Internet está a solo un clic de distancia.

Pensamiento adicional editado: intento mantener una sintaxis consistente / lógica al agregar funciones al idioma, pero este no es el hilo correcto para una discusión de lisp.

¿Hay características que C # debería eliminar?

Aprovecho al máximo las nuevas funciones, como LINQ, los métodos de extensión, var (acabo de escribir el tipo, ¿por qué lo vuelvo a escribir?) Y las funciones anónimas. He descubierto que pueden dar algunos beneficios de productividad bastante grandes. Recomendaría a cualquiera que aún no se haya familiarizado con LINQ que se tome un tiempo para aprender Linq-to-Objects, porque es extremadamente conveniente cada vez que tiene que lidiar con la lógica.

Sin embargo, no me gusta particularmente la sintaxis LINQ especial de tipo SQL. Me resulta un poco discordante en el medio del código C #, en mi opinión, choca con el método de objeto que llama al estilo de sintaxis. Sería más feliz con la sintaxis de comprensión de listas más común, como la que se usa, por ejemplo, en Python.

¿Hay nuevas características que C # necesita?

Realmente me gustaría una mejor sintaxis para inicializar rápidamente arreglos (o tal vez IEnumerables?) Y diccionarios. C # es un poco difícil de manejar en este sentido, termino escribiendo tantas llaves. Relacionado con esto, ¡realmente extraño el rendimiento! (produce cada artículo en esta colección) sintaxis.

También me gustaría que C # tome prestada la inferencia de tipo mejorada de F # y quizás sus tuplas y asignación múltiple. Tal vez debería ir y usar F #.

Esta es una discusión que aparece de vez en cuando en nuestro equipo. Mientras unos pocos aprendieron rápidamente las características de C # 3.0, otros se atienen a las técnicas clásicas.

Algunos nunca usan Linq, piensan que las expresiones lambda son confusas y el rendimiento es "aterrador". A veces difícilmente pueden entender el código escrito por personas que usan todas las características nuevas. Solo podemos decir que no dominan el lenguaje y deberían aprenderlo.

Pero, ¿qué tan difícil debería ser aprender un lenguaje de programación moderno? Todos pueden resolver los problemas, todos tienen muchos otros problemas que resolver todos los días que preocuparse por mejores formas de implementarlo. Entrenar a la gente no es gratis. Por otro lado, las características del lenguaje pueden hacer que las personas sean más productivas y el código más sostenible.

Lista probablemente incompleta de características C #

  • clases, estructuras, tipos primitivos, matrices, boxeo, interfaces, herencia (abstracto, virtual, nuevo, sellado), propiedades, nulables
  • excepciones
  • genéricos
  • multi hilos, cerraduras
  • reflexión
  • delegados, eventos, delegados anónimos
  • iteradores
  • expresiones lambda
  • métodos de extensión
  • linq

La versión 4 está próxima e incluye muchas características adicionales.

Personalmente, me gustan casi todas las características de C # y me gusta el código corto y agradable que puedo escribir con este idioma. Pero no tengo que aprenderlo desde cero.

Estoy interesado en tu opinión y tu experiencia con el aprendizaje o la enseñanza de C #. ¿Ya hay demasiadas funciones? Aún faltan características importantes? ¿Las características del idioma hacen que el idioma sea más fácil de usar o simplemente más difícil de aprender?

Por favor: No hay respuestas como "El idioma A es mejor que el idioma B porque ...".


A mí también me gustan la mayoría de las nuevas características y honestamente no quisiera perder los métodos de extensión y linq en general.

En cuanto a la facilidad de aprendizaje, creo que el problema es más un problema para los principiantes, y por experiencia, ponerlos al día es definitivamente una cuestión de seleccionar las mejores ganancias y ayudarlas cuando tropiezan con algo más . Además de multi-threading, la comprensión de los genéricos parece ser clave para obtener el beneficio de las otras características.

Cada característica adicional definitivamente trae beneficios adicionales. Eventualmente, aparecerán nuevos lenguajes que harán que esas mismas características sean más fáciles de usar, pero eso de ninguna manera significa que no debemos tratar de mejorar las que tenemos ahora.


Aunque solo soy un usuario ocasional de C #; con una sólida formación en Delphi, C ++ y Python; Puedo captar el concepto de las características de C # con bastante facilidad. C # es un lenguaje equilibrado en mi opinión. La única molestia es que apenas podía recordar suficiente sintaxis (especialmente relacionada con Linq) en mi cabeza para producir código en la velocidad de mecanografía al tacto como puedo en Python. Mi preferencia hacia la sintaxis pascal también podría obstaculizarme. Sin embargo, con la ayuda del todopoderoso Visual Studio.NET Express, esto no es un problema en absoluto.

Siempre que proporcionen una herramienta tan increíble de forma gratuita, creo que C # con VS.NET se encuentra entre los mejores entornos de codificación disponibles.


Creo que el problema radica en las personas que solo tienen que usar la sintaxis más nueva para todo, en todas partes. Hacen que un simple programa ''Hello World'' parezca una explosión en una fábrica de spaghetti.

Imagine que es escritor e insiste en usar las palabras más complicadas, ofuscadas, que rara vez se necesitan o que se entienden todo el tiempo.

No muchas personas leerán tus libros.

El hecho de que el lenguaje permita a algunas personas crear tal confusión arrastra a otras personas porque tienen que descubrir qué diablos está sucediendo. Mi experiencia es que las personas que escriben códigos como este no escriben código que funciona muy bien y necesita mucho mantenimiento. Quiero decir que ya han arrojado el principio KISS a la basura. En mi humilde opinión, el arte o la programación es simplificar las cosas complicadas, no al revés. Este tipo de situación puede crear un mercado para un lenguaje más simple que hace todo lo que necesita hacer, pero solo en la sintaxis humana legible.


Cuando codigo en C #, utilizo virtualmente cada característica del mismo. No todo de una vez, pero todas las características de C # tienen su lugar. Mucha gente no sabe que C # tiene un operador "::" y nunca ha oído hablar de " alias externo ", pero tuve que usarlo hoy para resolver un conflicto de nombres entre dos DLL.

El "rendimiento de retorno" es una de mis características favoritas. No lo uso todos los días, pero solía escribir interfaces de IEnumerator manualmente en C # 1.0 y eso era un gran dolor que prefería no repetir. Además, es realmente útil para escribir coroutines , incluso corutinas que no producen ningún resultado ( yield return null = pausa la operación).

C # tiene funciones internas y cierres. Cuando codigo en C ++, son extrañados.

Parece tonto que C # tenga tantas formas diferentes de escribir una función interna,

  1. delegate(int x) { return x*x; }
  2. x => x*x
  3. (int x) => { return x*x; }

Pero el # 1 es solo por razones históricas y los formularios 2 y 3 tienen su lugar.

Ya sean métodos de extensión, sobrecarga de operadores, genéricos, restricciones genéricas, parámetros por defecto, coalescencia nula, el operador ternario, constructores estáticos, propiedades activadas / no comprobadas, auto-propiedades, preprocesadores, tipos de valores ... como programador de tiempo completo utilizo todo de estos, al menos ocasionalmente, y la eliminación de cualquiera de esas características crea trabajo adicional y empeoramiento para mí ( foo(x) ?? bar(y) ahora tiene que escribirse { var temp = foo(x); if (temp == null) temp = bar(y) } ), o requiere que escriba un código más grueso / lento (por ejemplo, si reemplaza los tipos de valor con clases, parte de mi código se ralentizaría y el uso de la memoria aumentaría drásticamente).

Lejos de tener demasiadas funciones, creo que no tiene suficiente. Cada vez que tengo que escribir un código similar una y otra vez, maldigo el lenguaje por no tener ningún atajo.

El truco está haciendo posible que los programadores que no trabajan a tiempo completo lo entiendan. (En cuanto a las personas que programan en C # a tiempo completo y aún no pueden aprender el idioma, ¿encenderlas?) Hubiera sido útil si Microsoft hubiera hecho las funciones más "Googleables" o al menos "F1-able". Por ejemplo, cuando coloco el cursor sobre "??" o "=>" y presione F1, debería obtener una página de ayuda para esos operadores. O considere los constructores estáticos: si el código decía "static constructor ()" en lugar de "static MyClassName ()", sería más fácil buscarlo en la web.

OMI, un problema más grande que la hinchazón del lenguaje es la inflamación del marco. El framework .NET es gigantesco, con Microsoft reimplementando las mismas cosas repetidamente, haciendo diseños hinchados y defectuosos cada vez: WinForms y WPF, las diversas formas de acceder a una base de datos, etc.


En mi opinión, C # no tiene demasiadas características. Casi todas las características más nuevas de 2.0 y 3.0 son de uso diario para mí y para mis compañeros de trabajo, e incluso el tipo de VB las recogió rápidamente. Algunas de las nuevas características hacen que aprender el idioma sea aún más fácil, como usar lambdas en línea en lugar de delegados y la palabra clave var e inicializadores de objetos, por nombrar algunos de C # 3.0 (no hay C # 3.5, por cierto, estás confundiendo eso con .NET 3.5).

C # se ha simplificado en la mayoría de los casos y las potentes funciones son todas fáciles de usar, a diferencia de C ++, donde los diseñadores dicen que puedes hacer absolutamente todo con C ++, pero nunca mencionan que muchas cosas tienden a convertirse en un verdadero dolor, lo que sucede porque C ++ simplemente puede hacer realmente todo, incluso muchas cosas que la mayoría de los programadores raramente usarán, si es que lo hacen alguna vez. Respaldar todo significa que muchas cosas son más complicadas de lo necesario, por lo que es más difícil de aprender. Esa es la diferencia entre un lenguaje en el que las funciones lo hacen difícil de aprender, pero muy poderoso y un lenguaje en el que las funciones hacen que sea más fácil de usar y mejorar la productividad, aunque en teoría es menos poderoso.

Y, en número puro de características, C # está muy lejos de C ++, especialmente si incluye C ++ 0x en esta imagen, lo que facilita el aprendizaje a pesar de tener "demasiadas funciones" para algunas personas. Mi punto con C ++ fue más bien que C # realmente no tiene tantas características, si quieres.


En realidad, hay mucho debate sobre cómo debería evolucionar C #. De hecho, algunos consideran que al agregar muchas funciones nuevas el lenguaje se vuelve difícil de aprender, pero la mayoría ve a C # como un lenguaje de programación de múltiples paradigmas. En primer lugar, es un lenguaje orientado a objetos con todas las características fuertemente tipado, pero tiene conceptos que hasta hace poco estaban restringidos a lenguajes de programación funcionales y dinámicos. Estas características, aunque pueden parecer confusas para un principiante, ofrecen mucha flexibilidad y potencia, y en ocasiones pueden ser suficientes para evitar que use un lenguaje específico de dominio en la aplicación y trate todos los problemas de integración. Siempre puede hablar sobre lo que debe implementarse en el lenguaje en sí y qué debe ser parte del marco, pero tenga en cuenta que la mayoría de las características que menciona y considera superfluas son en realidad el resultado de las solicitudes de los desarrolladores, y lo hacen proporcionar funcionalidad que distingue a C # de otros lenguajes (Java viene a la mente). Una vez que un programador utiliza estas características, se dará cuenta de sus ventajas.

Usted mencionó a Linq, y debo admitir que al principio era un poco escéptico, ya que siempre consideré que SQL es un lenguaje bastante natural para trabajar con datos, pero ahora realmente me gusta y veo la ventaja de tener consultas evaluadas en tiempo de compilación. Las expresiones Lambda son siempre agradables, de hecho pueden hacer que el código sea difícil de leer si se usan en exceso, pero a veces lo simplifican. No soy un gran admirador de la palabra clave ''var'', pero a veces me resulta útil, y seamos honestos al no usarla cuando escribir Linq dificultaría la lectura del código. Soy un programador principiante y no creo que sea difícil aprender estos conceptos. También uso mucho Java en la escuela, y realmente echo de menos algunas características de C # (no digo que Java sea un mal lenguaje, por el contrario, en algunos aspectos creo que es mejor que C # - contratos de código, especialmente para propositos academicos).


Las características son la razón por la que usamos C # y lo que hace que C # sea ''moderno''. Si C # no ofrece clases, por ejemplo, o multi-threading para ese asunto, ¿alguien usaría eso? Assembly es un ejemplo de un lenguaje que realmente no tiene características. Es tontamente fácil aprender como un idioma, pero nadie quiere usarlo.

Los lenguajes específicos de dominio pequeño son realmente extremos en esto. Tome la expresión regular clásica, por ejemplo. Tiene un HEAP de características solo para manipulación de cadenas. Si no los tuviera, ¿quién lo usaría? Estas características son las que lo hacen tan poderoso y expresivo. Lo mismo con idiomas más generales.

No es necesario que todas estas características sean necesarias para escribir C #. Comprender el código C # es donde aparecen los problemas. Pero si no se tratara de características en C #, todos implementarían múltiples subprocesos a su manera y, en lugar de aprender la única forma de manejar múltiples subprocesos, necesitarías aprender varios dependiendo del código que estás leyendo.


No creo que el aprendizaje de las nuevas características del lenguaje sea la parte de la que preocuparse: aprender las situaciones correctas para aplicarlas es lo que lleva décadas.

A veces difícilmente pueden entender el código escrito por personas que usan todas las características nuevas.

Este es el verdadero problema que debe abordar. Una base de código dividida en diferentes estilos y no mantenible por todos es una base de código costosa para mantener. Usar funciones nuevas para escribir "código corto y agradable" puede no maximizar la utilidad de ese código para su organización.

¿Cuál es la causa raíz de su situación? Lo es:

  • Algunos programadores no entienden las nuevas funciones
  • Las nuevas funciones se han usado inapropiadamente
  • Se han usado nuevas características para hackear fallas de diseño (a menudo el caso con reflexión)

Apuesto a que el dinero será una mezcla de lo anterior.


Probablemente deberías leer esta publicación de blog de Eric Gunnerson, miembro del equipo compilador de C # en Microsoft.

Él explica cómo las nuevas características hacen que entren en el lenguaje. Básicamente obtienen "-100 puntos" al principio, "lo que significa que tiene que tener un efecto neto positivo significativo en el paquete general para que llegue al idioma".


Sí C # tiene muchas funciones, ¡pero es por eso que lo usamos! ¡Cualquiera que ingrese a una carrera como programador debe esperar allí para estudiar, aprender cosas nuevas y tomar exámenes! Como alguien a quien le encanta aprender cosas nuevas, ¡es por eso que nos encanta!

Personalmente, encuentro que las expresiones lambda y los métodos de extensión, por ejemplo, son extremadamente útiles. Para crear aplicaciones distribuidas a mayor escala donde quiero separar datos y lógica, he encontrado que LINQ no es tan útil. Pero espero las características de c # 4 como los parámetros opcionales.

Como @Alex mencionó, creo que aprender cuándo usar las características de forma adecuada es el aspecto más desafiante. ¡Horrah para aquellos de nosotros que hemos estado con C # desde los primeros días!


Sí, C # tiene muchas características, y no es mi opinión, esto es un hecho , esta es una plataforma rica. Si alguien quiere discutir sobre eso y afirmar que este idioma no tiene muchas características, muéstreme un idioma que tenga muchas características y explique por qué tiene muchas más funciones que C #.

De todos modos, no veo ningún problema con eso . Siempre puede elegir el subconjunto de las características que le corresponden y usarlas. no hay nada de malo en un lenguaje rico en características, siempre que las características se utilicen correctamente y no se apliquen al código solo porque existan.


Sí, es un riesgo, y se discute mucho . Está llegando a un punto en el que es muy difícil recoger C # desde cero. Afortunadamente, las cosas se han estabilizado un poco, y los cambios de idioma entre C # 3.0 y C # 4.0 son relativamente menores.

En realidad, recientemente he estado trabajando mucho para tratar de solucionar un problema de genéricos de FQ y, como parte de la corrección, podría ocurrir que el código revierte casi a las técnicas de C # 1.2 (no, o muy pocas, genéricas). Así que la mayoría de los problemas se pueden abordar con las construcciones de lenguaje más simples. El punto es: ¿qué tan difícil debería ser hacer algo ?

Por ejemplo, los métodos anónimos añaden MUCHOS beneficios con relativamente poca complejidad. dynamic (4.0) agrega algo más para los escenarios de interoperabilidad COM. Los bloques Iterator son invaluables para el código de estilo LINQ ...

Veo muchas preguntas sobre las partes no triviales de C #, y creo que me costaría mucho enseñarle a un principiante todo C # desde cero. Libros como Jon''s C # in Depth son buenos para las personas que ya conocen lo básico (al menos C # 1.2, idealmente C # 2.0), pero en realidad no está diseñado para novatos (sé que Jon no estará en desacuerdo).

Un truco de hecho. Afortunadamente, el equipo de C # estableció el listón (para inclusión) muy alto; algo nuevo tiene que ser muy útil para convertirlo en el lenguaje.