manual 00 - c# net

148
.NET 2 C# .NET MCT: Luis Dueñas Pag 1 de 148 Introducción al lenguaje C# y .NET Framework C# es un lenguaje orientado a objetos elegante y con seguridad de tipos que permite a los desarrolladores crear una amplia gama de aplicaciones sólidas y seguras que se ejecutan en .NET Framework. Puede utilizar este lenguaje para crear aplicaciones cliente para Windows tradicionales, servicios Web XML, componentes distribuidos, aplicaciones cliente-servidor, aplicaciones de base de datos, y muchas tareas más. Microsoft Visual C# 2005 proporciona un editor de código avanzado, diseñadores de interfaz de usuario prácticos, un depurador integrado y muchas otras herramientas para facilitar un rápido desarrollo de la aplicación basado en la versión 2.0 del lenguaje C# y en .NET Framework. Nota La documentación de Visual C# supone que se conocen los conceptos básicos de programación. Si es un principiante en la materia, puede explorar Visual C# Express, que está disponible en el Web. También puede aprovechar cualquiera de los excelentes libros y recursos Web sobre C# para obtener conocimientos prácticos de programación. Lenguaje C# La sintaxis de C# es muy expresiva, aunque cuenta con menos de 90 palabras clave; también es sencilla y fácil de aprender. La sintaxis de C# basada en signos de llave podrá ser reconocida inmediatamente por cualquier persona familiarizada con C, C++ o Java. Los desarrolladores que conocen cualquiera de estos lenguajes pueden empezar a trabajar de forma productiva en C# en un plazo muy breve. La sintaxis de C# simplifica muchas de las complejidades de C++ y, a la vez, ofrece funciones eficaces tales como tipos de valores que aceptan valores NULL, enumeraciones, delegados, métodos anónimos y acceso directo a memoria, que no se encuentran en Java. C# también admite métodos y tipos genéricos, que proporcionan mayor rendimiento y seguridad de tipos, e iteradores, que permiten a los implementadores de clases de colección definir comportamientos de iteración personalizados que el código de cliente puede utilizar fácilmente. Como lenguaje orientado a objetos, C# admite los conceptos de encapsulación, herencia y polimorfismo. Todas las variables y métodos, incluido el método Main que es el punto de entrada de la aplicación, se encapsulan dentro de definiciones de clase. Una clase puede heredar directamente de una clase primaria, pero puede implementar cualquier número de interfaces. Los métodos que reemplazan a los métodos virtuales en una clase primaria requieren la palabra clave override como medio para evitar redefiniciones accidentales. En C#, una estructura es como una clase sencilla; es un tipo asignado en la pila que puede implementar interfaces pero que no admite la herencia. Además de estos principios básicos orientados a objetos, C# facilita el desarrollo de componentes de software a través de varias construcciones de lenguaje innovadoras, entre las que se incluyen: Firmas de métodos encapsulados denominadas delegados, que permiten notificaciones de eventos con seguridad de tipos. Propiedades, que actúan como descriptores de acceso para variables miembro privadas. Atributos, que proporcionan metadatos declarativos sobre tipos en tiempo de ejecución. Comentarios en línea de documentación XML.

Upload: yvan-carranza

Post on 25-Nov-2015

191 views

Category:

Documents


8 download

