Поделиться через


Правила использования массивов

Обновлен: Ноябрь 2007

Общее описание массивов и способов их использования см. в разделах Массивы и Класс System.Array.

Массивы и коллекции

Разработчикам библиотек классов иногда приходится выбирать между массивом и коллекцией. Хотя у обоих этих типов похожие модели использования, они имеют различные характеристики производительности. В общем случае коллекцию следует использовать, если вам необходимы методы Add, Remove и другие методы манипуляции с элементами.

Дополнительные сведения об использовании коллекций см. в разделе Коллекции и структуры данных.

Использование массивов

Не следует возвращать внутренний экземпляр массива. Данный подход позволяет вызывающему коду изменять массив. В следующем примере показано, как массив badChars может быть изменен любым кодом, имеющим доступ к свойству Path, даже когда для этого свойства не реализован метод установки значения.

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);
      }
   }
}

Невозможно исправить проблему в предыдущем примере путем установки для массива badCharsатрибута readonly (ReadOnly в Visual Basic). Можно клонировать массив badChars и вернуть копию, но это вызовет значительные накладные расходы. Более подробную информацию см. в следующем подразделе "Свойства, возвращающие массивы". В следующем примере кода показано, как модифицировать метод GetInvalidPathChars для возврата клона массива badChars.

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

Свойства, возвращающие массивы

Используйте коллекции, чтобы избежать неэффективности кода, связанного со свойствами возвращаемых массивов. В следующем примере кода при каждом вызове свойства myObj создается копия массива. В результате в следующем цикле будет создано 2n+1 копия этого массива.

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]);

Дополнительные сведения см. в разделе Выбор между свойствами и методами.

Поля, возвращающие массивы

Не следует использовать поля, возвращающие массивы, с атрибутом readonly (ReadOnly в Visual Basic). Если это сделать, массив будет доступен только для чтения, при этом его изменить будет нельзя, а его элементы — можно. В следующем примере кода показан способ изменения элементов массива 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';

Использование индексированных свойств в коллекциях

Индексированное свойство следует использовать только в качестве члена по умолчанию класса коллекции или интерфейса. Не следует создавать семейства функций в типах, не являющихся коллекциями. Сигналом к использованию коллекции служит наличие таких методов, как Add, Item и Count.

Возврат пустых массивов

Свойства String и Array никогда не должны возвращать ссылку null. В этом контексте использование Null не является безусловно ясным. Например, пользователь может решить, что следующий код будет работать.

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.
   }
}

Общее правило состоит в том, что null, пустая строка ("") и пустые массивы (без элементов) должны трактоваться одинаково. Вместо ссылки null следует возвращать пустой массив.

Охраняется авторским правом Copyright 2005 Microsoft Corporation. Все права защищены.

Охраняется авторским правом Copyright Addison-Wesley Corporation. Все права защищены.

Дополнительные сведения о руководствах по разработке см. в книге "Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries", Krzysztof Cwalina and Brad Abrams, Addison-Wesley, 2005.

См. также

Основные понятия

Правила использования

Ссылки

Array

Другие ресурсы

Руководство по разработке библиотек классов