La clase Array es la clase base para las implementaciones de lenguajes que admiten matrices.

No obstante, el sistema y los compiladores son los únicos que se pueden derivar explícitamente de la clase Array. Los usuarios deben utilizar los constructores de matriz que proporciona el lenguaje. Un elemento es un valor de Array. La longitud de Array es el número total de elementos que puede contener. El rango de Array es el número de dimensiones de Array. El límite inferior de una dimensión de Array es el índice inicial de dicha dimensión; Array multidimensional Arraypuede tener distintos límites para cada dimensión. Matrices multidimensionales Las matrices pueden tener varias dimensiones. Por ejemplo, la siguiente declaración crea una matriz bidimensional de cuatro filas y dos columnas: int[,] array = new int[4, 2]; Esta otra declaración crea una matriz de tres dimensiones, 4, 2 y 3: int[, ,] array1 = new int[4, 2, 3]; Inicialización de matrices La matriz se puede inicializar en la declaración como se muestra en el ejemplo siguiente: int[,] array2D = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } }; int[, ,] array3D = new int[,,] { { { 1, 2, 3 } }, { { 4, 5, 6 } } }; También se puede inicializar la matriz sin especificar el rango: int[,] array4 = { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } }; Si opta por declarar una variable de matriz sin inicializarla, deberá utilizar el operador new para asignar una matriz a la variable. Por ejemplo: int[,] array5; array5 = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } }; // OK //array5 = {{1,2}, {3,4}, {5,6}, {7,8}}; // Error Asimismo, es posible asignar un valor a un elemento de una matriz, por ejemplo:

