но не приводит к ненужным изменениям в любом коде, который обращается к нему

ался в XNA и видел, чтоVector3 класс в нем использовал открытые поля вместо свойств. Я попробовал быстрый тест и обнаружил, что дляstruct разница довольно существенная (сложение двух векторов 100 миллионов раз заняло 2,0 с свойствами и 1,4 с полями). Для ссылочного типа разница не такая большая, но она есть.

Так почему это так? Я знаю, что свойство компилируется вget_X а такжеset_X методы, которые будут вызывать накладные расходы вызова метода. Однако, не эти простые получатели / установщикивсегда попасть в JIT? Я знаю, что вы не можете гарантировать, что JIT решит сделать, но, конечно, это довольно высоко в списке вероятности? Что еще может отделить открытое поле от свойства на уровне машины?

И одна вещь, которая меня интересует: как это автоматически реализуемое свойство (public int Foo { get; set; }) «лучше» ОО-дизайн, чем публичное поле? Или лучше сказать: как эти двоеразные? Я знаю, что с помощью рефлексии сделать это свойство легче, но что еще? Бьюсь об заклад, ответ на оба вопроса одно и то же.

Кстати: я использую .NET 3.5 с пакетом обновления 1 (SP1), который я считаю, исправлены проблемы, когда методы со структурами (или методыиз структуры, я не уверен) не были встроены, так что это не так. Я думаю, что я использую его, по крайней мере, он, безусловно, установлен, но опять же, я использую 64-битную Vista с SP1, который должен иметь DX10.1 за исключением того, что у меня нет DX10.1 ..

Также: да, я запускаю сборку релиза :)

РЕДАКТИРОВАТЬ: Я ценю быстрые ответы, ребята, но я указал, что яделать Я знаю, что доступ к свойству - это вызов метода, но я не знаю, почему, по-видимому, встроенный метод медленнее, чем прямой доступ к полю.

РЕДАКТИРОВАТЬ 2: Поэтому я создал еще одинstruct которые использовали явные методы GetX () (о, как я не пропускаю свои дни Javaвообще) и то же самое выполнял ли я отключил на нем встраивание (через[MethodImplAttribute(MethodImplOptions.NoInlining)]) или нет, так что вывод: нестатические методы, по-видимому, никогда не используются, даже на структурах.

Я думал, что есть исключения, когда JIT может оптимизировать вызов виртуального метода. Почему это не может произойти на структурах, которые не знают наследования, и, следовательно, вызов метода может указывать только на один возможный метод, верно? Или это потому, что вы можете реализовать интерфейс на нем?

Это своего рода позор, так как это действительно заставит меня задуматься об использовании свойств в критичных для производительности вещах, но использование полей заставляет меня чувствовать себя грязно, и я мог бы также написать то, что я делаю в C.

РЕДАКТИРОВАТЬ 3: Я нашелэто пост о примерно той же теме. Его окончательный вывод заключается в том, что вызов свойства действительно был оптимизирован. Я также мог бы поклясться, что много раз читал, что простые свойства getter / setter будут встроены, несмотря на то, чтоcallvirt в ил. Так я схожу с ума?

РЕДАКТИРОВАТЬ 4Рид Копси опубликовал ответ в комментарии ниже:

Re: Edit3 - см. Мой обновленный комментарий: я считаю, что это проблемы JIT x86 против x64. JIT в x64 не так зрелый. Я ожидаю, что MS быстро это улучшит, так как все больше 64-битных систем подключаются к сети каждый день. - Рид Копси

И мой ответ на его ответ:

Спасибо, это ответ! Я попытался форсировать сборку x86, и все методы одинаково быстры и намного быстрее, чем x64. На самом деле это очень шокирует меня, я понятия не имел, что живу в каменном веке на своей 64-битной ОС. Я включу ваш комментарий в мой ответ, чтобы он был лучше. - JulianR

Всем спасибо!

Ответы на вопрос(5)

Ваш ответ на вопрос