TRANSCRIPT

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 1 de 148

    Introduccin al lenguaje C# y .NET Framework

    C# es un lenguaje orientado a objetos elegante y con seguridad de tipos que permite a los

    desarrolladores crear una amplia gama de aplicaciones slidas y seguras que se ejecutan en .NET

    Framework. Puede utilizar este lenguaje para crear aplicaciones cliente para Windows

    tradicionales, servicios Web XML, componentes distribuidos, aplicaciones cliente-servidor,

    aplicaciones de base de datos, y muchas tareas ms. Microsoft Visual C# 2005 proporciona un

    editor de cdigo avanzado, diseadores de interfaz de usuario prcticos, un depurador integrado y

    muchas otras herramientas para facilitar un rpido desarrollo de la aplicacin basado en la versin

    2.0 del lenguaje C# y en .NET Framework.

    Nota

    La documentacin de Visual C# supone que se conocen los conceptos bsicos de programacin. Si es un principiante en la

    materia, puede explorar Visual C# Express, que est disponible en el Web. Tambin puede aprovechar cualquiera de los

    excelentes libros y recursos Web sobre C# para obtener conocimientos prcticos de programacin.

    Lenguaje C#

    La sintaxis de C# es muy expresiva, aunque cuenta con menos de 90 palabras clave; tambin es

    sencilla y fcil de aprender. La sintaxis de C# basada en signos de llave podr ser reconocida

    inmediatamente por cualquier persona familiarizada con C, C++ o Java. Los desarrolladores que

    conocen cualquiera de estos lenguajes pueden empezar a trabajar de forma productiva en C# en

    un plazo muy breve. La sintaxis de C# simplifica muchas de las complejidades de C++ y, a la vez,

    ofrece funciones eficaces tales como tipos de valores que aceptan valores NULL, enumeraciones,

    delegados, mtodos annimos y acceso directo a memoria, que no se encuentran en Java. C#

    tambin admite mtodos y tipos genricos, que proporcionan mayor rendimiento y seguridad de

    tipos, e iteradores, que permiten a los implementadores de clases de coleccin definir

    comportamientos de iteracin personalizados que el cdigo de cliente puede utilizar fcilmente.

    Como lenguaje orientado a objetos, C# admite los conceptos de encapsulacin, herencia y

    polimorfismo. Todas las variables y mtodos, incluido el mtodo Main que es el punto de entrada

    de la aplicacin, se encapsulan dentro de definiciones de clase. Una clase puede heredar

    directamente de una clase primaria, pero puede implementar cualquier nmero de interfaces. Los

    mtodos que reemplazan a los mtodos virtuales en una clase primaria requieren la palabra clave

    override como medio para evitar redefiniciones accidentales. En C#, una estructura es como una

    clase sencilla; es un tipo asignado en la pila que puede implementar interfaces pero que no admite

    la herencia.

    Adems de estos principios bsicos orientados a objetos, C# facilita el desarrollo de componentes

    de software a travs de varias construcciones de lenguaje innovadoras, entre las que se incluyen:

    Firmas de mtodos encapsulados denominadas delegados, que permiten notificaciones

    de eventos con seguridad de tipos.

    Propiedades, que actan como descriptores de acceso para variables miembro privadas.

    Atributos, que proporcionan metadatos declarativos sobre tipos en tiempo de ejecucin.

    Comentarios en lnea de documentacin XML.

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 2 de 148

    Si necesita interactuar con otro software de Windows, como objetos COM o archivos DLL nativos

    de Win32, podr hacerlo en C# mediante un proceso denominado "interoperabilidad". La

    interoperabilidad permite que los programas de C# realicen prcticamente lo mismo que una

    aplicacin de C++ nativa. C# admite incluso el uso de punteros y el concepto de cdigo "no

    seguro" en los casos en que el acceso directo a la memoria es absolutamente crtico.

    El proceso de generacin de C# es simple en comparacin con el de C y C++, y es ms flexible

    que en Java. No hay archivos de encabezado independientes, ni se requiere que los mtodos y los

    tipos se declaren en un orden determinado. Un archivo de cdigo fuente de C# puede definir

    cualquier nmero de clases, estructuras, interfaces y eventos.

    Arquitectura de la plataforma .NET Framework

    Los programas de C# se ejecutan en .NET Framework, un componente que forma parte de

    Windows y que incluye un sistema de ejecucin virtual denominado Common Language Runtime

    (CLR) y un conjunto unificado de bibliotecas de clases. CLR es la implementacin comercial de

    Microsoft de Common Language Infrastructure (CLI), norma internacional que constituye la base

    para crear entornos de ejecucin y desarrollo en los que los lenguajes y las bibliotecas trabajan

    juntos sin problemas.

    El cdigo fuente escrito en C# se compila en un lenguaje intermedio (IL) conforme con la

    especificacin CLI. El cdigo de lenguaje intermedio, junto con recursos tales como mapas de bits

    y cadenas, se almacena en disco en un archivo ejecutable denominado ensamblado, cuya

    extensin es .exe o .dll generalmente. Un ensamblado contiene un manifiesto que ofrece

    informacin sobre los tipos, la versin, la referencia cultural y los requisitos de seguridad del

    ensamblado.

    Cuando se ejecuta un programa de C#, el ensamblado se carga en CLR, con lo que se pueden

    realizar diversas acciones en funcin de la informacin del manifiesto. A continuacin, si se

    cumplen los requisitos de seguridad, CLR realiza una compilacin Just In Time (JIT) para convertir

    el cdigo de lenguaje intermedio en instrucciones mquina nativas. CLR tambin proporciona otros

    servicios relacionados con la recoleccin automtica de elementos no utilizados, el control de

    excepciones y la administracin de recursos. El cdigo ejecutado por CLR se denomina algunas

    veces "cdigo administrado", en contraposicin al "cdigo no administrado" que se compila en

    lenguaje mquina nativo destinado a un sistema especfico. En el diagrama siguiente se muestran

    las relaciones en tiempo de compilacin y tiempo de ejecucin de los archivos de cdigo fuente de

    C#, las bibliotecas de clases base, los ensamblados y CLR.

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 3 de 148

    La interoperabilidad del lenguaje es una funcin clave de .NET Framework. Como el cdigo de

    lenguaje intermedio generado por el compilador de C# cumple la especificacin de tipos comn

    (CTS), este cdigo generado en C# puede interactuar con el cdigo generado en las versiones

    .NET de Visual Basic, Visual C++, Visual J# o cualquiera de los ms de 20 lenguajes conformes

    con CTS. Un nico ensamblado puede contener varios mdulos escritos en diferentes lenguajes

    .NET, y los tipos admiten referencias entre s como si estuvieran escritos en el mismo lenguaje.

    Adems de los servicios en tiempo de ejecucin, .NET Framework tambin incluye una amplia

    biblioteca de ms de 4.000 clases organizada en espacios de nombres que ofrecen una diversidad

    de funciones tiles para la entrada y salida de archivos, la manipulacin de cadenas, el anlisis de

    archivos XML y los controles de formularios Windows Forms. La aplicacin de C# tpica utiliza

    continuamente la biblioteca de clases de .NET Framework para el tratamiento de las tareas

    comunes de "infraestructura".

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 4 de 148

    Lo nuevo en Visual C# 2005

    Microsoft Visual C# 2005 incluye nuevas caractersticas en las reas siguientes:

    Lenguaje y compilador

    Editor de cdigo

    Entorno de desarrollo

    Documentacin y especificaciones del lenguaje

    Depuracin

    Lenguaje y compilador

    El lenguaje de C# admite ahora tipos genricos, iteradores y tipos parciales. La versin ltima del

    compilador de C# tambin incluye nuevas caractersticas y opciones.

    Editor de cdigo

    Fragmentos de cdigo

    Los fragmentos de cdigo aceleran la entrada de construcciones de cdigo comn mediante una

    plantilla que se puede cumplimentar. Los fragmentos de cdigo se almacenan como archivos XML

    que se modifican y personalizan con facilidad.

    Fragmentos de cdigo (C#)

    Cmo: Utilizar fragmentos de cdigo (C#)

    Cmo: Utilizar fragmentos de cdigo envolventes

    Refactorizacin

    Las herramientas de refactorizacin reestructuran automticamente el cdigo fuente, por ejemplo,

    promocionando variables locales a parmetros o convirtiendo un bloque de cdigo en un mtodo.

    Cmo: Promocionar una variable local a parmetro

    Extraer mtodo

    Encapsular campo

    Extraer interfaz

    Cambiar nombre

    Quitar parmetros

    Reordenar parmetros

    Entorno de desarrollo

    IntelliSense

    IntelliSense se ha optimizado con estas nuevas caractersticas:

    La lista de finalizacin de la Lista de miembros aparece automticamente cuando el

    cursor retrocede a un operador de mbito que precede a un objeto o cuando deshace la

    accin de finalizacin.

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 5 de 148

    Cuando se escribe cdigo de control de errores, la Lista de miembros ayuda a descubrir

    la excepcin que se debe detectar filtrando los miembros irrelevantes de la lista de

    finalizacin en una clusula catch.

    Cuando sea preciso insertar cdigo normalizado, Generacin automtica de cdigo

    permite pedir a IntelliSense que inserte el cdigo.

    IntelliSense est disponible cuando se crean aplicaciones Web.

    Diseador de clases

    El Diseador de clases es un nuevo editor que muestra clases y tipos grficamente, y permite

    agregar o modificar mtodos. Tambin se pueden utilizar las herramientas de refactorizacin de la

    ventana Diseador de clases.

    Vea Disear y ver clases y tipos.

    Herramienta de prueba de objetos

    La Herramienta de prueba de objetos est diseada para llevar a cabo pruebas sencillas en el nivel

    de objetos. Permite crear una instancia de un objeto y llamar a sus mtodos.

    Vea Herramienta de prueba de objetos.

    Implementacin ClickOnce

    La implementacin de ClickOnce permite publicar aplicaciones para Windows en un servidor Web o

    recurso compartido de red con el fin de simplificar la instalacin.

    Vea Implementacin ClickOnce.

    Soporte de herramientas para ensamblados con nombre seguro

    Se ha rediseado el cuadro de dilogo Propiedades del proyecto, que ahora incluye

    compatibilidad para firmar ensamblados.

    Vea Propiedades del proyecto.

    Asistentes para cdigo

    Los siguientes asistentes de cdigo estn obsoletos:

    Asistente para mtodos de C#

    Asistente para propiedades de C#

    Asistente para campos de C#

    Asistente para indizadores de C#

    Documentacin y especificaciones del lenguaje

    La documentacin de referencia de C# se ha revisado exhaustivamente para dar una informacin

    completa sobre cuestiones de uso simples y avanzadas que los desarrolladores se planteen

    durante la creacin de aplicaciones en C#.

    Mejoras de depuracin especficas de C#

    Se han agregado caractersticas nuevas, como Editar y continuar, para ayudar al desarrollador de

    C#.

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 6 de 148

    Crear la primera aplicacin de C#

    Slo lleva un minuto crear una aplicacin de C#. Siga estos pasos para crear un programa que

    abre una ventana y reacciona al presionar un botn.

    Procedimientos

    Para crear una aplicacin de C#

    1. En el men Archivo, elija Nuevo y, a continuacin, haga clic en Proyecto.

    2. Asegrese que la plantilla Aplicacin para Windows est seleccionada; en el campo

    Name, escriba MyProject, y haga clic en Aceptar.

    Aparecer un formulario Windows Forms en el diseador de Windows Forms. sta es la

    interfaz de usuario de la aplicacin.

    3. En el men Ver, haga clic en Cuadro de herramientas para ver la lista de controles.

    4. Expanda la lista Controles comunes y arrastre el control de etiqueta hacia el

    formulario.

    5. Tambin en la lista del Cuadro de herramientas Controles comunes, arrastre un botn al

    formulario, junto a la etiqueta.

    6. Haga doble clic en el nuevo botn para abrir el Editor de cdigo. Visual C# Express ha

    insertado un mtodo denominado button1_Click que se ejecuta al hacer clic en el

    botn.

    7. Cambie el mtodo para que se parezca a esto:

    private void button1_Click(object sender, EventArgs e) { label1.Text =

    "Hello, World!"; }

    8. Presione F5 para compilar y ejecutar la aplicacin.

    Cuando haga clic en el botn, aparece un mensaje de texto. Enhorabuena! Acaba de

    escribir su primera aplicacin de C#.

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 7 de 148

    Palabras clave de C#

    Las palabras clave son identificadores predefinidos reservados que tienen un significado especial

    para el compilador. No se pueden utilizar como identificadores en un programa a menos que

    incluyan el carcter @ como prefijo. Por ejemplo, @if es un identificador vlido pero if no, por

    ser una palabra clave.

    abstract event new struct

    as explicit null switch

    base extern object this

    bool false operator throw

    break finally out true

    byte fixed override try

    case float params typeof

    catch for private uint

    char foreach protected ulong

    checked goto public unchecked

    class if readonly unsafe

    const implicit ref ushort

    continue in return using

    decimal int sbyte virtual

    default interface sealed volatile

    delegate internal short void

    do is sizeof while

    double lock stackalloc

    else long static

    enum namespace string

    Palabras clave contextuales

    get partial set

    value where yield

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 8 de 148

    Tipos

    El sistema de tipos de C# contiene las siguientes categoras:

    Tipos de valor

    Tipos de referencia

    Tipos de puntero

    Las variables de los tipos de valor almacenan datos, mientras que los tipos de referencia

    almacenan referencias a los datos reales. Los tipos de referencia tambin se denominan objetos.

    Los tipos de puntero slo se pueden utilizar en modo unsafe.

    Un tipo de valor se puede convertir en un tipo de referencia y de nuevo en un tipo de valor

    mediante boxing y unboxing. No se puede convertir un tipo de referencia en un tipo de valor,

    excepto en tipos de valor a los que se les ha aplicado una conversin boxing.

    Esta seccin tambin presenta void.

    Los tipos de valor tambin aceptan valores null, por tanto pueden almacenar un estado sin valor

    de suma.

    Tipos de valores

    Los tipos de valor consisten en dos categoras principales:

    Estructuras

    Enumeraciones

    Las estructuras se dividen en las siguientes categoras:

    Tipos numricos

    o Tipos integrales

    o Tipos de punto flotante

    o decimal

    bool

    Estructuras definidas por el usuario.

    Caractersticas principales de los tipos de valor

    Variable que est basada directamente en tipos de valor que contienen valores. La asignacin de

    una variable de tipo de valor a otra copia el valor contenido. Esto es diferente de la asignacin de

    variables de tipo de referencia, que copia una referencia en el objeto pero no el propio objeto.

    Todos los tipos de valor se derivan implcitamente de la clase System.ValueType.

    A diferencia de los tipos de referencia, no es posible obtener un nuevo tipo de un tipo de valor. No

    obstante, al igual que los tipos de referencia, las estructuras pueden implementar interfaces.

    A diferencia de los tipos de referencia, los tipos de valor no pueden incluir el valor null. Sin

    embargo, la caracterstica tipos que aceptan valores NULL permite asignar null a tipos de valores.

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 9 de 148

    Cada tipo de valor tiene un constructor implcito predeterminado que inicializa el valor

    predeterminado de ese tipo.

    Caractersticas principales de los tipos simples

    Todos los tipos simples (aquellos que forman parte integral del lenguaje C#) son alias de los tipos

    del sistema .NET Framework. Por ejemplo, int es un alias de System.Int32.

    Las expresiones constantes, cuyos operandos son todos constantes de tipos simples, se evalan

    en tiempo de compilacin.

    Los tipos simples se pueden inicializar mediante literales. Por ejemplo, 'A' es un literal del tipo

    char y 2001 es un literal del tipo int.

    Inicializar tipos de valor

    Las variables locales de C# se deben inicializar antes de utilizarlas. Por consiguiente, si se declara

    una variable local sin inicializacin como sta:

    int myInt;

    no se podr utilizar hasta que se inicialice. La inicializacin se puede realizar mediante la siguiente

    instruccin:

    myInt = new int(); // Invoke default constructor for int type.

    que equivale a:

    myInt = 0; // Assign an initial value, 0 in this example.

    Tambin se puede realizar la declaracin y la inicializacin en la misma instruccin:

    int myInt = new int();

    O bien

    int myInt = 0;

    Con el operador new, se realiza una llamada al constructor predeterminado del tipo especfico y se asigna el valor predeterminado a la variable. En el ejemplo anterior, el constructor predeterminado asigna a myInt el valor 0. Con los tipos definidos por el usuario, se utiliza new para invocar el constructor predeterminado.

    Por ejemplo, la siguiente instruccin invoca el constructor predeterminado de la estructura

    Point:

    Point p = new Point(); // Invoke default constructor for the struct.

    Despus de esta llamada, la estructura se considera definitivamente asignada; es decir, todos sus

    miembros se inicializan con sus valores predeterminados.

    struct

    Un tipo struct es un tipo de valor que se suele utilizar para encapsular pequeos grupos de

    variables relacionadas, como las coordenadas de un rectngulo o las caractersticas de un

    elemento de un inventario. En el ejemplo siguiente se muestra una declaracin de estructura

    sencilla.

    public struct Book { public decimal price; public string title; public string

    author; }

    Comentarios

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 10 de 148

    Las estructuras tambin pueden contener constructores, constantes, campos, mtodos,

    propiedades, indizadores, operadores, eventos y tipos anidados, aunque si se requieren estos

    miembros, se debe considerar la posibilidad de crear una clase en vez de un tipo.

    Las estructuras pueden implementar una interfaz, pero no pueden heredar de otra estructura. Por

    esa razn, los miembros de estructura no se pueden declarar como protected.

    enum

    La palabra clave enum se utiliza para declarar una enumeracin, un tipo distinto que consiste en

    un conjunto de constantes con nombre denominado lista de enumeradores. Cada tipo de

    enumeracin tiene un tipo subyacente, que puede ser cualquier tipo integral excepto char. El tipo

    predeterminado subyacente de los elementos de la enumeracin es int. De forma predeterminada,

    el primer enumerador tiene el valor 0 y el valor de cada enumerador sucesivo se incrementa en 1.

    Por ejemplo:

    enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

    En esta enumeracin, Sat es 0, Sun es 1, Mon es 2 y as sucesivamente. Los enumeradores

    pueden tener inicializadores que reemplazan a los valores predeterminados. Por ejemplo:

    enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

    En esta enumeracin, se obliga a que la secuencia de elementos empiece en 1 en vez de en 0.

    A una variable de tipo Days se le puede asignar cualquier valor en el intervalo del tipo

    subyacente; los valores no se limitan a las constantes con nombre.

    El valor predeterminado de un enum E es el valor producido por la expresin (E)0.

    Nota

    Un enumerador no puede contener espacio en blanco en su nombre.

    El tipo subyacente especifica el almacenamiento asignado para cada enumerador. No obstante, se

    necesita una conversin explcita para convertir un tipo enum a un tipo integral. Por ejemplo, la

    siguiente instruccin asigna el enumerador Sun a una variable de tipo int utilizando una

    conversin explcita para convertir de enum a int:

    int x = (int)Days.Sun;

    Cuando se aplica System.FlagsAttribute a una enumeracin que contiene algunos elementos

    combinados con una operacin OR bit a bit, se observar que el atributo afecta el comportamiento

    de enum cuando se utiliza con algunas herramientas. Se pueden observar estos cambios al

    utilizar herramientas tales como los mtodos de la clase Console, el Evaluador de expresiones,

    etc. (Vea el ejemplo 3).

    Programacin slida

    Asignar valores adicionales a nuevas versiones de enumeraciones o cambiar los valores de los

    miembros de enumeracin en una nueva versin, puede producir problemas para el cdigo fuente

    dependiente. Es comn que los valores enum se utilicen en instrucciones switch y, si se han

    agregado elementos adicionales al tipo enum, la comprobacin de los valores predeterminados

    puede devolver true de forma inesperada.

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 11 de 148

    Si otros desarrolladores van a utilizar su cdigo, es importante proporcionar instrucciones sobre

    cmo su cdigo debe reaccionar si se agregan nuevos elementos a cualquier tipo enum.

    Ejemplo

    En este ejemplo, se declara la enumeracin Days. Dos enumeradores se convierten

    explcitamente en un nmero entero y se asignan a variables de nmero entero.

    // keyword_enum.cs

    // enum initialization:

    using System;

    public class EnumTest

    {

    enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

    static void Main()

    {

    int x = (int)Days.Sun;

    int y = (int)Days.Fri;

    Console.WriteLine("Sun = {0}", x);

    Console.WriteLine("Fri = {0}", y);

    }

    }

    Resultados

    Sun = 2

    Fri = 7

    En este ejemplo, la opcin de tipo base se utiliza para declarar un enum cuyos miembros son del

    tipo long. Observe que a pesar de que el tipo subyacente de la enumeracin es long, los

    miembros de la enumeracin todava deben convertirse explcitamente al tipo long mediante una

    conversin de tipos.

    // keyword_enum2.cs

    // Using long enumerators

    using System;

    public class EnumTest

    {

    enum Range :long {Max = 2147483648L, Min = 255L};

    static void Main()

    {

    long x = (long)Range.Max;

    long y = (long)Range.Min;

    Console.WriteLine("Max = {0}", x);

    Console.WriteLine("Min = {0}", y);

    }

    }

    Resultados

    Max = 2147483648

    Min = 255

    El ejemplo de cdigo siguiente ilustra el uso y efecto del atributo System.FlagsAttribute en una

    declaracin enum.

    // enumFlags.cs

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 12 de 148

    // Using the FlagsAttribute on enumerations.

    using System;

    [Flags] public enum CarOptions {SunRoof = 0x01, Spoiler = 0x02, FogLights = 0x04,

    TintedWindows = 0x08, }

    class FlagTest

    {

    static void Main()

    {

    CarOptions options = CarOptions.SunRoof | CarOptions.FogLights;

    Console.WriteLine(options);

    Console.WriteLine((int)options);

    }

    }

    Resultados

    SunRoof, FogLights

    5

    Comentarios

    Observe que si se quita el inicializador de Sat=1, el resultado ser:

    Sun = 1 Fri = 6

    Comentarios

    Observe que si elimina FlagsAttribute, el ejemplo generar lo siguiente:

    5

    5

    Tipos de referencia

    Las variables de tipos de referencia, conocidas como objetos, almacenan referencias a los datos

    reales. Esta seccin presenta las palabras clave siguientes utilizadas para declarar tipos de

    referencia:

    class

    interface

    delegate

    Esta seccin tambin presenta los siguientes tipos de referencia integrados:

    object

    string

    class

    Las clases se declaran mediante la palabra clave class, como se muestra en el ejemplo siguiente:

    class TestClass { // Methods, properties, fields, events, delegates // and nested

    classes go here. }

    Comentarios

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 13 de 148

    A diferencia de C++, en C# slo se permite la herencia simple. En otras palabras, una clase puede

    heredar la implementacin de una sola clase base. Sin embargo, una clase puede implementar

    ms de una interfaz. La siguiente tabla muestra ejemplos de herencia de clases e implementacin

    de interfaces:

    Herencia Ejemplo

    Ninguna class ClassA { }

    Simple class DerivedClass: BaseClass { }

    Ninguna, implementa dos interfaces class ImplClass: IFace1, IFace2 { }

    Simple, implementa una interfaz class ImplDerivedClass: BaseClass, IFace1 { }

    Los niveles de acceso protected y private slo se permiten en clases anidadas.

    Una clase puede contener declaraciones de los siguientes miembros:

    Constructores

    Destructores

    Constantes

    Campos

    Mtodos

    Propiedades

    Indizadores

    Operadores

    Eventos

    Delegados

    Clases

    Interfaces

    Estructuras

    Ejemplo

    En el siguiente ejemplo se muestra la declaracin de campos de clase, constructores y mtodos.

    Tambin muestra la creacin de instancias de objetos y la impresin de datos de instancia. En este

    ejemplo, se declaran dos clases, la clase Kid, que contiene dos campos privados (name y age) y

    dos mtodos pblicos. La segunda clase, MainClass, se utiliza para contener Main.

    // keyword_class.cs

    // class example

    using System;

    class Kid

    {

    private int age;

    private string name;

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 14 de 148

    // Default constructor:

    public Kid()

    {

    name = "N/A";

    }

    // Constructor:

    public Kid(string name, int age)

    {

    this.name = name;

    this.age = age;

    }

    // Printing method:

    public void PrintKid()

    {

    Console.WriteLine("{0}, {1} years old.", name, age);

    }

    }

    class MainClass

    {

    static void Main()

    {

    // Create objects

    // Objects must be created using the new operator:

    Kid kid1 = new Kid("Craig", 11);

    Kid kid2 = new Kid("Sally", 10);

    // Create an object using the default constructor:

    Kid kid3 = new Kid();

    // Display results:

    Console.Write("Kid #1: ");

    kid1.PrintKid();

    Console.Write("Kid #2: ");

    kid2.PrintKid();

    Console.Write("Kid #3: ");

    kid3.PrintKid();

    }

    }

    Resultados

    Kid #1: Craig, 11 years old.

    Kid #2: Sally, 10 years old.

    Kid #3: N/A, 0 years old.

    Comentarios

    En el ejemplo anterior, observe que slo se puede obtener acceso a los campos privados (name y

    age) a travs de los mtodos pblicos de la clase Kid. Por ejemplo, no es posible imprimir un

    valor name de la clase kid, desde el mtodo Main, con una instruccin como sta:

    Console.Write(kid1.name); // Error

    El acceso a los miembros privados de Kid desde Main slo sera posible si Main fuera un

    miembro de la clase.

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 15 de 148

    Los tipos declarados en una clase sin un modificador de acceso tienen como valor predeterminado

    private, de modo que los miembros de datos de este ejemplo seguiran siendo private aunque se

    quite la palabra clave.

    Por ltimo, observe que, para el objeto creado mediante el constructor predeterminado (kid3), el

    campo age se inicializ a cero de forma predeterminada.

    interface

    Una interfaz contiene slo las firmas de mtodos, delegados o eventos. La implementacin de los

    mtodos se hace en la clase que implementa la interfaz, como se muestra en el ejemplo siguiente:

    interface ISampleInterface

    {

    void SampleMethod();

    }

    class ImplementationClass : ISampleInterface

    {

    // Explicit interface member implementation:

    void ISampleInterface.SampleMethod()

    {

    // Method implementation.

    }

    static void Main()

    {

    // Declare an interface instance.

    ISampleInterface obj = new ImplementationClass();

    // Call the member. obj.SampleMethod();

    }

    }

    Comentarios

    Una interfaz puede ser miembro de un espacio de nombres o de una clase, y puede contener

    firmas de los siguientes miembros:

    Mtodos

    Propiedades

    Indizadores

    Eventos

    Una interfaz puede heredar de una o varias interfaces base.

    Cuando una lista de tipos base contiene una clase base e interfaces, la clase base debe aparecer

    primero en la lista.

    Una clase que implementa una interfaz puede implementar explcitamente miembros de esa

    interfaz. Slo se puede tener acceso a un miembro explcitamente implementado mediante una

    instancia de la interfaz, y no mediante una instancia de clase, por ejemplo:

    Ejemplo

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 16 de 148

    En el siguiente ejemplo, se muestra la implementacin de una interfaz. En este ejemplo, la

    interfaz IPoint contiene la declaracin de propiedades, la cual es responsable de establecer y

    obtener los valores de los campos. La clase Point contiene la implementacin de las

    propiedades.

    // keyword_interface_2.cs

    // Interface implementation

    using System;

    interface IPoint

    {

    // Property signatures:

    int x { get; set; }

    int y { get; set; }

    }

    class Point : IPoint

    {

    // Fields:

    private int _x;

    private int _y;

    // Constructor:

    public Point(int x, int y)

    {

    _x = x;

    _y = y;

    }

    // Property implementation:

    public int x

    {

    get { return _x; }

    set { _x = value; }

    }

    public int y

    {

    get { return _y; }

    set { _y = value; }

    }

    }

    class MainClass

    {

    static void PrintPoint(IPoint p)

    {

    Console.WriteLine("x={0}, y={1}", p.x, p.y);

    }

    static void Main()

    {

    Point p = new Point(2, 3);

    Console.Write("My Point: ");

    PrintPoint(p);

    }

    }

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 17 de 148

    Resultados

    My Point: x=2, y=3

    delegate

    La declaracin de un tipo de delegado se presenta de la siguiente forma:

    public delegate void TestDelegate(string message);

    La palabra clave delegate se usa para declarar un tipo de referencia, que puede utilizarse para

    encapsular un mtodo con nombre o annimo. Los delegados son similares a los punteros a

    funciones de C++, pero son ms seguros y proporcionan mayor seguridad de tipos.

    Comentarios

    Los delegados son la base de los eventos.

    Se pueden crear instancias de un delegado asocindolo a un mtodo con nombre o annimo.

    Para el uso con mtodos con nombre, se deben crear instancias del delegado con un mtodo que

    tenga una firma aceptable. Para el uso con mtodos annimos, el delegado y el cdigo que se van

    a asociar se declaran juntos. En esta seccin se describen las dos formas de crear instancias de

    delegados.

    using System;

    // Declare delegate -- defines required signature:

    delegate void SampleDelegate(string message);

    class MainClass

    {

    // Regular method that matches signature:

    static void SampleDelegateMethod(string message)

    {

    Console.WriteLine(message);

    }

    static void Main()

    {

    // Instantiate delegate with named method:

    SampleDelegate d1 = SampleDelegateMethod;

    // Instantiate delegate with anonymous method:

    SampleDelegate d2 = delegate(string message)

    {

    Console.WriteLine(message);

    };

    // Invoke delegate

    d1: d1("Hello");

    // Invoke delegate

    d2: d2(" World");

    }

    }

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 18 de 148

    object

    El tipo object es un alias de Object en .NET Framework. En el sistema de tipos unificado de C#,

    todos los tipos (tipos de valor y de referencia predefinidos y definidos por el usuario) se heredan

    directa o indirectamente de Object. Las variables de tipo object pueden recibir valores de

    cualquier tipo. Cuando una variable de un tipo de valor se convierte en un objeto, se dice que se

    le ha aplicado la conversin boxing. Cuando una variable de objeto de tipo se convierte en un tipo

    de valor, se dice que se le ha aplicado la conversin unboxing.

    Ejemplo

    En el siguiente ejemplo se muestra cmo las variables de tipo object pueden aceptar valores de

    cualquier tipo de datos y cmo pueden utilizar mtodos de Object procedentes de .NET

    Framework.

    // keyword_object.cs

    using System;

    class SampleClass

    {

    public int i = 10;

    }

    class MainClass

    {

    static void Main()

    {

    object a; a = 1;

    // an example of boxing

    Console.WriteLine(a);

    Console.WriteLine(a.GetType());

    Console.WriteLine(a.ToString());

    a = new SampleClass();

    SampleClass classRef;

    classRef = (SampleClass)a;

    Console.WriteLine(classRef.i);

    }

    }

    Resultados

    1 System.Int32 1 10

    string

    El tipo string representa una cadena de caracteres Unicode. string es un alias para String en

    .NET Framework. Las cadenas son inmutables: no se puede cambiar el contenido de un objeto de

    tipo string despus de crearlo.

    Aunque string es un tipo de referencia, los operadores de igualdad (== y !=) se definen para

    comparar los valores de objetos string, no las referencias. De esta forma, es ms intuitivo

    comprobar la igualdad entre cadenas. Por ejemplo:

    string a = "hello"; string b = "h"; // Append to contents of 'b' b += "ello";

    Console.WriteLine(a == b); Console.WriteLine((object)a == (object)b);

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 19 de 148

    Esto presenta "True" y, despus, "False" porque el contenido de las cadenas es equivalente, pero

    a y b no hacen referencia a la misma instancia de cadena.

    El operador + concatena cadenas:

    string a = "good " + "morning";

    Esto crea un objeto de tipo string que contiene "good morning".

    El operador [] se puede utilizar para tener acceso a caracteres individuales de un objeto string:

    string str = "test"; char x = str[2]; // x = 's';

    Los literales de cadena son objetos de tipo string que se pueden escribir de dos formas: entre

    comillas o entre comillas y precedidos de @. Los literales de cadena se deben encerrar entre

    comillas ("):

    "good morning" // a string literal

    Los literales de cadena pueden contener cualquier literal de carcter, incluidas las secuencias de

    escape:

    string a = "\\\u0066\n";

    Esta cadena contiene una barra diagonal inversa, la letra f y el carcter de nueva lnea.

    Nota

    El cdigo de escape \udddd (donde dddd es un nmero de cuatro dgitos) representa el carcter Unicode U+dddd. Tambin se reconocen los cdigos de escape Unicode de 8 dgitos: \udddd\udddd.

    Los literales de cadena entrecomillados y precedidos por @ empiezan con este smbolo y se

    encierran entre comillas. Por ejemplo:

    @"good morning" // a string literal

    La ventaja de utilizar la combinacin del signo @ y el entrecomillado es que las secuencias de

    escape no se procesan, lo que facilita la escritura, por ejemplo, de un nombre de archivo

    completo:

    @"c:\Docs\Source\a.txt" // rather than "c:\\Docs\\Source\\a.txt"

    Para incluir comillas tipogrficas en una cadena precedida del smbolo @, escriba las comillas dos

    veces:

    @"""Ahoy!"" cried the captain." // "Ahoy!" cried the captain.

    Otro uso del smbolo @ consiste en utilizar identificadores de referencia (/reference) que resulten

    ser palabras clave de C#.

    Ejemplo

    // keyword_string.cs

    using System;

    class TestClass

    {

    static void Main()

    {

    string a = "\u0068ello ";

    string b = "world";

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 20 de 148

    Console.WriteLine( a + b );

    Console.WriteLine( a + b == "hello world" );

    }

    }

    Resultados

    hello world True

    void

    Cuando se utiliza como tipo de valor devuelto por un mtodo, void especifica que el mtodo no

    devuelve ningn valor.

    No se permite utilizar void en una lista de parmetros de un mtodo. Un mtodo que no utiliza

    parmetros y que no devuelve ningn valor se declara del siguiente modo:

    void SampleMethod();

    void tambin se utiliza en un contexto no seguro para declarar un puntero a un tipo desconocido.

    void es un alias para el tipo System.Void de .NET Framework.

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 21 de 148

    Tablas de referencia de tipos Las siguientes tablas de referencia de tipos resumen los tipos de C#:

    Tabla de tipos integrados

    La siguiente tabla muestra las palabras clave para los tipos integrados de C#, las cuales son alias

    de tipos predefinidos en el espacio de nombres System.

    Tipo de C# Tipo de .NET Framework

    bool System.Boolean

    byte System.Byte

    sbyte System.SByte

    char System.Char

    decimal System.Decimal

    double System.Double

    float System.Single

    int System.Int32

    uint System.UInt32

    long System.Int64

    ulong System.UInt64

    object System.Object

    short System.Int16

    ushort System.UInt16

    string System.String

    Comentarios

    Todos los tipos de la tabla, excepto object y string, se conocen como tipos simples.

    Las palabras clave de tipos de C# y sus alias son intercambiables. Por ejemplo, se puede declarar

    una variable entera de cualquiera de estas dos formas:

    int x = 123; System.Int32 x = 123;

    Para mostrar el tipo real de cualquier tipo de C#, utilice el mtodo del sistema GetType(). Por

    ejemplo, la siguiente instruccin muestra el alias de sistema que representa el tipo de

    myVariable:

    Console.WriteLine(myVariable.GetType());

    Tambin se puede utilizar el operador typeof.

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 22 de 148

    Tabla de tipos integrales

    La siguiente tabla muestra los tamaos e intervalos de los tipos integrales, que constituyen un

    subconjunto de los tipos simples.

    Tipo Intervalo Tamao

    sbyte -128 a 127 Entero de 8 bits con signo

    byte 0 a 255 Entero de 8 bits sin signo

    char U+0000 a U+ffff Carcter Unicode de 16 bits

    short -32.768 a 32.767 Entero de 16 bits con signo

    ushort 0 a 65.535 Entero de 16 bits sin signo

    int -2.147.483.648 a 2.147.483.647 Entero de 32 bits con signo

    uint 0 a 4.294.967.295 Entero de 32 bits sin signo

    long -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 Entero de 64 bits con signo

    ulong 0 a 18.446.744.073.709.551.615 Entero de 64 bits sin signo

    Si el valor representado por un literal entero supera el intervalo de valores del tipo ulong, se

    producir un error de compilacin.

    Tabla de tipos de punto flotante

    La siguiente tabla muestra la precisin y el intervalo aproximado para los tipos de punto flotante.

    Tipo Intervalo aproximado Precisin

    float 1,5e45 a 3,4e38 7 dgitos

    double 5,0e324 a 1,7e308 15-16 dgitos

    Tabla de valores predeterminados

    La siguiente tabla muestra los valores predeterminados de los tipos de valor devueltos por los

    constructores predeterminados. Los constructores predeterminados se invocan mediante el

    operador new, de la manera siguiente:

    int myInt = new int();

    La instruccin anterior tiene el mismo efecto que la instruccin siguiente:

    int myInt = 0;

    Recuerde que el uso de variables no inicializadas no est permitido en C#.

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 23 de 148

    Tipo de

    valor Valor predeterminado

    bool false

    byte 0

    char '\0'

    decimal 0,0M

    double 0,0D

    enum El valor producido por la expresin (E)0, donde E es el identificador de la enumeracin.

    float 0,0F

    int 0

    long 0L

    sbyte 0

    short 0

    struct El valor obtenido al asignar los valores predeterminados a los campos de tipo de valor y el valor null a los

    campos de tipo de referencia.

    uint 0

    ulong 0

    ushort 0

    Tabla de tipos de valores

    En la tabla siguiente, se enumeran los tipos de valor de C# por categoras.

    Tipo de valor Categora

    bool Booleano

    byte Sin signo, numrica, integral

    char Sin signo, numrica, integral

    decimal Numrica, decimal

    double Numrica, de punto flotante

    enum Enumeracin

    float Numrica, de punto flotante

    int Con signo, numrica, integral

    long Con signo, numrica, integral

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 24 de 148

    sbyte Con signo, numrica, integral

    short Con signo, numrica, integral

    struct Estructura definida por el usuario

    uint Sin signo, numrica, integral

    ulong Sin signo, numrica, integral

    ushort Sin signo, numrica, integral

    Tabla de conversiones numricas implcitas

    La tabla siguiente muestra las conversiones numricas implcitas predefinidas. Las conversiones

    implcitas se pueden dar en muchas ocasiones, incluidas la invocacin a mtodos y las

    instrucciones de asignacin.

    De A

    sbyte short, int, long, float, double o decimal

    byte short, ushort, int, uint, long, ulong, float, double o decimal

    short int, long, float, double o decimal

    ushort int, uint, long, ulong, float, double o decimal

    int long, float, double o decimal

    uint long, ulong, float, double o decimal

    long float, double o decimal

    char ushort, int, uint, long, ulong, float, double o decimal

    float double

    ulong float, double o decimal

    Comentarios

    Las conversiones de int, uint o long a float y de long a double pueden causar una

    prdida de precisin, pero no una prdida de magnitud.

    No existen conversiones implcitas al tipo char.

    No hay ninguna conversin implcita entre los tipos de punto flotante y el tipo decimal.

    Una expresin constante de tipo int se puede convertir a sbyte, byte, short, ushort,

    uint o ulong, siempre que el valor de la expresin constante quede dentro del intervalo del

    tipo de destino.

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 25 de 148

    Tabla de conversiones numricas explcitas

    Las conversiones numricas explcitas se utilizan para convertir cualquier tipo numrico a

    cualquier otro tipo numrico, para el que no existe conversin implcita, mediante una expresin

    que utilice el operador de conversin explcita. La siguiente tabla muestra estas conversiones.

    De Para

    sbyte byte, ushort, uint, ulong o char

    byte Sbyte o char

    short sbyte, byte, ushort, uint, ulong o char

    ushort sbyte, byte, short o char

    int sbyte, byte, short, ushort, uint, ulong o char

    uint sbyte, byte, short, ushort, int o char

    long sbyte, byte, short, ushort, int, uint, ulong o char

    ulong sbyte, byte, short, ushort, int, uint, long o char

    char sbyte, byte o short

    float sbyte, byte, short, ushort, int, uint, long, ulong, char o decimal

    double sbyte, byte, short, ushort, int, uint, long, ulong, char, float o decimal

    decimal sbyte, byte, short, ushort, int, uint, long, ulong, char, float o double

    Comentarios

    Las conversiones numricas explcitas pueden producir prdida de precisin o provocar

    excepciones.

    Cuando se convierte un valor decimal en un tipo integral, este valor se redondea hacia

    cero al valor entero ms prximo. Si el valor entero resultante queda fuera del intervalo del

    tipo de destino, se produce una excepcin OverflowException.

    Cuando se convierte un valor double o float en un tipo integral, el valor se trunca. Si

    el valor entero resultante queda fuera del intervalo del valor de destino, el resultado

    depende del contexto de comprobacin de desbordamiento. En un contexto comprobado, se

    produce una excepcin OverflowException, mientras que en un contexto no comprobado,

    el resultado es un valor no especificado del tipo de destino.

    Cuando se convierte double en float, el valor double se redondea al valor float ms

    prximo. Si el valor de tipo double es demasiado pequeo o demasiado grande para

    ajustarse al tipo de destino, el resultado ser cero o infinito.

    Cuando se convierte float o double en decimal, el valor de origen se convierte en una

    representacin decimal y se redondea al nmero ms prximo despus de la vigsimo

    octava posicin decimal si es necesario. Segn el valor de origen, se puede producir uno de

    los siguientes resultados:

    o Si el valor de origen es demasiado pequeo para representarlo como

    decimal, el resultado se convierte en cero.

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 26 de 148

    o Si el valor de origen es NaN (no es un nmero), infinito o demasiado grande

    para ser representado como decimal, se produce una excepcin OverflowException.

    Cuando se convierte decimal en float o double, el valor decimal se redondea al valor

    double o float ms prximo.

    Aplicar formato a la tabla de resultados numricos

    Se puede dar formato a los resultados numricos mediante el mtodo String.Format o a travs

    del mtodo Console.Write, el cual llama a String.Format. El formato se determina mediante las

    cadenas de formato. La tabla siguiente contiene las cadenas de formato estndar admitidas. La

    cadena de formato tiene la forma siguiente: Axx,, donde A es el especificador de formato y xx es

    el especificador de precisin. El especificador de formato controla el tipo de formato aplicado al

    valor numrico, mientras que el especificador de precisin controla el nmero de dgitos

    significativos o posiciones decimales del resultado.

    Carcter Descripcin Ejemplos Resultados

    C o c Moneda Console.Write("{0:C}", 2,5);

    Console.Write("{0:C}", -2,5);

    $2.50

    ($2.50)

    D o d Decimal Console.Write("{0:D5}", 25); 00025

    E o e Cientfico Console.Write("{0:E}", 250000); 2,500000E+005

    F o f Punto fijo Console.Write("{0:F2}", 25);

    Console.Write("{0:F0}", 25);

    25.00

    25

    G o g General Console.Write("{0:G}", 2,5); 2.5

    N o n Nmero Console.Write("{0:N}", 2500000); 2.500.000,00

    X o x Hexadecimal Console.Write("{0:X}", 250);

    Console.Write("{0:X}", 0xffff);

    FA

    FFFF

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 27 de 148

    Modificadores

    Los modificadores se utilizan para modificar declaraciones de tipos y miembros de tipos. Esta

    seccin presenta los siguientes modificadores de C#:

    Modificador Finalidad

    Modificadores de

    acceso

    public

    private

    internal

    protected

    Especificar la accesibilidad declarada de tipos y miembros de tipos.

    abstract Indica que una clase est definida slo como clase base de otras clases.

    const Especifica que el valor del campo o de la variable local no se pueden modificar.

    event Declara un evento.

    extern Indica que el mtodo est implementado externamente.

    new Oculta un miembro heredado de un miembro de clase base.

    override Proporciona una nueva implementacin de un miembro virtual heredado de una clase base.

    partial Define clases y estructuras parciales a lo largo del mismo ensamblado.

    readonly Declara un campo al cual slo se pueden asignar valores como parte de la declaracin o en un

    constructor de la misma clase.

    sealed Especifica que una clase no se puede heredar.

    static Declara un miembro que pertenece al propio tipo en vez de a un objeto especfico.

    unsafe Declara un contexto no seguro.

    virtual Declara un mtodo o un descriptor de acceso cuya implementacin se puede cambiar mediante

    un miembro de reemplazo perteneciente a una clase derivada.

    volatile Indica que un campo puede ser modificado en el programa por el sistema operativo, el hardware

    o un subproceso en ejecucin de forma simultnea.

    Modificadores de acceso

    Los modificadores de acceso son palabras clave que especifican la accesibilidad declarada de un

    miembro o un tipo. Esta seccin presenta los cuatro modificadores de acceso:

    public

    protected

    internal

    private

    Mediante los modificadores de acceso se pueden especificar los siguientes cinco niveles de

    accesibilidad:

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 28 de 148

    public: acceso no restringido.

    protected: acceso limitado a la clase contenedora o a los tipos derivados de esta clase.

    Internal: acceso limitado al ensamblado actual.

    protected internal: acceso limitado al ensamblado actual o los tipos derivados de la clase

    contenedora.

    private: acceso limitado al tipo contenedor.

    Esta seccin tambin presenta los siguientes temas:

    Niveles de accesibilidad: utilizar los cuatro modificadores de acceso para declarar cinco

    niveles de accesibilidad.

    Dominio de accesibilidad: especifica dnde se puede hacer referencia a un miembro en

    las secciones de programa.

    Restricciones en el uso de los niveles de accesibilidad: resumen de las restricciones en

    el uso de los niveles de accesibilidad declarados.

    Niveles de accesibilidad

    Utilice los modificadores de acceso public, protected, internal o private para especificar una de las

    siguientes accesibilidades declaradas para miembros.

    Accesibilidad declarada Significado

    public Acceso no restringido.

    protected Acceso limitado a la clase contenedora o a los tipos derivados de esta clase.

    internal Acceso limitado al proyecto actual.

    protected internal Acceso limitado al proyecto actual o a los tipos derivados de la clase contenedora.

    private Acceso limitado al tipo contenedor.

    Slo se permite un modificador de acceso para un miembro o tipo, excepto cuando se utiliza la

    combinacin protected internal.

    Los modificadores de acceso no se pueden utilizar en espacios de nombres. Los espacios de

    nombres no presentan restricciones de acceso.

    Segn el contexto en el que se produce una declaracin de miembro, slo se permite declarar

    ciertos tipos de acceso. Si no se especifica ningn modificador de acceso en una declaracin de

    miembro, se utiliza el tipo de acceso predeterminado.

    Los tipos de nivel superior, que no estn anidados en otros tipos, slo pueden tener accesibilidad

    internal o public. La accesibilidad predeterminada para estos tipos es internal.

    Los tipos anidados, que son miembros de otros tipos, pueden tener un tipo de acceso declarado

    como el que se indica en la siguiente tabla.

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 29 de 148

    Miembros de Accesibilidad predeterminada Accesibilidades declaradas permitidas

    enum public Ninguna

    class private public

    protected

    internal

    private

    protected internal

    interface public Ninguna

    struct private public

    internal

    private

    La accesibilidad de un tipo anidado depende de su dominio de accesibilidad, el cual se determina

    mediante la accesibilidad declarada para el miembro y el dominio de accesibilidad del tipo

    inmediato que lo contiene. Sin embargo, el dominio de accesibilidad de un tipo anidado no puede

    exceder al del tipo contenedor.

    Dominio de accesibilidad

    El dominio de accesibilidad de un miembro especifica en qu secciones del programa se puede

    hacer referencia a un miembro. Si el miembro est anidado dentro de otro tipo, su dominio de

    accesibilidad viene determinado por el nivel de accesibilidad del miembro y por el dominio de

    accesibilidad del tipo contenedor inmediato.

    El dominio de accesibilidad de un tipo de nivel superior es, al menos, el texto del programa del

    proyecto en el que aparece declarado. Es decir, todos los archivos de cdigo fuente del proyecto.

    El dominio de accesibilidad de un tipo anidado es, al menos, el texto del programa en el que el

    tipo aparece declarado. Es decir, el cuerpo del tipo, incluidos los tipos anidados. El dominio de

    accesibilidad de un tipo anidado no puede superar al del tipo contenedor. Estos conceptos se

    muestran en el siguiente ejemplo.

    Ejemplo

    Este ejemplo contiene un tipo de nivel superior, T1, y dos clases anidadas, M1 y M2. Las clases

    contienen campos con diferentes accesibilidades declaradas. En el mtodo Main, a cada

    instruccin le sigue un comentario que indica el dominio de accesibilidad de cada miembro.

    Observe que las instrucciones que intentan hacer referencia a los miembros inaccesibles estn

    desactivadas mediante signos de comentario. Si desea ver los errores generados por el compilador

    cuando se intenta hacer referencia a un miembro inaccesible, quite los comentarios de uno en

    uno.

    // cs_Accessibility_Domain.cs

    using System;

    namespace AccessibilityDomainNamespace

    {

    public class T1

    {

    public static int publicInt;

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 30 de 148

    internal static int internalInt;

    private static int privateInt = 0;

    // CS0414 public class M1

    {

    public static int publicInt;

    internal static int internalInt;

    private static int privateInt = 0;

    // CS0414

    }

    private class M2

    {

    public static int publicInt = 0;

    internal static int internalInt = 0;

    private static int privateInt = 0;

    // CS0414

    }

    }

    class MainClass

    {

    static void Main()

    {

    // Access is unlimited:

    T1.publicInt = 1;

    // Accessible only in current assembly:

    T1.internalInt = 2;

    // Error: inaccessible outside T1:

    // T1.myPrivateInt = 3;

    // Access is unlimited:

    T1.M1.publicInt = 1;

    // Accessible only in current assembly:

    T1.M1.internalInt = 2;

    // Error: inaccessible outside M1:

    // T1.M1.myPrivateInt = 3;

    // Error: inaccessible outside T1:

    // T1.M2.myPublicInt = 1;

    // Error: inaccessible outside T1:

    // T1.M2.myInternalInt = 2;

    // Error: inaccessible outside M2:

    // T1.M2.myPrivateInt = 3;

    }

    }

    }

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 31 de 148

    Restricciones en el uso de los niveles de accesibilidad

    Cuando se declara un tipo, es esencial determinar si ese tipo tiene que ser al menos tan accesible

    como otro miembro o tipo. Por ejemplo, la clase base directa debe ser al menos tan accesible

    como la clase derivada. Las siguientes declaraciones producirn un error del compilador, ya que la

    clase base BaseClass es menos accesible que MyClass:

    class BaseClass

    {

    ...

    }

    public class MyClass: BaseClass

    {

    ...

    }

    // Error

    La siguiente tabla resume las restricciones de uso de los niveles de accesibilidad declarados.

    Contexto Comentarios

    Clases La clase base directa de un tipo de clase debe ser al menos tan accesible como el propio tipo de clase.

    Interfaces Las interfaces base explcitas de un tipo de interfaz deben ser al menos tan accesibles como el propio tipo

    de interfaz.

    Delegados El tipo de valor devuelto y los tipos de los parmetros de un tipo delegado deben ser al menos tan

    accesibles como el propio tipo delegado.

    Constantes El tipo de una constante debe ser al menos tan accesible como la propia constante.

    Campos El tipo de un campo debe ser al menos tan accesible como el propio campo.

    Mtodos El tipo de valor devuelto y los tipos de parmetros de un mtodo deben ser al menos tan accesibles como el

    propio mtodo.

    Propiedades El tipo de una propiedad debe ser al menos tan accesible como la misma propiedad.

    Eventos El tipo de un evento debe ser al menos tan accesible como el propio evento.

    Indizadores El tipo y los tipos de parmetros de un indizador deben ser al menos tan accesibles como el propio

    indizador.

    Operadores El tipo de valor devuelto y los tipos de parmetros de un operador deben ser al menos tan accesibles como

    el propio operador.

    Constructores Los tipos de parmetros de un constructor deben ser al menos tan accesibles como el propio constructor.

    Ejemplo

    El siguiente ejemplo contiene declaraciones errneas de diferentes tipos. El comentario que sigue

    a cada declaracin indica el error esperado del compilador.

    // Restrictions_on_Using_Accessibility_Levels.cs

    // CS0052 expected as well as CS0053, CS0056, and CS0057

    // To make the program work, change access level of both class B

    // and MyPrivateMethod() to public.

    using System;

    // A delegate:

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 32 de 148

    delegate int MyDelegate();

    class B

    {

    // A private method:

    static int MyPrivateMethod()

    {

    return 0;

    }

    }

    public class A

    {

    // Error: The type B is less accessible than the field A.myField.

    public B myField = new B();

    // Error: The type B is less accessible

    // than the constant A.myConst.

    public readonly B myConst = new B();

    public B MyMethod()

    {

    // Error: The type B is less accessible

    // than the method A.MyMethod.

    return new B();

    }

    // Error: The type B is less accessible than the property A.MyProp

    public B MyProp

    {

    set { }

    }

    MyDelegate d = new MyDelegate(B.MyPrivateMethod);

    // Even when B is declared public, you still get the error:

    // "The parameter B.MyPrivateMethod is not accessible due to

    // protection level."

    public static B operator +(A m1, B m2)

    {

    // Error: The type B is less accessible

    // than the operator A.operator +(A,B)

    return new B();

    }

    static void Main()

    {

    Console.Write("Compiled successfully");

    }

    }

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 33 de 148

    internal

    La palabra clave internal es un modificador de acceso para tipos y miembros de tipos. Los tipos o

    miembros internos slo son accesibles dentro de los archivos del mismo ensamblado, como en

    este ejemplo:

    public class BaseClass

    {

    // Only accessible within the same assembly

    internal static int x = 0;

    }

    Encontrar una comparacin de internal con los otros modificadores de acceso en Niveles de

    accesibilidad y Modificadores de acceso (Gua de programacin de C#).

    Un uso habitual del acceso de tipo interno se da en el desarrollo basado en componentes, ya que

    permite a un grupo de componentes cooperar de manera privada sin estar expuesto al resto del

    cdigo de la aplicacin. Por ejemplo, una estructura para crear interfaces grficas de usuario

    podra proporcionar clases Control y Form que cooperan mediante miembros con acceso de tipo

    internal. Como estos miembros son internos, no estn expuestos al cdigo que utiliza la

    estructura.

    Si se hace referencia a un tipo o miembro con acceso interno fuera del ensamblado en el que se

    defini, produce un error.

    Nota

    El mtodo internal virtual puede reemplazarse en algunos lenguajes, como en el Lenguaje intermedio de Microsoft (MSIL)

    textual mediante Ilasm.exe, aunque no se pueda reemplazar utilizando C#.

    Ejemplo

    Este ejemplo contiene dos archivos, Assembly1.cs y Assembly2.cs. El primer archivo

    contiene una clase base interna, BaseClass. En el segundo archivo, un intento de crear

    instancias BaseClass generar un error.

    // Assembly1.cs

    // compile with: /target:library

    internal class BaseClass

    {

    public static int intM = 0;

    }

    // Assembly1_a.cs

    // compile with: /reference:Assembly1.dll

    class TestAccess

    {

    static void Main()

    {

    BaseClass myBase = new BaseClass();

    // CS0122

    }

    }

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 34 de 148

    En este ejemplo, utilice los mismos archivos que utiliz en el primer ejemplo y cambie el nivel de

    accesibilidad de BaseClass a public. Adems cambie el nivel de accesibilidad del miembro IntM

    a internal. En este caso, puede crear instancias de la clase, pero no puede tener acceso al

    miembro interno.

    // Assembly2.cs

    // compile with: /target:library

    public class BaseClass

    {

    internal static int intM = 0;

    }

    // Assembly2_a.cs

    // compile with:

    /reference:Assembly1.dll

    public class TestAccess

    {

    static void Main()

    {

    BaseClass myBase = new BaseClass();

    // Ok. BaseClass.intM = 444;

    // CS0117

    }

    }

    private

    La palabra clave private es un modificador de acceso de miembros. El acceso de tipo private

    corresponde al nivel de acceso ms restrictivo. Los miembros privados slo son accesibles dentro

    del cuerpo de la clase o estructura en la que se declaran, como en el siguiente ejemplo.

    class Employee { private int i; double d; // private access by default }

    Los tipos anidados del mismo cuerpo tambin pueden tener acceso a esos miembros privados.

    Hacer referencia a un miembro privado fuera de la clase o estructura en la que se declara produce

    un error de compilacin.

    Ejemplo

    En este ejemplo, la clase Employee contiene dos miembros de datos privados, name y salary.

    Como miembros privados, slo pueden tener acceso a ellos los mtodos miembro; por tanto, hay

    que agregar los mtodos pblicos denominados GetName y Salary para permitir el acceso

    controlado a los miembros privados. Se tiene acceso al miembro name a travs del mtodo

    pblico y se tiene acceso al miembro salary a travs de una propiedad pblica de slo lectura.

    // private_keyword.cs

    using System;

    class Employee

    {

    private string name = "FirstName, LastName";

    private double salary = 100.0;

    public string GetName()

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 35 de 148

    {

    return name;

    }

    public double Salary

    {

    get

    {

    return salary;

    }

    }

    }

    class MainClass

    {

    static void Main()

    {

    Employee e = new Employee();

    // The data members are inaccessible (private), so

    // then can't be accessed like this:

    // string n = e.name;

    // double s = e.salary;

    // 'name' is indirectly accessed via method:

    string n = e.GetName();

    // 'salary' is indirectly accessed via property

    double s = e.Salary;

    }

    }

    protected

    La palabra clave protected es un modificador de acceso a miembros. Un miembro protegido es

    accesible dentro de su clase y por clases derivadas. Encontrar una comparacin de protected

    con los otros modificadores de acceso en Niveles de accesibilidad.

    Un miembro protegido de una clase base es accesible en una clase derivada slo si el acceso se

    realiza a travs del tipo de la clase derivada. Por ejemplo, considere el siguiente segmento de

    cdigo:

    // protected_keyword.cs

    using System;

    class A

    {

    protected int x = 123;

    }

    class B : A

    {

    static void Main()

    {

    A a = new A();

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 36 de 148

    B b = new B(); // Error CS1540, because x can only be accessed by // classes

    derived from A. // a.x = 10; // OK, because this class derives from A. b.x = 10; }

    }

    La instruccin a.x =10 genera un error, ya que A no se deriva de B.

    Los miembros de una estructura no se pueden proteger, ya que la estructura no se puede heredar.

    Ejemplo

    En este ejemplo, la clase DerivedPoint se deriva de Point; por lo tanto, puede obtener

    acceso a los miembros protegidos de la clase base directamente desde la clase derivada.

    // protected_keyword_2.cs

    using System;

    class Point

    {

    protected int x;

    protected int y;

    }

    class DerivedPoint: Point

    {

    static void Main()

    {

    DerivedPoint dp = new DerivedPoint();

    // Direct access to protected members:

    dp.x = 10;

    dp.y = 15;

    Console.WriteLine("x = {0}, y = {1}", dp.x, dp.y);

    }

    }

    Resultados

    x = 10, y = 15

    Comentarios

    Si se cambian los niveles de acceso de x e y a private, el compilador producir los siguientes

    mensajes de error:

    'Point.y' is inaccessible due to its protection level.

    'Point.x' is inaccessible due to its protection level.

    public

    La palabra clave public es un modificador de acceso para tipos y miembros de tipos. El acceso de

    tipo public corresponde al nivel de acceso menos restrictivo. No existen restricciones para obtener

    acceso a los miembros pblicos, como en este ejemplo:

    class SampleClass { public int x; // No access restrictions. }

    Ejemplo

    En el siguiente ejemplo, se declaran dos clases, Point y MainClass. El acceso a los miembros

    pblicos x e y de Point se realiza directamente desde MainClass.

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 37 de 148

    // protected_public.cs

    // Public access using System;

    class Point

    {

    public int x;

    public int y;

    }

    class MainClass

    {

    static void Main()

    {

    Point p = new Point();

    // Direct access to public members:

    p.x = 10; p.y = 15;

    Console.WriteLine("x = {0}, y = {1}", p.x, p.y);

    }

    }

    Resultado

    x = 10, y = 15

    Si se cambia el nivel de acceso de public a private o protected, se aparecer el siguiente mensaje

    de error:

    'Point.y' is inaccessible due to its protection level.

    abstract

    El modificador abstract se puede utilizar con clases, mtodos, propiedades, indizadores y

    eventos. Use el modificador abstract en una declaracin de clase para indicar que la clase slo se

    puede utilizar como clase base de otras clases. Los miembros que estn marcados como

    abstractos o que se incluyen en una clase abstracta, deben ser implementados por clases

    derivadas de la clase abstracta.

    En este ejemplo, la clase Square debe proporcionar una implementacin de Area porque deriva

    de ShapesClass:

    abstract class ShapesClass

    {

    abstract public int Area();

    }

    class Square : ShapesClass

    {

    int x, y;

    // Not providing an Area method results

    // in a compile-time error.

    public override int Area()

    {

    return x * y;

    }

    }

    Comentarios

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 38 de 148

    Las clases de tipo abstract presentan las siguientes caractersticas:

    No se pueden crear instancias de una clase abstracta.

    Una clase abstracta puede contener descriptores de acceso y mtodos abstractos.

    No es posible modificar una clase abstracta con el modificador sealed (Referencia de

    C#), lo cual significa que la clase no se puede heredar.

    Una clase no abstracta derivada de una clase abstracta debe incluir implementaciones

    reales de todos los descriptores de acceso y mtodos abstractos heredados.

    Utilice el modificador abstract en una declaracin de mtodo o propiedad para indicar que el

    mtodo o la propiedad no contienen implementacin.

    Los mtodos abstractos presentan las siguientes caractersticas:

    Un mtodo abstracto es, implcitamente, un mtodo virtual.

    Las declaraciones de mtodos abstractos slo se permiten en clases abstractas.

    Debido a que una declaracin de mtodo abstracto no proporciona una implementacin,

    no existe cuerpo del mtodo; la declaracin de mtodo finaliza simplemente con un punto y

    coma y sin llaves ({ }) despus de la firma. Por ejemplo:

    public abstract void MyMethod();

    La implementacin la proporciona un mtodo de reemplazo, que es miembro de una

    clase no abstracta.

    Utilizar los modificadores static o virtual en una declaracin de mtodo abstracto

    produce un error.

    Las propiedades abstractas funcionan como los mtodos abstractos, salvo las diferencias en la

    sintaxis de las declaraciones y llamadas.

    Es incorrecto utilizar el modificador abstract para una propiedad esttica.

    Una propiedad abstracta heredada se puede reemplazar en una clase derivada si se

    incluye una declaracin de propiedad que utilice el modificador override.

    Una clase abstracta debe proporcionar implementaciones para todos los miembros de la interfaz.

    Una clase abstracta que implementa una interfaz podra asignar los mtodos de la interfaz a

    mtodos abstractos. Por ejemplo:

    interface I { void M(); } abstract class C: I { public abstract void M(); }

    Ejemplo

    En este ejemplo, la clase DerivedClass se deriva de una clase abstracta BaseClass. La clase

    abstracta contiene un mtodo abstracto, AbstractMethod, y dos propiedades abstractas, X y Y.

    // abstract_keyword.cs

    // Abstract Classes using System;

    abstract class BaseClass // Abstract class

    {

    protected int _x = 100;

    protected int _y = 150;

    public abstract void AbstractMethod();

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 39 de 148

    // Abstract method

    public abstract int X

    {

    get;

    }

    public abstract int Y

    {

    get;

    }

    }

    class DerivedClass : BaseClass

    {

    public override void AbstractMethod()

    {

    _x++;

    _y++;

    }

    public override int X // overriding property

    {

    get

    {

    return _x + 10;

    }

    }

    public override int Y // overriding property

    {

    get

    {

    return _y + 10;

    }

    }

    static void Main()

    {

    DerivedClass o = new DerivedClass();

    o.AbstractMethod();

    Console.WriteLine("x = {0}, y = {1}", o.X, o.Y);

    }

    }

    Resultados

    x = 111, y = 161

    const

    La palabra clave const se utiliza para modificar una declaracin de un campo o una variable local.

    Especifica que el valor del campo o de la variable local es constante, o sea que no se puede

    modificar. Por ejemplo:

    const int x = 0;

    public const double gravitationalConstant = 6.673e-11;

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 40 de 148

    private const string productName = "Visual C#";

    Comentarios

    El tipo de una declaracin de constantes especifica el tipo de los miembros que se incluyen en la

    declaracin. Una expresin constante debe dar un valor del tipo destino o de un tipo que se pueda

    convertir implcitamente en el tipo destino.

    Una expresin constante es una expresin que se puede evaluar completamente en tiempo de

    compilacin. Por consiguiente, los nicos valores posibles para constantes de tipos de referencia

    son string, y null.

    La declaracin de constante puede declarar varias constantes, por ejemplo:

    public const double x = 1.0, y = 2.0, z = 3.0;

    El modificador static no se puede utilizar en una declaracin de constante.

    Una constante puede participar en una expresin constante, por ejemplo:

    public const int c1 = 5; public const int c2 = c1 + 100;

    Nota

    La palabra clave readonly es diferente de la palabra clave const. Un campo const slo puede inicializarse en la declaracin

    del campo. Un campo readonly puede inicializarse en la declaracin o en un constructor. Por lo tanto, los campos readonly

    pueden tener diferentes valores en funcin del constructor que se utilice. Adems, mientras que un campo const es una

    constante en tiempo de compilacin, el campo readonly puede utilizarse para constantes en tiempo de ejecucin, como

    muestra la lnea siguiente:

    public static readonly uint l1 = (uint)DateTime.Now.Ticks;

    Ejemplo

    // const_keyword.cs

    using System;

    public class ConstTest

    {

    class SampleClass

    {

    public int x;

    public int y;

    public const int c1 = 5;

    public const int c2 = c1 + 5;

    public SampleClass(int p1, int p2)

    {

    x = p1;

    y = p2;

    }

    }

    static void Main()

    {

    SampleClass mC = new SampleClass(11, 22);

    Console.WriteLine("x = {0}, y = {1}", mC.x, mC.y);

    Console.WriteLine("c1 = {0}, c2 = {1}", SampleClass.c1, SampleClass.c2 );

    }

    }

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 41 de 148

    Resultados

    x = 11, y = 22 c1 = 5, c2 = 10

    Este ejemplo muestra el uso de constantes como variables locales.

    // const_keyword_2.cs

    using System;

    public class MainClass

    {

    static void Main()

    {

    const int c = 707;

    Console.WriteLine("My local constant = {0}", c);

    }

    }

    Resultados

    My local constant = 707

    event

    La palabra clave event se utiliza para especificar un evento.

    Comentarios

    Los eventos se utilizan en las clases y estructuras para notificar a los objetos acciones que pueden

    afectar a su estado. Por ejemplo, los formularios Windows Forms tienen un evento

    System.Windows.Forms.Form.Activated que se puede utilizar para desencadenar cdigo cada vez

    que el formulario pasa a estado activo.

    Para agregar un evento a una clase es preciso utilizar la palabra clave event, proporcionar un tipo

    de delegado y un nombre para el evento. En este ejemplo, se define un delegado y, a

    continuacin, se asocia al evento SampleEvent.

    public delegate void SampleEventDelegate(object sender, EventArgs e);

    public class SampleEventSource

    {

    public event SampleEventDelegate SampleEvent;

    }

    extern

    El modificador extern se utiliza para declarar un mtodo que se implementa externamente. Un

    uso comn del modificador extern es con el atributo DllImport cuando se utilizan servicios de

    interoperabilidad para llamar en cdigo no administrado; en este caso, el mtodo tambin debe

    declararse como static, tal como se muestra en el ejemplo siguiente:

    [DllImport("avifil32.dll")] private static extern void AVIFileInit();

    Nota

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 42 de 148

    La palabra clave extern tambin puede definir un alias de ensamblado externo, lo que hace posible hacer referencia a

    diferentes versiones del mismo componente desde un nico ensamblado. Para obtener ms informacin, vea alias externo

    (Referencia de C#).

    Es incorrecto utilizar simultneamente los modificadores abstract (Referencia de C#) y extern

    para modificar el mismo miembro. El uso del modificador extern significa que el mtodo se

    implementa fuera del cdigo de C#, mientras que el uso del modificador abstract significa que la

    clase no incluye la implementacin del mtodo.

    Nota

    El uso de la palabra clave extern es ms limitado que en C++. Para compararla con la palabra clave de C++, vea Using

    extern to Specify Linkage en la Referencia del lenguaje C++.

    Ejemplo

    En este ejemplo, el programa recibe una cadena del usuario y la muestra dentro de un cuadro de

    mensaje. El programa utiliza el mtodo MessageBox importado de la biblioteca User32.dll.

    using System;

    using System.Runtime.InteropServices;

    class MainClass

    {

    [DllImport("User32.dll")]

    public static extern int MessageBox(int h, string m, string c, int type);

    static int Main()

    {

    string myString;

    Console.Write("Enter your message: ");

    myString = Console.ReadLine();

    return MessageBox(0, myString, "My Message Box", 0);

    }

    }

    En este ejemplo se crea un archivo DLL desde un programa de C invocado desde el programa de

    C# del siguiente ejemplo.

    // cmdll.c

    // compile with: /LD

    int __declspec(dllexport) SampleMethod(int i)

    {

    return i*10;

    }

    Este ejemplo utiliza dos archivos, CM.cs y Cmdll.c, para demostrar el uso de extern. El archivo

    C es un archivo DLL externo creado en el ejemplo 2 que se invoca desde el programa escrito en

    C#.

    // cm.cs using System;

    using System.Runtime.InteropServices;

    public class MainClass

    {

    [DllImport("Cmdll.dll")]

    public static extern int SampleMethod(int x);

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 43 de 148

    static void Main()

    {

    Console.WriteLine("SampleMethod() returns {0}.", SampleMethod(5));

    }

    }

    Resultados

    SampleMethod() returns 50.

    override

    El modificador override es necesario para ampliar o modificar la implementacin abstracta o

    virtual de un mtodo, propiedad, indizador o evento heredado.

    En este ejemplo, la clase Square debe proporcionar una implementacin de reemplazo de Area

    porque sta se hereda de la clase abstracta ShapesClass:

    abstract class ShapesClass

    {

    abstract public int Area();

    }

    class Square : ShapesClass

    {

    int x, y;

    // Because ShapesClass.Area is abstract, failing to override

    // the Area method would result in a compilation error.

    public override int Area()

    {

    return x * y;

    }

    }

    Comentarios

    El mtodo override proporciona una nueva implementacin de un miembro heredado de una

    clase base. El mtodo reemplazado por una declaracin override se conoce como mtodo base

    reemplazado. El mtodo base reemplazado debe tener la misma firma que el mtodo override.

    No se puede reemplazar un mtodo esttico o no virtual. El mtodo base reemplazado debe ser

    virtual, abstract u override.

    Una declaracin override no puede cambiar la accesibilidad del mtodo virtual. El mtodo

    override y el mtodo virtual deben tener el mismo modificador de nivel de acceso.

    No se pueden utilizar los modificadores new, static, virtual o abstract para modificar un mtodo

    override.

    Una declaracin de propiedad de reemplazo debe especificar el mismo modificador de acceso, tipo

    y nombre que la propiedad heredada, y la propiedad reemplazada debe ser virtual, abstract u

    override.

    Ejemplo

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 44 de 148

    Este ejemplo define una clase base denominada Employee y una clase derivada denominada

    SalesEmployee. La clase SalesEmployee incluye una propiedad adicional, salesbonus, y

    reemplaza al mtodo CalculatePay para tenerlo en cuenta.

    using System;

    class TestOverride

    {

    public class Employee

    {

    public string name;

    // Basepay is defined as protected, so that it may be

    // accessed only by this class and derrived classes. protected decimal basepay;

    // Constructor to set the name and basepay values.

    public Employee(string name, decimal basepay)

    {

    this.name = name; this.basepay = basepay;

    }

    // Declared virtual so it can be overridden.

    public virtual decimal CalculatePay()

    {

    return basepay;

    }

    }

    // Derive a new class from Employee.

    public class SalesEmployee : Employee

    {

    // New field that will affect the base pay.

    private decimal salesbonus;

    // The constructor calls the base-class version, and

    // initializes the salesbonus field.

    public SalesEmployee(string name, decimal basepay, decimal salesbonus) :

    base(name, basepay)

    {

    this.salesbonus = salesbonus;

    }

    // Override the CalculatePay method

    // to take bonus into account.

    public override decimal CalculatePay()

    {

    return basepay + salesbonus;

    }

    }

    static void Main()

    {

    // Create some new employees.

    SalesEmployee employee1 = new SalesEmployee("Alice", 1000, 500);

    Employee employee2 = new Employee("Bob", 1200);

    Console.WriteLine("Employee " + employee1.name + " earned: " +

    employee1.CalculatePay());

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 45 de 148

    Console.WriteLine("Employee " + employee2.name + " earned: " +

    employee2.CalculatePay()); } }

    Resultados

    Employee Alice earned: 1500 Employee Bob earned: 1200

    readonly

    La palabra clave readonly corresponde a un modificador que se puede utilizar en campos. Cuando

    una declaracin de campo incluye un modificador readonly, las asignaciones a los campos que

    aparecen en la declaracin slo pueden tener lugar en la propia declaracin o en un constructor de

    la misma clase. En este ejemplo, el valor del campo year no se puede cambiar en el mtodo

    ChangeYear, aunque se asigne un valor en el constructor de clase:

    class Age

    {

    readonly int _year; Age(int year)

    {

    _year = year;

    }

    void ChangeYear()

    {

    _year = 1967;

    // Will not compile.

    }

    }

    Comentarios

    Slo se puede asignar un valor a un campo readonly en los siguientes contextos:

    Cuando la variable se inicializa en la declaracin, por ejemplo:

    public readonly int y = 5;

    Para un campo de instancia, en los constructores de instancia de la clase que contiene

    la declaracin de campo; para un campo esttico, en el constructor esttico de la clase que

    contiene la declaracin de campo. stos son tambin los nicos contextos en los que es

    vlido pasar un campo readonly como parmetro out o ref.

    Nota

    La palabra clave readonly es diferente de la palabra clave const. Un campo const slo puede inicializarse en la declaracin

    del campo. Un campo readonly puede inicializarse en la declaracin o en un constructor. Por lo tanto, los campos readonly

    pueden tener diferentes valores en funcin del constructor que se utilice. Adems, mientras que un campo const es una

    constante en tiempo de compilacin, el campo readonly puede utilizarse para constantes en tiempo de ejecucin, como

    muestra el siguiente ejemplo:

    Nota

    public static readonly uint l1 = (uint)DateTime.Now.Ticks;

    Ejemplo

    // cs_readonly_keyword.cs

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 46 de 148

    // Readonly fields

    using System;

    public class ReadOnlyTest

    {

    class SampleClass

    {

    public int x;

    // Initialize a readonly field

    public readonly int y = 25;

    public readonly int z;

    public SampleClass()

    {

    // Initialize a readonly instance field

    z = 24;

    }

    public SampleClass(int p1, int p2, int p3)

    {

    x = p1;

    y = p2;

    z = p3;

    }

    }

    static void Main()

    {

    SampleClass p1 = new SampleClass(11, 21, 32); // OK

    Console.WriteLine("p1: x={0}, y={1}, z={2}", p1.x, p1.y, p1.z);

    SampleClass p2 = new SampleClass();

    p2.x = 55; // OK

    Console.WriteLine("p2: x={0}, y={1}, z={2}", p2.x, p2.y, p2.z);

    }

    }

    Resultados

    p1: x=11, y=21, z=32 p2: x=55, y=25, z=24

    sealed

    El modificador sealed se puede aplicar a clases, mtodos de instancia y propiedades. Una clase

    sealed no se puede heredar. Un mtodo sellado reemplaza un mtodo en una clase base, pero no

    se puede reemplazar tambin en una clase derivada. Cuando se aplica a un mtodo o propiedad,

    el modificador sealed siempre se debe utilizar con Override.

    Utilice el modificador sealed en una declaracin de clase para evitar que la clase se herede, como

    en este ejemplo:

    sealed class SealedClass { public int x; public int y; }

    Es un error utilizar una clase sellada como una clase base o utilizar el modificador abstract con

    una clase sellada.

    Las estructuras son tipos sealed implcitamente; por consiguiente, no se pueden heredar.

  • .NET 2 C# .NET

    MCT: Luis Dueas Pag 47 de 148

    Ejemplo

    // cs_sealed_keyword.cs

    using System;

    sealed class SealedClass

    {

    public int x;

    public int y;

    }

    class MainClass

    {

    static void Main()

    {

    SealedClass sc = new SealedClass();

    sc.x = 110;

    sc.y = 150;

    Console.WriteLine("x = {0}, y = {1}", sc.x, sc.y);

    }

    }

    Resultados

    x = 110, y = 150

    En el ejemplo anterior, si intenta heredar de la clase sealed mediante una instruccin como la

    siguiente:

    class MyDerivedC: MyClass {} // Error

    obtendr el siguiente mensaje de error:

    'MyDerivedC' cannot inherit from sealed class 'MyClass'.

    static

    Utilice el modificador static para declarar un miembro esttico, que pertenece al propio tipo en

    vez de a un objeto especfico. El modificador static puede utilizarse con clases, campos, mtodos,

    propiedades operadores y eventos, pero no puede utilizarse con indizadores, destructores o tipos

    que no sean clases. Por ejemplo, la siguiente clase se declara como static y solo contiene

    mtodos static:

    static class CompanyEmployee

    {