в f #, привязать к значению из библиотеки ac # - PullRequest
0 голосов
/ 22 февраля 2012

У меня есть F # DLL и C # DLL.

Библиотека C # имеет пространство имен Library с классом Toolbox, который содержит член FUND_BITS, например:

namespace Library {
    public static class Toolbox {
        public static uint FUND_BITS = 0;
    }
}

и затем в библиотеке F # у меня есть привязка:

let bf = Library.Toolbox.FUND_BITS

Теперь я использую bf в нескольких функциях, определенных в библиотеке. Когда я изменю значение FUND_BITS, я ожидаю, что все функции F # будут использовать обновленное значение, потому что я связал bf для ссылки на Library.Toolbox.FUND_BITS и не объявил его как изменяемую копию или что-нибудь. Однако я обнаружил, что функции используют устаревшее значение FUND_BITS, а не обновленное значение.

Не понимаю ли я, как F # создает неизменные привязки к значениям? Если это так, я не смог найти способ привязки, который будет обновляться с изменениями, например:

let bf = &Library.Toolbox.FUND_BITS

1 Ответ

5 голосов
/ 22 февраля 2012

К сожалению, в этом случае «bind» - это не то же самое, что «bind» в смысле привязки данных пользовательского интерфейса.Строка let bf = Library.Toolbox.FUND_BITS является в основном простым оператором присваивания.Вы обнаружите, что вывод типа показывает, что значение bf является экземпляром uint32.

Если вы хотите прочитать значение динамически, вам нужно использовать функцию, которая читает значениестатическая переменная каждый раз, когда она вызывается.

let bf = (function () -> Library.Toolbox.FUND_BITS)

РЕДАКТИРОВАТЬ Эта более краткая версия обусловлена ​​ Guvante

let bf() = Library.Toobox.FUND_BITS

В этомcase, bf будет иметь тип unit -> uint32.

Если вы хотите двустороннюю связь между значениями, вы можете объявить getter и setter свойства, которые используют статическое поле в качестве резервного хранилища., но это просто пугает меня.Лучшим подходом было бы просто ссылаться на поле напрямую, когда вам нужно прочитать или написать в нем.

...