Ahora otras características de C# que lo ponen hoy como uno de los sugerentes lenguajes en mi opinión.
Ahí va…
Manejo de memoria.
La dirección de memoria manual les exige a diseñadores que manejen la asignación y eliminación de bloques de memoria. C# proporciona la dirección de memoria automática para que los diseñadores se liberen de esta pesada tarea. En la inmensa mayoría de los casos, esta dirección de memoria automática aumenta la calidad del código y refuerza la productividad del diseñador.Para diseñadores que deseen llevar el manejo de memoria C# proporciona la habilidad de escribir código "inseguro" (unsafe). En este código puede trabajarse directamente con punteros, y se las arregla para impedir que el recolector de basura elimine los objetos. El código inseguro debe marcarse claramente en el código con el modificador inseguro (unsafe), para que este código no sea usado accidentalmente. El compilador y la herramienta de ejecución aseguran que este código no pueda hacerse pasar por código seguro.
using System;
class Test
{
unsafe static void WriteLocations(byte[] arr)
{
fixed (byte *p_arr = arr)
{
byte *p_elem = p_arr;
for (int i = 0; i < arr.Length; i++)
{
byte value = *p_elem;
string addr = int.Format((int) p_elem, "X");
Console.WriteLine("arr[{0}] at 0x{1} is {2}", i, addr, value);
p_elem++;
}
}
}
static void Main()
{
byte[] arr = new byte[] {1, 2, 3, 4, 5};
WriteLocations(arr);
}
}
El ejemplo muestra que un método ”unsafe” nombrado WriteLocations. Una posible salida del programa es:
arr[0] at 0x8E0360 is 1
arr[1] at 0x8E0361 is 2
arr[2] at 0x8E0362 is 3
arr[3] at 0x8E0363 is 4
arr[4] at 0x8E0364 is 5
Tipos.
C# tiene dos clases de tipos: por valor y por referencia. En los tipos por valor se incluyen los tipos simples (char, int, y float), los enumerativos(enum types, vienen de C++) y las estructuras (struct types, también de C++).Los tipos por referencias incluyen clases(class types), interfaces(interfaces types), delegates (delegate types) y arreglos(array types).
Los tipos por valor difieren de los tipos por referencia en que las variables de los tipos por valor contienen sus datos directamente, mientras que las variables de los tipos por referencia almacenan una referencia a un dato. Con tipos por referencia es posible que dos variables tengan una referencia a un mismo dato, y cualquier cambio que se haga en uno de ellos se efectuara también en el otro. Con los tipos por valor, cada variables tiene su propia copia de los datos, y si se efectúan cambios en uno no se afecta el otro.
Nota: Seria igual a C++ y Java.
Tipos definidos:
Tipo |
Descripción |
Ejemplo |
Object | Tipo base de todos los tipos. | object o = new Stack(); |
String | Secuencia de caracteres Unicode. | string s = "Hello"; |
Sbyte | 8-bit, positivos y negativos | sbyte val = 12; |
Short | 16-bit, positivos y negativos | short val = 12; |
Int | 32-bit, positivos y negativos. | int val = 12; |
long | 64-bit, positivos y negativos. | long val1 = 12; |
byte | 8-bit, positivos. | byte val1 = 12; |
Ushort | 16-bit, positivos. | ushort val1 = 12; |
Uint | 32-bit, positivos. | uint val1 = 12; |
Ulong | 64-bit, positivos. | ulong val1 = 12; |
Float | Tipo real de simple precision. | float value = 1.23F; |
Double | Tipo real de doble precision. | double val1 = 1.23 |
Bool | Valores true o false. | bool value = true; |
char | Valores carácter Unicode. | char value = 'h'; |
decimal< | Tipo decimal preciso con 28 cifras significativas | decimal value = 1.23M; |
Operadores:
Categoría |
Operadores |
Primarios | (x)x.y f(x) a[x] x++ x—New |
Typeof sizeof | Checked unchecked |
Unarios | + - ! ++ x –x (T)x |
Multiplicativos | * / % |
Aditivos | + - |
Shift | << >> |
Relacionales | < > <= >= is |
Igualdad desigualdad | == !== |
Lógico AND | & |
Lógico XOR | ^ |
Lógico OR | | |
Condicional AND | && |
Condicional OR | || |
Condicional | ?: |
Asignación | = *= /= %= += -= <<= >>= &= ^= |= |
Arreglos.
• Unidimensionalesusing System;
class Test
{
static void Main()
{
int[] arr = new int[5];
for (int i = 0; i < arr.Length; i++)
arr[i] = i * i;
}
}
• Multidimensionales rectangulares:
using System;
class Test
{
static void Main()
{
int[,] a2 = new int[,] {{1,2,3}, {4,5,6}};
int[,,] a3 = new int[10, 20, 30];
}
}
• Multidimensionales rasgados:
using System;
class Test
{
static void Main()
{
int[][] j2 = new int[3][];
j2[0] = new int[] {1,2,3};
j2[1] = new int[] {1,2,3,4,5,6};
j2[2] = new int[] {1,2,3,4,5,6,7,8,9};
}
}
Este ejemplo no es valido.
class Test
{
static void F(int[] arr) {}
static void Main()
{
F({1, 2, 3});
}
}
Este ejemplo si es valido.
class Test
{
static void F(int[] arr) {}
static void Main()
{
F(new int[] {1, 2, 3});
}
}
Sistema de unificación de tipos:
Todos los tipos en C# pueden ser tratados como objetos, pues todos derivan de Object.
Ejemplos
using System;
class Test
{
static void Main()
{
Console.WriteLine(3.ToString());
}
}