2010-12-08 4 views
0

Я проектирования API в C#, и одной функции мне нужно что-то вдоль линий:Использование перечислений в API

void CreateChild(string name, ChildType type); 

Где ChildType определяется как:

public enum ChildType { Number = 0, Text = 1 }; 

Это должен быть достаточно понятным, но, по существу, он создаст дочерний объект рассматриваемого объекта, а тип значения, который содержит ребенок, будет либо строкой, либо двойной, основанной на значении перечисления.

Перечисление ChildType является общедоступным, поэтому, я полагаю, было бы доступно для пользователей API.

Я обеспокоен тем, что некоторые языки не понимают перечисление в подписи и не смогут запрограммировать этот API. Это что-то беспокоит, или мои опасения необоснованны?

+2

Я думаю, вы хотите узнать больше о написании CLS-совместимого кода, о чем я мало что знаю. Быстрый google показывает, что перечисления поддерживаются системой общего типа в .NET Framework: http://msdn.microsoft.com/en-us/library/zcx1eb1e.aspx – blizpasta

+0

Вы можете добавить атрибут CLSCompliant к своей сборке и позволить компилятор проверяет это для вас. –

+0

В этом конкретном случае вам следует рассмотреть возможность разделения на 'CreateNumberChild (string)' и 'CreateTextChild (string)', что может быть немного более полезным. (Предполагая, что обычный прецедент - жесткий код ChildType в точке вызова.) –

ответ

2

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

Будьте осторожны при использовании атрибута [Флаги], поскольку он как бы свергает определение перечисления. Мы автоматически генерируем SDK на нескольких языках, включая Java, и нам пришлось немного скреститься, когда мы поняли, что некоторые из наших свойств были [Flags], но сопоставляются с регулярными перечислениями на конце Java, поэтому Java не понимает комбинированные значения.

0

Библиотека базового класса самой .NET Framework имеет множество методов, которые используют перечисления в качестве параметров (например, string.Equals(string, StringComparison)). Основные языки .NET, безусловно, их понимают. Любой язык, который не имеет перечислений, может потенциально имитировать их с помощью именованных констант.

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