lunes, 3 de marzo de 2008

C# para contar (parte 1)

CHenry [chenry@hha.sld.cu]

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;
long val2 = 34L;

byte

8-bit, positivos.

byte val1 = 12;
byte val2 = 34U;

Ushort

16-bit, positivos.

ushort val1 = 12;
ushort val2 = 34U;

Uint

32-bit, positivos.

uint val1 = 12;
uint val2 = 34U;

Ulong

64-bit, positivos.

ulong val1 = 12;
ulong val2 = 34U;
ulong val3 = 56L;
ulong val4 = 78UL;

Float

Tipo real de simple precision.

float value = 1.23F;

Double

Tipo real de doble precision.

double val1 = 1.23
double val2 = 4.56D;

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.

•             Unidimensionales
using 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());
  }
}



Artículos relacionados


No hay comentarios: