Share via


Instrucciones de uso de matrices

Actualización: noviembre 2007

Para obtener una descripción general de las matrices y de su uso, vea Matrices y la clase System.Array.

Matrices y Colecciones

En algunas ocasiones, los diseñadores de bibliotecas de clases tienen que decidir entre utilizar una matriz o devolver una colección. Aunque estos tipos tienen modelos de uso similares, las características de rendimiento son diferentes. En general, se debería usar una colección cuando se pueden utilizar métodos como Add, Remove u otros para manipularla.

Para obtener más información sobre el uso de colecciones, vea Colecciones y estructuras de datos.

Usar matrices

No se debe devolver una instancia interna de una matriz, ya que esto permite al código llamador cambiar la matriz. El ejemplo siguiente muestra cómo la matriz badChars puede ser modificada por cualquier código que tenga acceso a la propiedad Path aunque la propiedad no implemente el descriptor de acceso set.

Imports System
Imports System.Collections
Imports Microsoft.VisualBasic

Public Class ExampleClass
   NotInheritable Public Class Path
      Private Sub New()
      End Sub

      Private Shared badChars() As Char = {Chr(34),"<"c,">"c}
      
      Public Shared Function GetInvalidPathChars() As Char()
         Return badChars
      End Function

   End Class
   
   Public Shared Sub Main()
      ' The following code displays the elements of the 
      ' array as expected.
      Dim c As Char
      For Each c In  Path.GetInvalidPathChars()
         Console.Write(c)
      Next c
      Console.WriteLine()
      
      ' The following code sets all the values to A.
      Path.GetInvalidPathChars()(0) = "A"c
      Path.GetInvalidPathChars()(1) = "A"c
      Path.GetInvalidPathChars()(2) = "A"c
      
      ' The following code displays the elements of the array to the
      ' console. Note that the values have changed.
      For Each c In  Path.GetInvalidPathChars()
         Console.Write(c)
      Next c
   End Sub
End Class
using System;
using System.Collections;

public class ExampleClass
{
   public sealed class Path
   {
      private Path(){}
      private static char[] badChars = {'\"', '<', '>'};
      public static char[] GetInvalidPathChars()
      {
         return badChars;
      }
   }
   public static void Main()
   {
      // The following code displays the elements of the 
      // array as expected.
      foreach(char c in Path.GetInvalidPathChars())
      {
         Console.Write(c);
      }
      Console.WriteLine();

      // The following code sets all the values to A.
      Path.GetInvalidPathChars()[0] = 'A';
      Path.GetInvalidPathChars()[1] = 'A';
      Path.GetInvalidPathChars()[2] = 'A';

      // The following code displays the elements of the array to the
      // console. Note that the values have changed.
      foreach(char c in Path.GetInvalidPathChars())
      {
         Console.Write(c);
      }
   }
}

El problema del ejemplo anterior no se puede corregir haciendo que la matriz badChars sea readonly (ReadOnly en Visual Basic). Puede clonar la matriz badChars y devolver la copia, pero esto tiene significaciones implicaciones de rendimiento. Consulte la subsección siguiente, Propiedades que devuelven matrices, para obtener información detallada. En el ejemplo de código siguiente se muestra cómo modificar el método GetInvalidPathChars para devolver un clon de la matriz badChars.

Public Shared Function GetInvalidPathChars() As Char()
   Return CType(badChars.Clone(), Char())
End Function
public static char[] GetInvalidPathChars()
{
   return (char[])badChars.Clone();
}

Propiedades que devuelven matrices

Debería utilizar colecciones para evitar las ineficiencias del código producidas por propiedades que devuelven matrices. En el siguiente ejemplo de código, cada llamada a la propiedad myObj crea una copia de la matriz. Como resultado, se crearán 2n+1 copias de la matriz en el siguiente bucle.

Dim i As Integer
For i = 0 To obj.myObj.Count - 1
   DoSomething(obj.myObj(i))
Next i
for (int i = 0; i < obj.myObj.Count; i++)
      DoSomething(obj.myObj[i]);

Para obtener más información, vea Elegir entre propiedades y métodos.

Campos que devuelven matrices

No se deben usar campos de matrices readonly (ReadOnly en Visual Basic). Si se hace, la matriz será de sólo lectura y no podrá cambiarse, pero sí se podrán modificar los elementos que la componen. En el siguiente ejemplo de código se muestra cómo se pueden cambiar los elementos de la matriz de sólo lectura InvalidPathChars.

public sealed class Path
{
   private Path(){}
   public static readonly char[] InvalidPathChars = {'\"', '<', '>','|'}'
}
//The following code can be used to change the values in the array.
Path.InvalidPathChars[0] = 'A';

Usar propiedades indizadas en colecciones

Utilice sólo una propiedad indizada como miembro predeterminado de una interfaz o una clase de la colección. No cree familias de funciones en tipos que no sean una colección. Un modelo de métodos, como Add, Item y Count, indica que el tipo debe ser una colección.

Devolver matrices vacías

Las propiedades String y Array nunca deberían devolver una referencia null. En este contexto, Null puede resultar difícil de entender. Por ejemplo, un usuario puede suponer que el siguiente código funcionará.

Public Sub DoSomething()
   Dim s As String = SomeOtherFunc()
   If s.Length > 0 Then
      ' Do something else.
   End If
End Sub
public void DoSomething()
{
   string s = SomeOtherFunc();
   if (s.Length > 0)
   {
      // Do something else.
   }
}

La regla general es que las matrices null, las matrices con cadenas vacías ("") y las matrices vacías (0 elementos) se deben tratar del mismo modo. Devuelva una matriz vacía en vez de una referencia null.

Portions Copyright 2005 Microsoft Corporation. Reservados todos los derechos.

Portions Copyright Addison-Wesley Corporation. Reservados todos los derechos.

Para obtener más información sobre las directrices de diseño, consulte el libro titulado "Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries" de Krzysztof Cwalina y Brad Abrams, publicado por Addison-Wesley, 2005.

Vea también

Conceptos

Instrucciones de uso

Referencia

Array

Otros recursos

Instrucciones de diseño para desarrollar bibliotecas de clases