День двести тридцать первый. #BestPractices

Советы по разработке членов типов

Разработка параметров. Окончание

Члены с переменным числом параметров

Члены, которые могут принимать переменное число аргументов, создаются путем предоставления параметра-массива. Например, String предоставляет следующий метод:

public class String {

public static string Format(string format, object[] parameters);

}

Пользователь может вызвать метод String.Format следующим образом:

String.Format("Файл {0} не найден в {1}", new object[] { filename, directory });

Добавление ключевого слова params к параметру-массиву изменяет обеспечивает упрощённое создание временного массива:

public class String {

public static string Format(string format, params object[] parameters);

}

Это позволяет пользователю вызывать метод, передавая элементы массива непосредственно в список аргументов:

String.Format("Файл {0} не найден в {1}", filename, directory);

Обратите внимание, что ключевое слово params можно добавить только к последнему параметру.



⚠️ РАССМОТРИТЕ добавление ключевого слова params к параметру-массиву, если вы ожидаете, что конечные пользователи будут передавать массивы с небольшим количеством элементов. Если ожидается, что обычно будет передаваться много элементов, пользователи, вероятно, не будут передавать все эти элементы по одиночке, поэтому ключевое слово params не нужно.

ИЗБЕГАЙТЕ использования params, если вызывающая сторона почти всегда будет иметь данные уже в массиве. Например, члены с параметрами байтового массива почти никогда не будут вызываться путем передачи им отдельных байтов. По этой причине такие параметры в .NET Framework не используют ключевое слово params.

ИЗБЕГАЙТЕ использования params, если массив изменяется членом, принимающим параметр params. Из-за того, что многие компиляторы превращают аргументы params во временный массив, любые изменения в таком массиве будут потеряны.

⚠️ РАССМОТРИТЕ использование ключевого слова params в простой перегрузке, даже если более сложная перегрузка не может его использовать. Решите, оценят ли пользователи наличие массива params в одной перегрузке, даже если он будет не во всех перегрузках.

НЕОБХОДИМО так упорядочить параметры, чтобы можно было использовать ключевое слово params.

⚠️ РАССМОТРИТЕ использование специальных перегрузок для вызовов с небольшим количеством аргументов в чрезвычайно чувствительных к производительности API. Это позволяет избежать создания объектов массива, когда API вызывается с небольшим количеством аргументов.

❗️ ЗАМЕТЬТЕ, что null может быть передан в качестве аргумента params. Вы должны проверить, что массив не равен null перед его обработкой.



Параметры-указатели

В общем случае указатели не должны появляться в публичных API хорошо спроектированной структуры управляемого кода. Большую часть времени указатели должны быть инкапсулированы. Однако в некоторых случаях указатели требуются по причинам совместимости, и использование указателей в таких случаях целесообразно.

НЕОБХОДИМО предоставить альтернативу для любого члена, который принимает аргумент-указатель, потому что указатели не соответствуют CLS.

ИЗБЕГАЙТЕ использования дорогостоящей проверки аргументов-указателей.

НЕОБХОДИМО следовать общим соглашениям по указателям, при разработке элементов с указателями. Например, нет необходимости передавать начальный индекс, потому что простая арифметика указателя может быть использована для достижения того же результата.



Источник: https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/