El título correcto de este artículo es
C#, pero, debido a
limitaciones técnicas, no se puede representar correctamente.
C# |
---|
 |
 |
Desarrollador(es) |
---|
Microsoft https://docs.microsoft.com/en-us/dotnet/csharp/,https://docs.microsoft.com/de-de/dotnet/csharp/,https://docs.microsoft.com/ja-jp/dotnet/csharp/,https://docs.microsoft.com/fr-fr/dotnet/csharp/ yhttps://docs.microsoft.com/it-it/dotnet/csharp/ |
Información general |
---|
Extensiones comunes | .cs .csx .cshtml .razor |
---|
Paradigma | Multiparadigma:estructurado,imperativo,orientado a objetos,dirigido por eventos,funcional,genérico,reflexivo |
---|
Apareció en | 2000 |
---|
Diseñado por | Microsoft |
---|
Última versión estable | 12.0(14 de noviembre de 2023 (1 año, 4 meses y 3 días)) |
---|
Última versión en pruebas | 13.0(07 de mayo de 2024 (10 meses y 10 días)) |
---|
Sistema de tipos | Estático,dinámico,fuerte, seguro, nominal |
---|
Implementaciones | Microsoft .NET,Microsoft .NET Core,Mono yDotGNU |
---|
Dialectos | Cω, Spec Sharp, Polyphonic C# |
---|
Influido por | Java,C++,Eiffel,Modula-3,Pascal |
---|
Ha influido a | D,F#,Java 5,Vala |
---|
Sistema operativo | Multiplataforma |
---|
|
«C#» (pronunciadocii sharp en inglés) es unlenguaje de programaciónmultiparadigma desarrollado y estandarizado por laempresaMicrosoft como parte de su plataforma.NET, que después fue aprobado como un estándar por laECMA (ECMA-334) eISO (ISO/IEC 23270). C# es uno de los lenguajes de programación diseñados para lainfraestructura de lenguaje común.
Su sintaxis básica deriva deC/C++ y utiliza el modelo de objetos de la plataforma .NET, similar al deJava, aunque incluye mejoras derivadas de otros lenguajes.
El nombre C Sharp fue inspirado por el signo♯, el cual se lee comosharp en inglés para notación musical. Es un juego de palabras, pues '"C#" significa, musicalmente hablando, "do sostenido", donde el símbolo# indica que una nota (en este caso do, representada porC) debe ser un semitono más alta. Esto es unametáfora de la superioridad de C# sobre su antecesor C++ y a su vez hace alusión a la misma metáfora que se ideó para dar nombre a C++.[1] Además, el símbolo# puede ser imaginado como la unión de cuatro símbolos+, continuando así con el sentido de progresión de los lenguajes C.
Aunque C# forma parte de la plataforma .NET, esta es unaAPI, mientras que C# es un lenguaje de programación independiente diseñado para generar programas sobre dicha plataforma. Ya existe uncompilador implementado que provee el marcoMono -DotGNU, el cual genera programas para distintas plataformas comoMicrosoft Windows,Unix,Android,iOS,Windows Phone,Mac OS yGNU/Linux.
Durante el desarrollo de la plataforma .NET, las bibliotecas declases fueron escritas originalmente usando un sistema decódigo gestionado llamado Simple Managed C (SMC). En abril de 1999,Anders Hejlsberg formó un equipo con la misión de desarrollar un nuevolenguaje orientado a objetos. Este nombre tuvo que ser cambiado debido a problemas de marca, pasando a llamarse C#.[2] La biblioteca de clases de la plataforma .NET fue migrada entonces al nuevo lenguaje, y este después fue modificado por Joseth M.
Hejlsberg lideró el proyecto de desarrollo de C#. Anteriormente ya había participado en el desarrollo de otros lenguajes comoTurbo Pascal,Delphi yJ++.
C# contiene veinte categorías generales de tipos de datos integrados:tipos de valor ytipos de referencia. El términotipo de valor indica que esos tipos contienen directamente sus valores. Tipos para definirnúmeros enteros:
Tipo de datos de enterosTipo | EquivalenteBCL | Tamaño | Intervalo | Significado |
---|
byte | System.Byte | 8-bit (1-byte) | 0 a 255 | Entero sin signo |
sbyte | System.SByte | 8-bit (1-byte) | -128 a 127 | Entero con signo |
short | System.Int16 | 16-bit (2-byte) | -32.768 a 32.767 | Entero corto con signo |
ushort | System.UInt16 | 16-bit (2-byte) | 0 a 65.535 | Entero corto sin signo |
int | System.Int32 | 32-bit (4-byte) | -2.147.483.648 a 2.147.483.647 | Entero medio con signo |
uint | System.UInt32 | 32-bit (4-byte) | 0 a 4.294.967.295 | Entero medio sin signo |
long | System.Int64 | 64-bit (8-byte) | -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 | Entero largo con signo |
ulong | System.UInt64 | 64-bit (8-byte) | 0 a 18.446.744.073.709.551.615 | Entero largo sin signo |
nint | System.IntPtr | 64-bit o 32-bit (4-byte o 8-byte) | Depende de la plataforma en la que se ejecute | Entero nativo con signo |
nuint | System.UIntPtr | 64-bit o 32-bit (4-byte o 8-byte) | Depende de la plataforma en la que se ejecute | Entero nativo sin signo |
Los tipos decoma flotante pueden representar números con componentes fraccionales. Existen dos clases de tipos de coma flotante:float ydouble. El tipodouble es el más utilizado porque muchas funciones matemáticas de la biblioteca de clases de C# usan valoresdouble. Quizá, el tipo de coma flotante más interesante de C# esdecimal, dirigido al uso de cálculos monetarios. La aritmética de coma flotante normal está sujeta a una variedad de errores de redondeo cuando se aplica a valores decimales. El tipodecimal elimina estos errores y puede representar hasta 28 lugares decimales.
Tipo de datos de coma flotanteTipo | EquivalenteBCL | Tamaño | Intervalo | Significado |
---|
float | System.Single | 32-bit (4-byte) | ±1.401298E−45 a ±3.402823E+38 | Coma flotante corto |
double | System.Double | 64-bit (8-byte) | ±4.94065645841246E−324 a ±1.79769313486232E+308 | Coma flotante largo |
decimal | System.Decimal | 128-bit (16-byte) | −7.9228162514264337593543950335 a +7.9228162514264337593543950335 | Coma flotante monetario |
Loscaracteres en C# no tienen un tamaño de 8 bits como en muchos otros lenguajes de programación, sino que usan un tamaño de16 bits. Estetipo de dato se llamachar
y utiliza la codificaciónUnicode. No existen conversiones automáticas de tipo entero achar
.
Tipo de datos de caracteresTipo | EquivalenteBCL | Tamaño | Intervalo | Significado |
---|
char | System.Char | 16-bit (2-byte) | '\u0000' a'\uFFFF' | Carácter unicode |
Para lostipos de datos lógicos no existen conversiones automáticas de tipo entero abool
.
Tipo de datos lógicosTipo | EquivalenteBCL | Tamaño | Intervalo | Significado |
---|
bool | System.Boolean | 8-bit (1-byte) | true ofalse | Verdadero o falso |
En ocasiones, resulta más sencillo usar un sistema numérico en base 16 en lugar de 10, para tal caso C# permite especificar números enteros en formatohexadecimal, y se define anteponiendo0x
, por ejemplo:0xFF
, que equivale a255
endecimal. Asimismo, también permite poner estos en formatobinario anteponiendo0b
.
C# tiene caracteres denominadossecuencias de escape para facilitar la escritura con el teclado de símbolos que carecen de representación visual.
C#, al igual que C++, define un tipo decadena de caracteres. Dentro de la cadena de caracteres se pueden usar secuencias de escape. Una cadena de caracteres puede iniciarse con el símbolo@
seguido por una cadena entre comillas ("
), en tal caso, las secuencias de escape no tienen efecto, y además la cadena puede ocupar dos o más líneas.
Enteros |
---|
decimal | 245 ,[0..9]+ |
hexadecimal | 0xF5 ,0x[0..9, A..F, a..f]+ |
binario | 0b01001111 ,0b[0..1]+ |
entero largo | 12L |
entero largo sin signo | 654UL |
Coma flotante |
---|
float | 23.5F ,23.5f ;1.72E3F ,1.72E3f ,1.72e3F ,1.72e3f |
double | 23.5 ,23.5D ,23.5d ,1.72E3 ,1.72E3D |
decimal | 9.95M |
Caracteres |
---|
char | 'a' ,'Z' ,'\u0231' |
Cadenas |
---|
String | "Hello, world" ;"C:\\Windows\\" ,@"C:\Windows\" |
Secuencias de escape |
---|
Alerta (timbre) | \a |
Retroceso | \b |
Avance de página | \f |
Nueva línea | \n |
Retorno de carro | \r |
Tabulador horizontal | \t |
Tabulador vertical | \v |
Nulo | \0 |
Comilla simple | \' |
Comilla doble | \" |
Barra inversa | \\ |
Las variables son identificadores asociados a valores. Se declaran indicando el tipo de dato que almacenará y su identificador.
Un identificador puede:
Un identificador no puede:
- empezar por un número.
- empezar por un símbolo, ni aunque sea una palabra clave.
- contener más de 511 caracteres.
Declarar una variable:
intmiNumero;// Declaramos la variable, pero no la inicializamos con ningún valor.
Para asignar un valor a una variable, se indica el identificador de la misma, seguido del símbolo igual (=
) y el valor que queremos que almacene:
miNumero=5;// Asignamos el valor '5' a la variable creada.
Se puede declarar y asignar un valor al mismo tiempo:
intmiNumero=5;// Declaramos la variable, y asignamos el valor '5'.
También puedes declarar una variable sin especificar el tipo de dato, utilizando el mecanismo deinferencia mediante la palabra clavevar
donde el compilador determina el tipo de dato que se le asignará a la variable y solamente es permitida para variables locales, no para parámetros o datos miembro.
varcadena="Esto es un string";varnumero1=5;varnumero2=4.5;varnumero3=4.5D;varobjeto=newObject();varresultado=Math.Pow(5,2);
Las conversiones de tipo de variables en C# se representan en la siguiente tabla en donde la fila es el origen y la columna el destino.
Leyenda |
---|
Rojo | Conversión incompatible (I). |
Verde | Conversión automática o implícita (A). |
Azul | Conversión explícita (E). |
Conversiones de tipo de datos | byte | sbyte | short | ushort | int | uint | long | ulong | float | double | decimal | char | bool |
---|
byte | | E | A | A | A | A | A | A | E | E | E | E | I |
sbyte | E | | A | E | A | E | A | A | E | E | E | E | I |
short | E | E | | E | A | A | A | A | E | E | E | E | I |
ushort | E | E | E | | A | A | A | A | E | E | E | E | I |
int | E | E | E | E | | E | A | A | E | E | E | E | I |
uint | E | E | E | E | E | | A | A | E | E | E | E | I |
long | E | E | E | E | E | E | | E | E | E | E | E | I |
ulong | E | E | E | E | E | E | E | | E | E | E | E | I |
float | E | E | E | E | E | E | E | E | | A | E | I | I |
double | E | E | E | E | E | E | E | E | E | | E | I | I |
decimal | E | E | E | E | E | E | E | E | E | E | | I | I |
char | E | E | E | A | A | A | A | A | A | A | A | | I |
bool | I | I | I | I | I | I | I | I | I | I | I | I | |
- Toda conversión implícita no ocasiona pérdida de información,truncamientos oredondeos.
- Es posible (aunque no siempre ocurre) que en una conversión explícita haya pérdida de información, truncamientos o redondeos.
- En toda conversión implícita el tipo de dato destino es mayor que el tipo de dato origen.
- La conversión explícita se realiza indicando el tipo de dato al que se quiere convertir entre paréntesis, seguido del valor:
longvalor=123;// Conversión implícitalongvalor=(long)123;// Conversión explícita
Además de realizarse dentro de una asignación, las conversiones de tipos también tienen lugar dentro de una expresión, pues en cada operación ambos operandos deben de ser del mismo tipo. Si la conversión es del tipo implícito se efectúa el siguiente algoritmo en dicho orden:
- Si un operando es
decimal
, el otro operando se transforma adecimal
. - Si un operando es
double
, el otro operando se transforma adouble
. - Si un operando es
float
, el otro operando se transforma afloat
. - Si un operando es
ulong
, el otro operando se transforma aulong
. - Si un operando es
long
, el otro operando se transforma along
. - Si un operando es
uint
, y si el otro operando es de tiposbyte
,short
oint
, los dos se transforman along
. - Si un operando es
uint
, el otro operando se transforma auint
. - Si no es ninguno de los casos anteriores, los dos operandos se transforman a
int
.
Las constantes son valores inmutables, y por tanto no se pueden cambiar.
const
Cuando se declara una constante con la palabra claveconst
, también se debe asignar el valor. Tras esto, la constante queda bloqueada y no se puede cambiar. Son implícitamente estáticas (static
).
readonly
A diferencia deconst
, no requiere que se asigne el valor al mismo tiempo que se declara. Pueden ser miembros de la instancia o miembros estáticos de la clase (static
).
readonlydoubleE;E=2.71828;
Categoría | Operadores |
---|
Aritméticos | + - * / % |
Lógicos | ! && || |
A nivel de bits | & | ^ ~ |
Concatenación | + |
Incremento, decremento | ++ -- |
Desplazamiento | << >> |
Relacional | == != < > <= >= |
Asignación | =^= <<= >>= ??= |
Acceso a miembro | . |
Indexación | [ ] |
Conversión | ( ) |
Condicional | ? : ?? |
Creación de objeto | new |
Información de tipo | as is sizeof typeof |
- Los operadores aritméticos funcionan igual que en C y C++.
- El resultado de los operadores relacionales y lógicos es un valor de tipo
bool
. - Los operadores de cortocircuito evalúan el segundo operando solo cuando es necesario.
- Los operadores a nivel de bits no se pueden aplicar a tipos
bool
,float
,double
odecimal
.
Instrucciones de control
[editar]if-else
if(i==2){// ...}elseif(i==3){// ...}else{// ...}
switch
switch(i){case1:...break;case2:case3:...break;default:...break;}
for
for(inti=0;i<10;++i){// ...}
while
do-while
foreach
foreach(charcincharList){// ...}
- Las instrucciones
if-else
,for
,while
,do-while
,switch
,return
,break
,continue
son, básicamente, iguales que en C, C++ y Java. - La instrucción
foreach
, al igual que en Java, realiza un ciclo a través de los elementos de una matriz o colección. En este ciclo se recorre la colección y la variable recibe un elemento de dicha colección en cada iteración. - La instrucción
goto
se sigue utilizando en C# a pesar de la polémica sobre su uso.
- Todo método debe ser parte de una clase, no existen métodos globales (funciones).
- Por defecto, los parámetros se pasan por valor. (Nótese que las listas y otras colecciones son variablespor referencia (referencias al espacio reservado para esa lista en la pila) y que se pasa por valor al método la referencia, pero el espacio reservado para la lista es común, por lo que si elimina un elemento lo hace también de la original).
- El modificador
ref
fuerza a pasar los parámetros por referencia en vez de pasarlos por valor y obliga a inicializar la variable antes de pasar el parámetro. - El modificador
out
es similar al modificadorref
, con la diferencia de que no se obliga a inicializar la variable antes de pasar el parámetro. - Cuando
ref
yout
modifican un parámetro de referencia, la propia referencia se pasa por referencia. - El modificador
params
sirve para definir un número variable de argumentos los cuales se implementan como una matriz. - Un método debe tener como máximo un único parámetro
params
y este debe ser el último.
- Un método puede devolver cualquier tipo de dato, incluyendo tipos de clase.
- Ya que en C# las matrices se implementan como objetos, un método también puede devolver una matriz (algo que se diferencia de C++ en que las matrices no son válidas como tipos de valores devueltos).
- C# implementasobrecarga de métodos, dos o más métodos pueden tener el mismo nombre siempre y cuando se diferencien por sus parámetros.
- El método
Main
es un método especial al cual se refiere el punto de partida del programa.
ref
voidPassRef(refintx){if(x==2){x=10;}}intz=0;PassRef(refz);
out
voidPassOut(outintx){x=2;}intz;PassOut(outz);
params
intMaxVal(charc,paramsint[]nums){// ...}inta=1;MaxVal('a',23,3,a,-12);// El primer parámetro es obligatorio, seguidamente se pueden poner tantos números enteros como se quiera
Sobrecarga de métodos
intSuma(intx,inty){returnx+y;}intSuma(intx,inty,intz){returnx+y+z;}intSuma(paramsint[]numeros){intSumatoria=0;foreach(intcinnumeros)Sumatoria+=c;returnSumatoria;}Suma(1,2);// Llamará al primer método.Suma(1,2,3);// Llamará al segundo método.Suma(1,2,3,4,5,6)// Llamará al tercer método.
Main
publicstaticvoidMain(string[]args){// ...}
- En C# las matrices se implementan como objetos.
- Los índices de las matrices comienzan en 0.
- Ya que C# implementa las matrices como objetos, cada matriz tiene una propiedad
Length
que contiene el número de elementos que puede alojar o tiene alojados.
Declarar una matriz:
Declarar e inicializar una matriz (el tamaño de la matriz se puede omitir):
int[]intArray=newint[]{1,2,3,4,5};
Acceder a un elemento:
intArray[2];// Retornará el valor '3'
Declarar una matriz multidimensional:
int[,]intMultiArray=newint[3,2];// 3 filas y 2 columnas
Declarar e inicializar una matriz multidimensional (el tamaño de la matriz se puede omitir):
int[,]intMultiArray=newint[,]{{1,2},{3,4},{5,6}};
Acceder a un elemento de una matriz multidimensional:
intMultiArray[2,0];// Retornará el valor '5'
Más información en:Tutorial de matrices (C#)(en inglés).
- Una variable de objeto de cierta clase no almacena los valores del objeto sino su referencia (al igual que Java)
- El operador de asignación no copia los valores de un objeto, sino la referencia al mismo (al igual que Java).
- Un constructor tiene el mismo nombre que su clase y es sintácticamente similar a un método.
- Un constructor no devuelve ningún valor (ni siquiera void).
- Al igual que los métodos, los constructores también pueden ser sobrecargados.
- Si no se especifica un constructor en una clase, se usa uno por defecto que consiste en asignar a todas las variables el valor
0
,null
ofalse
según corresponda. - Cuando un objeto no es referenciado por ninguna variable, elrecolector de basura ejecuta el destructor de dicha clase y libera la memoria utilizada.
- El destructor de una clase no se llama cuando un objeto sale del ámbito.
- Todos los destructores se llamarán antes de que finalice un programa.
- La palabra clave
this
es una referencia al mismo objeto en el cual se usa. - La palabra clave
base
es una referencia a la clase padre del objeto en la que se usa (por defecto, Object). - La palabra clave
static
hace que un miembro pertenezca a una clase en vez de pertenecer a objetos de dicha clase. Se puede tener acceso a dicho miembro antes de que se cree cualquier objeto de su clase y sin referencias a un objeto. - Un método
static
no tiene una referenciathis
. - Un método
static
puede llamar solamente a otros métodosstatic
. - Un método
static
solamente debe tener acceso directamente a datosstatic
. - Un constructor
static
se usa para inicializar atributos que se aplican a una clase en lugar de aplicarse a una instancia. - C# permite la sobrecarga de operadores (
+
,-
,*
, etc.) con la palabra claveoperator
. - Al comparar objetos (
==
,!=
,<
,>
,<=
,>=
) se comprueba si hacen referencia al mismo objeto.
Declarar una clase:
Iniciar una clase (también llamadocrear un objeto de la clase oinstanciar una clase):
Constructor (como si fuera un método, pero con el nombre de su clase):
classClase{Clase(){// ...}}
Destructor (como si fuera un método, precedido del símbolo '~
'):
classClase{~Clase(){// ...}}
this
:
classClase{inti=1;Clase(){this.Arrancar();// Llamará al método 'Arrancar' del objeto}voidArrancar(){// ...}}
static
:
classClase{staticinti=1;}Clase.i;// Retornará el valor '1'. No hace falta crear un objeto, ya que al ser 'static', pertenece a la clase.
operator
:
classClase{staticintoperator+(intx,inty){// Sobrecarga el operador '+'// ...}staticintoperator-(intx,inty){// Sobrecarga el operador '-'// ...}staticintoperatorint(bytex){// Sobrecarga la conversión de tipo 'byte' a 'int'// ...}}
Comparación de objetos:
classClase{}Clasec1=newClase();Clasec2=newClase();boolb=c1==c2;// Retornará 'false', ya que son dos objetos distintos
- El tipo de dato para las cadenas de caracteres es
string
. - Realmente la palabra clave
string
es un alias de la claseSystem.String
de la plataforma .NET. - En C# las cadenas son objetos y no una matriz de caracteres; aun así, se puede obtener un carácter arbitrario de una cadena por medio de su índice (pero no modificarlo).
- Las cadenas son inmutables, una vez creadas no se pueden modificar, solo se pueden copiar total o parcialmente.
- El operador
==
determina si dos referencias hacen referencia al mismo objeto, pero al usar dicho operador con dos variables tipostring
se prueba la igualdad del contenido de las cadenas y no su referencia. Sin embargo, con el resto de los operadores relacionales, como<
y>=
, sí se comparan las referencias. - Se pueden concatenar (unir) dos cadenas mediante el operador
+
. - Las cadenas se pueden usar en las instrucciones
switch
.
Declarar una cadena de caracteres (como si fuera una variable de un tipo de dato comoint
odouble
):
stringtexto="Cadena de caracteres";stringtexto=newSystem.String("Cadena de caracteres");// Equivalente al anterior
Longitud de una cadena:
stringtexto="Cadena de caracteres";inti=texto.Length;// Retornará '20'
Comparar dos cadenas:
boolb="texto"=="texto";// Retornará 'true', ya que ambas cadenas contienen "texto"
Concatenar cadenas:
stringtexto="Cadena de"+" caracteres";// Nótese el espacio antes de "caracteres", si no se pusiera, aparecería junto: "decaracteres"
La claseSystem.String
, y una instancia de la misma,string
, poseen algunos métodos para trabajar con cadenas, como:
static string Copy(string str)
: devuelve una copia destr
.
stringtexto1="abc";stringtexto2="xyz";stringtexto2=System.String.Copy(texto1);// 'texto2' ahora contiene "abc"
int CompareTo(string str)
: devuelve menor que cero si la cadena que llama es menor que str, mayor que cero si la cadena que llama es mayor que str, y cero si las cadenas son iguales.
stringtexto="abc";inti=texto.CompareTo("abc");// Retornará '0'
int IndexOf(string str)
: devuelve el índice de la primera coincidencia de la subcadena especificada enstr
, o -1 en caso de error.
stringtexto="abcdefabcdef";inti=texto.IndexOf("e");// Retornará '4'intj=texto.IndexOf("def");// Retornará '3', que es donde se encuentra el carácter 'd', seguido de 'e' y 'f'
int LastIndexOf(string str)
: devuelve el índice de la última coincidencia de la subcadena especificada enstr
, o -1 en caso de error.
stringtexto="abcdefabcdef";inti=texto.LastIndexOf("e");// Retornará '10'intj=texto.LastIndexOf("def");// Retornará '9', que es donde se encuentra el último carácter 'd', seguido de 'e' y 'f'
string ToLower
: devuelve una copia de la cadena en minúsculas.
stringtexto="ABC";stringtexto=texto.ToLower();// Retornará "abc"
string ToUpper
: devuelve una copia de la cadena en mayúsculas.
stringtexto="abc";stringtexto=texto.ToUpper();// Retornará "ABC"
string Substring
: devuelve una subcadena, indicando la posición de inicio y la longitud que se desea.
stringtexto="Cadena de caracteres";stringtexto=texto.Substring(10,8);// Retornará "caracter"
Más información en:String (Clase) (System)(en inglés).
LINQ (Language-Integrated Query)
[editar]Language-Integrated Query (LINQ) es el nombre de un conjunto de tecnologías que consiste en la integración directa de funciones de consulta en el lenguaje C# (también en Visual Basic y potencialmente en cualquier otro lenguaje de .NET). Con LINQ, ahora una consulta es una construcción de lenguaje de primera clase, igual que las clases, los métodos, los eventos, etc.
Para un programador que escribe consultas, la parte integrada en el lenguaje más visible de LINQ es la expresión de consulta. Las expresiones de consulta se escriben en la sintaxis de consulta declarativa que se introdujo en C# 3.0. Al usar sintaxis de consulta, se pueden realizar incluso operaciones complejas de filtrado, ordenación y agrupamiento en orígenes de datos con código mínimo. Los mismos patrones de expresión de consulta básicos se usan para consultar y transformar datos de bases de datos SQL, conjuntos de datos de ADO.NET, secuencias y documentos XML, y colecciones de .NET.
En el siguiente ejemplo se muestra la operación de consulta completa. La operación completa incluye la creación de un origen de datos, la definición de la expresión de consulta y la ejecución de la consulta en una instrucción foreach.
classLINQQueryExpressions{staticvoidMain(){// Specify the data source.int[]scores=newint[]{97,92,81,60};// Define the query expression.IEnumerable<int>scoreQuery=fromscoreinscoreswherescore>80selectscore;// Execute the query.foreach(intiinscoreQuery){Console.Write(i+" ");}}}// Output: 97 92 81
https://msdn.microsoft.com/es-es/library/bb397676(v=vs.120).aspx
Ejemplo básico "Hola mundo":
usingSystem;publicclassEjemplo{publicstaticvoidMain(string[]args){Console.WriteLine("Hola mundo");}}
Suma y concatenación:
usingSystem;publicclassEjemplo{publicstaticvoidMain(string[]args){intx=10;inty=20;Console.WriteLine("El resultado es: "+(x+y));// Imprimirá en pantalla: "El resultado es: 30"}}
Uso de clases, métodos, propiedades y sobrecarga:
usingSystem;publicclassCoche{privateintnumPuertas;publicintNumPuertas{get{returnthis.numPuertas;}set{this.numPuertas=value;// 'value' es una variable que se asigna automáticamente al asignar un valor a la propiedad,// para poder trabajar con dicho valor.}}publicCoche(intnumPuertas){this.NumPuertas=numPuertas;}// Sobrecarga: si se instancia la clase sin indicar ningún parámetro, se inicializa 'numPuertas' con el valor '2'publicCoche():this(2){}}publicclassEjemplo{publicstaticvoidMain(string[]args){Cochecoche=newCoche();// Se usa el segundo constructorcoche.NumPuertas=4;Console.WriteLine("El número de puertas es: "+coche.NumPuertas);// Imprimirá en pantalla: "El número de puertas es: 4"}}
Ejemplo de Vectores o Arreglos paralelos:
Problema 1:
Desarrollar un programa que permita cargar 5 nombres de personas y sus edades respectivas. Luego de realizar la carga por teclado de todos los datos imprimir los nombres de las personas mayores de edad (mayores o iguales a 18 años).
Programa:
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespacePruebaVector10{classPruebaVector10{privatestring[]nombres;privateint[]edades;publicvoidCargar(){nombres=newstring[5];edades=newint[5];for(intf=0;f<nombres.Length;f++){Console.Write("Ingrese nombre:");nombres[f]=Console.ReadLine();Console.Write("Ingrese edad:");stringlinea;linea=Console.ReadLine();edades[f]=int.Parse(linea);}}publicvoidMayoresEdad(){Console.WriteLine("Personas mayores de edad.");for(intf=0;f<nombres.Length;f++){if(edades[f]>=18){Console.WriteLine(nombres[f]);}}Console.ReadKey();}staticvoidMain(string[]args){PruebaVector10pv=newPruebaVector10();pv.Cargar();pv.MayoresEdad();}}}firma:RSRR
Cabe destacar que los controles comunes que ofrece la plataforma .NET se pueden personalizar y/o editar para satisfacer las diferentes necesidades de los desarrolladores. El tomar la decisión de crear un control personalizado llega cuando se desea hacer una componente en donde se tiene el control total sobre su aspecto funcional y visual; con la posibilidad de no cargar las funcionalidades innecesarias para el desarrollo.
Los casos comunes en donde se suelen usar estas características son:
- Controles simples con funcionalidad limitada (como un botón al que se le agrega movimiento).
- Controles en donde se tengan características innecesarias para el desarrollo (un botón sin los márgenes).
- Controles en donde se necesite la misma funcionalidad en un diseño diferente (botones en forma de línea para representar una arista).
En la actualidad existen los siguientescompiladores oIDE para el lenguaje C#:
Metas del diseño del lenguaje
[editar]El estándar ECMA-334 lista las siguientes metas en el diseño para C#:
- Lenguaje de programación orientado a objetos simple, moderno y de propósito general.
- Inclusión de principios deingeniería de software tales como revisión estricta de los tipos de datos, revisión de límites de vectores, detección de intentos de usar variables no inicializadas, y recolección de basura automática.
- Capacidad para desarrollarcomponentes de software que se puedan usar en ambientes distribuidos.
- Portabilidad del código fuente.
- Fácil migración del programador al nuevo lenguaje, especialmente para programadores familiarizados con C, C++ y Java.
- Soporte parainternacionalización.
- Adecuación para escribir aplicaciones de cualquier tamaño: desde las más grandes y sofisticadas comosistemas operativos hasta las más pequeñas funciones.
- Aplicaciones económicas en cuanto a memoria y procesado.