Nano Hash - криптовалюты, майнинг, программирование

Есть ли более простой способ дать функции псевдоним в С#

ИСХОДНАЯ ИНФОРМАЦИЯ: в переносимом мной API имеется большое количество функций с префиксом sqlite3_. Они инкапсулированы в класс с именем Sqlite3, поэтому вызов функции Sqlite3.sqlite3_...

Я создал несколько псевдонимов, подобных следующим:

//C# alias for call    
public static void result_error_toobig(sqlite3_context pCtx)
{ sqlite3_result_error_toobig(pCtx); }

//Native call   
public static void sqlite3_result_error_toobig(sqlite3_context pCtx)
{
  Debug.Assert(sqlite3_mutex_held(pCtx.s.db.mutex));
  pCtx.isError = SQLITE_ERROR;
  setResultStrOrError(pCtx, "string or blob too big", -1,
  SQLITE_UTF8, SQLITE_STATIC);
}

Это позволяет мне писать код, например Sqlite3.result_error_toobig(pCtx);

ВОПРОС:

  • Будет ли компилятор оптимизировать вызов, чтобы накладные расходы были минимальными?
  • Есть ли более простой способ создать этот тип псевдонима?
23.02.2010

  • почему бы вам не использовать существующий поставщик SQLite ADO.NET, доступный здесь? sqlite.phxsoftware.com 23.02.2010
  • На самом деле это перенос SQLite в управляемый код (code.google.com/p/csharp-sqlite), а не поставщик ADO. В любом случае, я все еще изучаю некоторые из более тонких особенностей C#, и этот вопрос просто не дает мне покоя. Это все 23.02.2010
  • Не могу ответить на главный вопрос, но что касается оптимизации: если вы компилируете в режиме Release, компилятор должен встроить эти методы. В режиме отладки этого не произойдет, что ожидаемо и хорошо. 23.02.2010

Ответы:


1

Вы можете сэкономить время, используя открытые поля делегатов, а не создавать методы для каждой функции. Пока подписи параметров одинаковы, вы можете сделать что-то вроде этого:

public static class Sqlite3
{
    public static Action<sqlite3_context> ResultErrorTooBig =
        sqlite3_result_error_toobig;
    public static Func<T1, T2> AnotherMethod = 
        sqlite3_another_method;
}

Изменить:

Если вам нужно передавать параметры по ссылке, вы, вероятно, не сможете использовать эти удобные классы Action и Func. Однако вы можете объявить свои собственные типы делегатов, например:

delegate int StatementDelegate(ref sqlite3_stmt pStmt);

Затем в вашем статическом классе Sqlite3 вы можете сделать что-то вроде этого:

public static StatementDelegate Finalize = sqlite3_finalize;
23.02.2010
  • Это работает хорошо, спасибо. Продолжение, если у вас есть минутка. Каков правильный синтаксис, когда функция имеет ссылку по ссылке, например, public static int sqlite3_finalize(ref sqlite3_stmt pStmt) public static Func‹ref sqlite3_stmt›Finalize = sqlite3_finalize; не работает. 24.02.2010
  • Смотрите мое непроверенное редактирование. По сути, вы можете определить свой собственный тип делегата. 24.02.2010

  • 2

    Будет ли компилятор оптимизировать вызов, чтобы накладные расходы были минимальными?

    Да, компилятор оптимизирует вызов и эффективно удалит ваш метод-оболочку. Изменить: в режиме выпуска он будет оптимизирован, а в режиме отладки - нет.

    Есть ли более простой способ создать этот тип псевдонима?

    В зависимости от количества псевдонимов, которые вам нужно создать, вы можете написать макрос в Visual Studio, который будет выполнять повторяющуюся работу за вас. Просто зависит от того, потребуется ли больше времени для написания макроса или нет.

    pk

    23.02.2010
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

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

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..