View-Page
<h:selectOneMenu id="selectOneCB" value="#{page.selectedName}">
<f:selectItems value="#{page.names}"/>
</h:selectOneMenu>
Backing-Bean
List<SelectItem> names = new ArrayList<SelectItem>();
//-- Populate list from database
names.add(new SelectItem(valueObject,"label"));
//-- setter/getter accessor methods for list
Чтобы отобразить определенную выбранную запись, это должно быть одно из значений в списке.
Я сделал некоторое очень неофициальное профилирование, и результаты указывают, что для моего конкретного приложения существует скромное увеличение производительности для передачи ссылкой. Для значением я получил приблизительно 10 050 000 вызовов в секунду, тогда как для ссылкой я получил приблизительно 11 200 000 вызовов в секунду.
Ваш пробег может варьироваться.
Перед выяснением, необходимо ли передать структуру ссылкой, необходимо спросить себя, почему у Вас есть такая огромная структура во-первых. Он действительно потребность быть структурой? Если бы необходимо использовать структуру в какой-то момент для P/Invoke, стоило бы иметь структуру всего для этого и затем эквивалентного класса в другом месте?
структура А, настолько большая, очень, очень необычна...
Посмотрите эти Руководство по проектированию для раздела Developing Class Libraries по Between Classes Выбора и Structures для большего руководства на этом.
Единственным путем можно добраться, ответ на этот вопрос должен кодировать обоих и измерить уровень.
Вы упоминаете неуправляемый/управляемый interop. Мой опыт состоит в том, что удивительно требуется много времени к к interop. Вы могли попытаться изменить свой код от:
void ManagedMethod(MyStruct[] items) {
foreach (var item in items) {
unmanagedHandle.ProcessOne(item);
}
}
К:
void ManagedMethod(MyStruct[] items) {
unmanagedHandle.ProcessMany(items, items.Count);
}
Эта техника помогла мне в подобном случае, но только измерения скажут Вам, если она будет работать на Ваш случай.
Почему бы просто не использовать вместо этого класс и не передать свой класс в функцию P / Invoke?
Использование класса будет хорошо передаваться в вашем управляемом коде и будет работать так же, как передача структура со ссылкой на функцию P / Invoke.
например
// What you have
public struct X
{
public int data;
}
[DllImport("mylib.dll")]
static extern void Foo( ref X arg);
// What you could do
[StructLayout(LayoutKind.Sequential)]
public class Y
{
public int data;
}
[DllImport("mylib.dll")]
static extern void Bar( Y arg );