Manual 00 - C# NET
-
Upload
yvan-carranza -
Category
Documents
-
view
191 -
download
8
Transcript of Manual 00 - C# NET
-
.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
{