Изменения в старом .NET API

Mar 25, 2014 18:28


Переделал работу с битовыми флагами, управляющими работой парсера и POS Tagger'а.

Раньше был такой код в C#-обертке:


public sealed class GrammarEngine
{
 public const int SOL_GREN_ALLOW_FUZZY           = 0x00000002;
 public const int SOL_GREN_COMPLETE_ONLY         = 0x00000004;
 public const int SOL_GREN_PRETOKENIZED          = 0x00000008;
 public const int SOL_GREN_TOKENIZE_ONLY         = 0x00000010;
 public const int SOL_GREN_DISABLE_FILTERS       = 0x00000020;
 public const int SOL_GREN_ENABLE_RECONSTRUCTION = 0x00000040;
 public const int SOL_GREN_SPARSE                = 0x00000080;
 public const int SOL_GREN_BOTTOMUP              = 0x00000100;
 public const int SOL_GREN_TOPDOWN               = 0x00000200;
 public const int SOL_GREN_REORDER_TREE          = 0x00000400;
 public const int SOL_GREN_MODEL                 = 0x00000800;
 public const int SOL_GREN_FINDFACTS             = 0x00001000;

// ...

// http://www.solarix.ru/api/ru/sol_MorphologyAnalysis.shtml
 [DllImport(gren_dll, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
 public static extern IntPtr /*HGREN_RESPACK*/ sol_MorphologyAnalysis(
                                                                      IntPtr hEngine,
                                                                      string Sentence,
                                                                      int Flags,
                                                                      int UnusedFlags,
                                                                      int max_msec,
                                                                      int Language
                                                                     );
}

Это практически копипаста с C++ исходника. Она, конечно, выполняет свою роль, но ее можно немножечко улучшить, воспользовавшись расширенными свойствами перечислений в C#:

public sealed class GrammarEngine
{
[Flags]
 public enum MorphologyFlags
 {
  DEFAULT=0,
  SOL_GREN_ALLOW_FUZZY           = 0x00000002,
  SOL_GREN_COMPLETE_ONLY         = 0x00000004,
  SOL_GREN_PRETOKENIZED          = 0x00000008,
  SOL_GREN_TOKENIZE_ONLY         = 0x00000010,
  SOL_GREN_DISABLE_FILTERS       = 0x00000020,
  SOL_GREN_MODEL                 = 0x00000800,
  SOL_GREN_MODEL_ONLY            = 0x00002000
 }

[Flags]
 public enum SyntaxFlags
 {
  DEFAULT=0,
  SOL_GREN_REORDER_TREE          = 0x00000400,
  SOL_GREN_FINDFACTS             = 0x00001000,
 }

[DllImport(gren_dll, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
 public static extern IntPtr /*HGREN_RESPACK*/ sol_MorphologyAnalysis(
                                                                      IntPtr hEngine,
                                                                      string sentence,
                                                                      MorphologyFlags flags,
                                                                      SyntaxFlags unusedFlags,
                                                                      int constraints,
                                                                      int languageId
 // ...                                                              );
}

Атрибут [Flags] нужен больше для отладки.
Плюс состоит в том, что Теперь даже сама сигнатура sol_MorphologyAnalysis и sol_SyntaxAnalysis подсказывает, какие значения можно указать для флагов.
Отрицательный нюанс - эти изменения ломают старый код, так как в C#, в отличие от C++, нет умолчальной конвертации enum'а в int.

api, SDK грамматического словаря

Previous post Next post
Up