C# y la plataforma .NET
Javier Jiménez Juárez
Lenguajes de Programación
Dra. Ana Lilia Laureano Cruces
Instituto de Investigaciones en Matemáticas Aplicadas y Sistemas
Universidad Nacional Autónoma de México
21 de octubre de 2004
¿Qué es C#?
Lenguaje de programación de
Microsoft
¿Evolución? de C++
Totalmente orientado a objetos
Seguridad en tipos
Polimorfismo
Sobrecarga de operadores y métodos
Herencia
2
¿Por qué y para qué?
Lenguaje sencillo pero robusto
Sencillez de Visual Basic
Poder de C++
Velocidad de
desarrollo
comparable con
IDEs de Borland
(Delphi, Builder)
3
¿Por qué y para qué?
Independencia de plataforma
.NET
Liberación de la especificación
MONO: Emulación en ambientes
Linux
4
¿Por qué y para qué?
Bondades
Seguridad de tipos
OO
Objetos <- Tipos básicos de datos
int Counter = 14;
Console.WriteLine( Counter.ToString() );
Administración automática de
memoria
5
¿Por qué y para qué?
Bondades...
Sintaxis simplificada: operadores de
referencia y namespaces:
., ->, :: sustituidos por ->
XML: ¿Comentarios? ¡Documentación!
COMponentes y componentes .NET
Integración con otros lenguajes .NET
6
¿Por qué y para qué?
Bondades...
Apuntadores: ¿Seguridad o no
seguridad?
¡Dinero! $$: VB .NET vs C#
Conclusión: Sistemas Windows y
arquitecturas soportadas bajo .NET
7
Plataforma .NET
Visión futura de Microsoft:
‘Cómputo distribuido’
Razones
Código reutilizable
“Funciona donde sea”
Proveedores de servicios
8
Plataforma .NET
Componentes
Definición de clases
CLR (Common Language Runtime) o
máquina virtual de MSIL*
Lenguajes
Visual Basic .NET
C#, puramente .NET
C++ administrado o Managed C++
*Microsoft Intermediate Language
9
C# vs. JAVA
Compilación a lenguaje intermedio
JAVA bytecode
Microsoft Intermediate Language (MSIL)
Más tipos primitivos en C#
Tipos enumerados: enumeration
Estructuras: struct
No existe herencia múltiple
Herencia a través de interfaces
10
C# vs. JAVA
Arreglos n-dimensionales
JAVA: Arreglos que son miembros de
otros arreglos
C#: Verdaderos arreglos
Polimorfismo implementado en
manera mas complicada que en
JAVA
11
C# vs. C++
Ausencia de encabezados
Administración automática de
memoria
Apuntadores: unsafe
Límites en arreglos
int != bool
switch
12
El lenguaje
Estructura básica de un programa
// A skeleton of a C# program
using System;
namespace MyNamespace1
{
class MyClass1
{…}
struct MyStruct
{…}
interface IMyInterface
{…}
namespace MyNamespace2
{…}
class MyClass2
{
public static void Main(string[] args)
{…}
}
}
13
El lenguaje
“Hola Mundo”
// "Hola Mundo!" en C#
using System;
class Hola
{
static void Main()
{
Console.WriteLine("Hola Mundo!");
}
}
Servicios .NET
14
El lenguaje
Palabras reservadas
abstract
class
event
if
new
readonly
struct
unsafe
as
const
explicit
implicit
null
ref
switch
ushort
base
continue
extern
in
object
return
this
using
bool
decimal
false
int
operator
sbyte
throw
virtual
break
default
finally
interface
out
sealed
true
volatile
byte
delegate
fixed
internal
override
short
try
void
case
do
float
is
params
sizeof
typeof
while
catch
double
for
lock
private
stackalloc
uint
char
else
foreach
long
protected
static
ulong
checked
enum
goto
namespace
public
string
unchecked
15
El lenguaje
Operadores
Categoría
Operadores
Aritméticos
+
-
*
/
%
Lógicos
&
|
^
!
~
&&
Concatenación
+
Incremento/Decremento
++
--
Corrimiento
<<
>>
Relacionales
==
!=
<
>
<=
Asignación
=
Acceso a miembros
.
Índices
[]
Cast
()
Condicional
?:
Concatenación y remoción
+
Creación de objetos
new
Información de tipos
is
sizeof
typeof
Desreferencia y dirección
*
->
&
+=
-=
*=
/=
||
true
false
>=
%=
&=
|=
^=
<<=
>>=
-
[]
16
El lenguaje
Tipos
Tipo de C#
Tipo en la plataforma .NET
¿Signo?
Bytes
empleados
Posibles valores
sbyte
System.Sbyte
Si
1
-128 a 127
short
System.Int16
Si
2
-32768 a 32767
int
System.Int32
Si
4
-2147483648 a 2147483647
long
System.Int64
Si
8
-9223372036854775808 a 9223372036854775807
byte
System.Byte
No
1
0 a 255
ushort
System.Uint16
No
2
0 a 65535
uint
System.UInt32
No
4
0 a 4294967295
ulong
System.Uint64
No
8
0 a 18446744073709551615
float
System.Single
Si
4
Aproximadamente ±1.5 x 10-45 a ±3.4 x 1038 con
7 dígitos significativos
double
System.Double
Si
8
Aproximadamente ±5.0 x 10-324 a ±1.7 x 10308
con 15 o 16 dígitos significativos
decimal
System.Decimal
Si
12
Aproximadamente ±1.0 x 10-28 a ±7.9 x 1028 con
28 o 29 dígitos significativos
char
System.Char
-
2
Cualquier carácter de Unicode (16 bit)
bool
System.Boolean
-
1/2
true o false
17
El lenguaje
Sobrecarga de operadores
operator
public static bool operator == (Value a, Value b)
{return a.Int == b.Int}
Referencia y valor
Copia por referencia
object x = new object();
x.myValue = 10;
object y = x;
y.myValue = 20;
18
El lenguaje
Arreglos de una dimensión
int[] i = new int[100];
int[] i = new int[2];
i[0] = 1;
i[1] = 2;
int[] i = new int[] {1,2};
int[] i = {1,2};
// Arreglo de 100 enteros
//Llenado del arreglo
// Declaración y asignación
Arreglos rectangulares
// Declaración de una matriz de 2x3
int[,] squareArray = new int[2,3];
//Declaración y asignación de una matriz 2x3
int[,] squareArray = {{1, 2, 3}, {4, 5, 6}};
//Algunos métodos inherentes de la clase: System.Array
squareArray.GetLowerBound(1);
// Nivel inferior
squareArray.GetUpperBound(1);
// Nivel superior
squareArray.GetLength(0);
// Tamaño del arreglo
19
El lenguaje
Arreglos no rectangulares
// Declaración del arreglo
int[][] jag = new int[2][];
jag[0] = new int [4];
//Dimensión de la primer fila
jag[1] = new int [6];
//Dimensión de la segunda fila
// Una manera de declarar e inicializar
int[][] jag = new int[][] {new int[] {1, 2, 3, 4},
new int[] {5, 6, 7, 8, 9, 10}};
20
El lenguaje
Tipo enumerado
public enum DAYS
{
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
}
Nombre o valor
using System;
public class EnumTest
{
public enum DAYS: byte
{ Lunes, Martes, Miercoles, Jueves, Viernes, Sabado, Domingo }
public static void Main()
{
Array dayArray = Enum.GetValues(typeof(EnumTest.DAYS));
foreach (DAYS day in dayArray)
Console.WriteLine( "El número {0} de EnumTest.DAYS "
+ " es {1}", day, day.ToString());
}
}
21
El lenguaje
Control de flujo: ciclos
while
do-while
for
for each
Itera sobre cada miembro que derive de la
interfaz IEnumerable
int[] a = new int[]{1,2,3};
foreach (int b in a)
System.Console.WriteLine(b);
22
El lenguaje
Control de flujo: salto
break
continue
goto
No recomendado para realizar iteraciones
Útil en situaciones de decisión en
transiciones (autómatas)
23
El lenguaje
Control de flujo: selección
if-else
switch
Evalúa solo un caso a la vez
Diferente en sintaxis respecto de C++
Opciones de fin por cada caso:
• break
• goto etiqueta
24
El lenguaje
Estructuras
struct Coordinate
{
public int x;
public int y;
public Coordinate(int x, int y)
{
this.x = x;
this.y = y;
}
}
Inicialización en la creación
Coordinate c = new Coordinate(10, 2);
25
El lenguaje
Espacios de nombres: Namespaces
Colecciones de clases ordenadas
jerárquicamente
Bien diferenciadas
Operador ‘.’ para especificar que clase
es la que se usa
26
El lenguaje
Clases
Declaración formada por 4 partes
Atributos
• Información extra para el compilador
Modificadores
• Tipo de acceso a los tipos definidos dentro de la
clase
Clase base
• Nombre de la clase y herencia
Cuerpo de la clase
27
El lenguaje
Clases: Modificadores
public
internal
protected
protected internal
private
new
abstract
sealed
28
El lenguaje
Métodos
Operaciones asociadas con la clase
Modificadores
static
virtual, override
extern
Parámetros
Referencia o valor
• Ref/out
29
El lenguaje
Métodos: sobrecarga
Identificador de nula duplicidad
Nombre del método
Parámetros (tipo de ellos)
public static int myMethod(int a,ref double b);
public static void myMethod(int e,ref double f,out bool g,char h);
30
El lenguaje
Métodos: Polimorfismo
Sobre escritura o redefinición de un método
heredado
public virtual double getArea() // En Rectangulo
{
return length * width;
}
public override double getArea() // En Cuadrado:Rectangulo
{
return length * length;
}
Square sq = new Square(5);
double area = sq.getArea();
Rectangle r = sq;
double area = r.getArea();
En ambos casos se usa el método
Cuadrado::Rectangulo
31
El lenguaje
Métodos: Polimorfismo
Ocultamiento
public double getArea() // En Rectangulo
{
return length * width;
}
public new double getArea() // En Cuadrado:Rectangulo
{
return length * length;
}
Square sq = new Square(5);
double area = sq.getArea();
Rectangle r = sq;
double area = r.getArea();
El método no es sobre escrito realmente, sino solo
escondido a la clase de donde heredo
32
Ejemplo: TDA Cola
//////////////////////////////////////////////////////////////////////
//
// Extraído de http://www.csharphelp.com/archives/archive14.html
//
//////////////////////////////////////////////////////////////////////
//Inicio de código
namespace Queue
{
using System;
///
/// implementación de una cola FIFO
///
public class Queue {
private uint count = 0;
private Node front = null;
private Node end = null;
private Node temp = null;
///
/// Verifica si la cola está vacia
///
public bool empty {
get {
return(count==0);
}
}
33
Ejemplo: TDA Cola
/// Regresa el número de elementos en la cola
public uint Count {
get {
return count;
}
}
/// Agrega un elemento a la cola
public void append(object obj) {
if(count==0){
front = end = new Node(obj, front);
} else {
end.Next = new Node(obj, end.Next);
end = end.Next;
}
count++;
}
/// Despacha al primer elemento de la cola. Es importante notar que no se libera
/// memoria pues esto es dejado a la máquina virtual (recolector de basura)
public object serve() {
temp = front;
if(count == 0)
throw new Exception("Cola vacia!");
front = front.Next;
count--;
return temp.Value;
}
34
Ejemplo: TDA Cola
///
/// Imprime el contenido de la cola
///
public void printQueue() {
temp = front;
while(temp != null){
Console.WriteLine("{0}", temp.Value.ToString());
temp = temp.Next;
}
}
}
///
/// La clase nodo se encarga de apunar al séte elemento y
/// guarder al objeto
///
class Node
{
public Node Next;
public object Value;
public Node(object value, Node next)
{
Next = next;
Value = value;
}
}
35
Ejemplo: TDA Cola
///
/// Prueba la cola para 3 elementos
///
class QueueTest
{
static void Main() {
Queue Q = new Queue();
object obj;
uint i,j;
UInt16[] numbers = new UInt16[]{10,20,30};
for(i = 0;i < numbers.Length;i++)
Q.append(numbers[i]);
Q.printQueue();
Console.WriteLine("Elementos en la cola = {0}", Q.Count);
j = Q.Count;
for(i = 0;i < j;i++){
obj = Q.serve();
Console.WriteLine("Despacha cola = {0}",
obj.ToString());
}
Console.WriteLine("Elementos en la cola = {0}", Q.Count);
}
}
}
//Fin del código
36
37
Descargar

C#: Un lenguaje or