Альтернатива AddressOf в C#

Просто столкнулся с той же проблемой. (похоже, вы используете более новый Джексон, чем я, но все равно должны работать)

Что вам нужно, так это

<dependency>
  <groupId>com.fasterxml.jackson.datatype</groupId>
  <artifactId>jackson-datatype-guava</artifactId>
  <version>your version</version>
</dependency>

Но добавления зависимости недостаточно. Вам также необходимо зарегистрировать класс com.fasterxml.jackson.datatype.guava.GuavaModule.GuavaModule в ObjectMapper.

Я подозреваю, что из вашего примера кода вы используете какую-то инфраструктуру. Я не могу помочь с этим.

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

ObjectMapper mapperWithGuavaSupport = new ObjectMapper().registerModule(new GuavaModule())
MyObjectContainsImmutableMap obj = mapperWithGuavaSupport.readValue("theJsonString", MyObjectContainsImmutableMap.class);

Надеюсь, что это по крайней мере даст вам подсказку в направлении ... Удачи!

6
задан Deduplicator 20 December 2017 в 19:32
поделиться

4 ответа

Подробно останавливаясь на ответе Harper Shelby, да, это может быть сделано, но это обычно - запах кода, чтобы сделать так в.NET.

Для получения адреса переменной в C# можно использовать указатель C-стиля (*) / адрес (и) / разыменовывают (->) синтаксис. Чтобы сделать это, необходимо будет скомпилировать приложение с / небезопасным переключателем компилятора, поскольку Вы возвращаетесь из системы поддержки управляемого кода, как только Вы начинаете иметь дело с адресами памяти непосредственно.

Образец от MSDN рассказывает большую часть истории:

int number;
int* p = &number;
Console.WriteLine("Value pointed to by p: {0}", p->ToString());

Это присваивает адрес number переменная к pointer-to-an-int p.

Существуют некоторые выгоды к этому:

  1. Переменная, адрес которой Вы являетесь выбирающими, должна быть инициализирована. Не проблема для типов значения, какое значение по умолчанию, но это - проблема для ссылочных типов.
  2. В.NET переменные могут переместиться в память без Вас являющийся знающим об этом. Если необходимо иметь дело с адресом переменной, Вы действительно хотите использовать fixed прикрепить переменную в RAM.
  3. И может только быть применен к переменной, не константе, ни значению. (Другими словами, Вы не можете использовать конструкцию как int* p = &GetSomeInt();)
  4. Снова, Ваш код должен быть скомпилирован в небезопасном режиме, который отмечает CLR, что Вы будете использовать функции вне управляемого кода "система поддержки".

Обычно мой совет в этом мире состоит в том, чтобы серьезно рассмотреть, почему Вы думаете, что необходимо сделать это в мире.NET. Одна из миссий.NET состояла в том, чтобы экранировать разработчиков от хождения вразрез с металлом, и эта функция в противоречии с той миссией. Это существует для тех (редких) сценариев, где это необходимо; если Вы используете несерьезно это просто, потому что Вы можете, Вы, вероятно, неправильно использовать его и представить запах кода.

Избегайте его, если это возможно, но знайте, как использовать его, если Вы абсолютно должны.

11
ответ дан 8 December 2019 в 12:23
поделиться

C# имеет специальный синтаксис для присвоения функций делегатам/событиям. Просто используйте <delegate> += <function>;

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

6
ответ дан 8 December 2019 в 12:23
поделиться

По-видимому, это может быть сделано (хотя я не уверен, где Вам был бы нужен он). Вот страница MSDN.

2
ответ дан 8 December 2019 в 12:23
поделиться
EventHandler handler1 = this.button1_Click;
EventHandler handler2 = new EventHandler( this.button1_Click );
...
...
...
void button1_Click( object sender, EventArgs e ){
    // ....
}

Обе нотации эквивалентны.

0
ответ дан 8 December 2019 в 12:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: