Правила использования массивов
Общее описание массивов и способов их использования см. в разделе Класс 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 следует возвращать пустой массив.
Фрагменты — © Корпорация Майкрософт (Microsoft Corporation) 2005. Все права защищены.
Фрагменты — © Addison-Wesley Corporation. Все права защищены.
Для дополнительной информации о разработке руководящих принципов, смотрите "руководства по разработке рамок: Конвенций, идиомы и шаблоны для повторного использования.NET библиотек"книга, Кшиштоф Cwalina и Брэд Абрамс, опубликованных Addison-Wesley, 2005 года.