Los argumentos se enumeran entre paréntesis y separados por comas. el nombre del método y paréntesis. 10].array5[2. Los parámetros de método se incluyen entre paréntesis y separados por comas. se puede llamar a los métodos de la clase Motorcycle del modo siguiente: Motorcycle moto = new Motorcycle().AddGas(15). cada instrucción se ejecuta en el contexto de un método. Los paréntesis vacíos indican que el método no requiere ningún parámetro. En C#. Después del nombre de objeto. moto. agregue un punto. moto. el valor devuelto. int speed) { return 0. el nombre del método y los parámetros de método. Métodos Los métodos son un bloque de código que contiene una serie de instrucciones. } } Llamar a un método en un objeto es similar a tener acceso a un campo. Por tanto. 20).] array6 = new int[10. 1] = 25. Parámetros de métodos .Drive(5. El ejemplo de código siguiente inicializa las variables de matriz con el valor predeterminado (salvo las matrices escalonadas): int[.StartEngine(). moto. Esta clase contiene tres métodos: class Motorcycle { public void StartEngine() { } public void AddGas(int gallons) { } public int Drive(int miles. Los métodos se declaran en una clase o estructura especificando el nivel de acceso.

En el método al que se llama. el valor de la variable fortyFour se mantiene sin cambios. vea Tabla de tipos de valores (Referencia de C#). Los tipos de valor reciben su nombre del hecho de que se pasa una copia del objeto en lugar del propio objeto. pero de hecho. Por ejemplo: public static void PassesInteger() { int fortyFour = 44. Esto se debe a que int es un tipo de valor. De forma predeterminada. de la forma siguiente: . que se pasan por referencia. Los parámetros que un método recibe también se proporcionan entre paréntesis. siempre y cuando no sean parámetros o variables declaradas en ese método. Este parámetro sólo existe dentro del método TakesInteger. para pasar argumentos a un método simplemente hay que proporcionarlos entre paréntesis cuando se llama al método. TakesInteger(fortyFour). los argumentos de entrada se denominan parámetros. Los cambios realizados a través de esta referencia se reflejarán por consiguiente en el método de llamada. no se realiza ninguna copia del objeto. } Aquí un método denominado PassesInteger pasa un argumento a un método denominado TakesInteger.Como se muestra en el fragmento de código anterior. Observe que TakesInteger asigna un nuevo valor al argumento proporcionado. Se pasa el valor. El nombre no tiene por qué ser igual que el argumento. pero no el objeto mismo. Para obtener una lista de tipos de valores integrales de C#. Un tipo de referencia se crea con la palabra clave class. se hace una referencia al objeto que se utiliza como argumento del método y se pasa dicha referencia. cuando un tipo de valor se pasa a un método. En su lugar. se pasa una copia en lugar del propio objeto. pero se debe especificar el tipo y nombre de cada parámetro. Dado que son copias. Para obtener más información sobre el paso de tipos de valor. cualquier cambio realizado en el parámetro no tiene ningún efecto en el método de llamada. Esto es diferente de los tipos de referencia. pero en TakeInteger es un parámetro denominado i. Cuando un objeto basado en un tipo de referencia se pasa a un método. En PassesInteger el argumento se denomina fortyFour. } static void TakesInteger(int i) { i = 33. Otras variables también pueden denominarse i y pueden ser de cualquier tipo. Se podría esperar que este cambio se reflejara en el método PassesInteger una vez que TakeInteger devuelve un valor. vea Pasar parámetros de tipo de valor (Guía de programación de C#).

Si el tipo de valor devuelto (el que aparece antes del nombre de método) no es void.WriteLine(rt. int number2) { return number1 + number2. el método TestRefType mostrará el valor 33. la modificación realizada por ModifyObject se efectúa en el objeto creado en el método TestRefType. una instrucción return sin ningún valor sigue siendo útil para detener la ejecución del método. vea Pasar parámetros Reference-Type (Guía de programación de C#) y Tipos de referencia (Referencia de C#). Por consiguiente. seguida de un valor que coincida con el tipo de valor devuelto.value). el método puede devolver el valor mediante la palabra clave return. el método detendrá la ejecución cuando llegue al fin del bloque de código. La palabra clave return también detiene la ejecución del método.value = 33. } Este ejemplo hace esencialmente lo mismo que el ejemplo anterior. Valores devueltos Los métodos pueden devolver un valor al llamador.Console. como se utiliza un tipo de referencia. Si el tipo de valor devuelto es void. Pero.public class SampleRefType { public int value. Para obtener más información. } static void ModifyObject(SampleRefType obj) { obj. ModifyObject(rt). Una instrucción con la palabra clave return. System. } Ahora. Es necesario que los métodos con un tipo de valor devuelto no nulo utilicen la palabra clave return para devolver un valor. devolverá ese valor al llamador del método.value = 44. estos dos métodos utilizan la palabra clave return para devolver enteros: class SimpleMath { public int AddTwoNumbers(int number1. se pasará por referencia. Sin la palabra clave return. si un objeto basado en este tipo se pasa a un método. Por ejemplo: public static void TestRefType() { SampleRefType rt = new SampleRefType(). rt. } . Por ejemplo.

las reglas son las mismas que cuando se implementa cualquier método de interfaz o propiedad. public interface IDrawingObject { event EventHandler ShapeChanged. 2)). invóquelo en los lugares adecuados. } } Para emplear un valor devuelto por un método. el método de llamada puede utilizar la propia llamada del método en cualquier parte donde un valor del mismo tipo sea suficiente. los dos ejemplos de código siguientes logran el mismo objetivo: int result = obj. void ChangeShape() { // Do something before the event… OnShapeChanged(new MyEventsArgs(…)). El valor devuelto también se puede asignar a una variable.SquareANumber(result). Cómo: Implementar eventos de interfaz (Guía de programación de C#) Una interfaz puede declarar un evento. obj. para almacenar un valor es opcional. // or do something after the event. obj. a continuación. Básicamente. El uso de una variable intermedia. El ejemplo siguiente muestra cómo implementar eventos de interfaz en una clase.SquareANumber(obj. en este caso result.public int SquareANumber(int number) { return number * number. } public class MyEventArgs : EventArgs {…} public class Shape : IDrawingObject { event EventHandler ShapeChanged. } protected virtual void OnShapeChanged(MyEventArgs e) { . La legibilidad del código puede ser útil o puede ser necesaria si el valor se va a utilizar más de una vez. Para implementar eventos de interfaz en una clase • Declare el evento en la clase y.AddTwoNumbers(1. Por ejemplo.AddTwoNumbers(1. 2).

IShape { // Create an event for each interface event event EventHandler PreDrawEvent. // Explicit interface implementation required. } . Por ejemplo. los suscriptores determinan qué evento OnDraw se recibirá convirtiendo la referencia de la forma en IShape o IDrawingObject. each with an OnDraw event public class Shape : IDrawingObject. también debe incluir los descriptores de acceso a eventos add y remove. event EventHandler PostDrawEvent. puede asociar cada evento a una implementación distinta en la clase. puede especificar si los dos eventos se representan mediante el mismo evento en la clase o mediante eventos diferentes. Al proporcionar sus propios descriptores de acceso. si los eventos deben producirse en momentos diferentes según las especificaciones de la interfaz. estos descriptores los proporciona el compilador. En esta situación. e). event EventHandler OnDraw. En el ejemplo siguiente. Normalmente. } public interface IShape { // Raise this event after drawing // the shape. public interface IDrawingObject { // Raise this event before drawing // the object. } // Base class event publisher inherits two // interfaces. namespace WrapTwoInterfaceEvents { using System.} } if(ShapeChanged != null) { ShapeChanged(this. event EventHandler OnDraw. pero en este caso no es así. // Associate IDrawingObject's event with // PreDrawEvent event EventHandler IDrawingObject. debe proporcionar una implementación de interfaz explícita para al menos uno de los eventos. Cuando escriba una implementación de interfaz explícita para un evento. } Ejemplo El ejemplo siguiente muestra cómo controlar la situación menos común en la que la clase se hereda de dos o más interfaces y cada interfaz tiene un evento con el mismo nombre.OnDraw { add { PreDrawEvent += value.

} } . } void d_OnDraw(object sender. } } public class Subscriber1 { // References the shape object as an IDrawingObject public Subscriber1(Shape shape) { IDrawingObject d = (IDrawingObject)shape. public void Draw() { // Raise IDrawingObject's event before the object is EventHandler handler = PreDrawEvent. } } // Explicit interface implementation required. EventArgs e) { Console.OnDraw += new EventHandler(d_OnDraw). } void d_OnDraw(object sender. d. } } // For the sake of simplicity this one method // implements both interfaces. d. } Console.").remove { PreDrawEvent -= value.OnDraw += new EventHandler(d_OnDraw).WriteLine("Sub2 receives the IShape event. new EventArgs()). if (handler != null) { handler(this. new EventArgs()). } remove { PostDrawEvent -= value. // Associate IShape's event with // PostDrawEvent event EventHandler IShape. if (handler != null) { handler(this. handler = PostDrawEvent. EventArgs e) { Console.WriteLine("Drawing a shape.WriteLine("Sub1 receives the IDrawingObject event. } drawn.OnDraw { add { PostDrawEvent += value. } } // References the shape object as an IShape public class Subscriber2 { public Subscriber2(Shape shape) { IShape d = (IShape)shape."). // RaiseIShape's event after the object is drawn.").

Drawing a shape.Draw().WriteLine("Press Enter to close this window. Subscriber2 sub2 = new Subscriber2(shape). Sub2 receives the IShape event. Console. } } } Resultados Sub1 receives the IDrawingObject event.public class Program { static void Main(string[] args) { Shape shape = new Shape(). . Console. Subscriber1 sub = new Subscriber1(shape). shape.ReadLine().").

Sign up to vote on this title
UsefulNot useful