Range [] вместо get Range()

http://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.worksheet.get_range.aspx он говорит использовать свойство Range вместо get_Range (Object Cell1, Object Cell2).

Они оба делают одно и то же,получает Microsoft.Офис.Взаимодействие.Превосходить.Объект Range, представляющий ячейку или диапазон ячеек. Итак, в чем разница, кроме того, что это метод, а другой-свойство? Почему они указывают на использование диапазона[], в чем причина?

3 ответов


Range () быстрее, чем Range[]

на практике мы заметили это дело. Но здесь следует определить причину, чтобы так сказать.

этот ярлык удобен, когда вы хотите обратиться к абсолютному диапазону. Однако он не так гибок, как Rangeproperty, поскольку он не может обрабатывать ввод переменных в виде строк или ссылок на объекты. Таким образом, в конце дня вы все равно будете ссылаться на долго путь. Хотя коротышка обеспечивает читаемость. Следовательно, может хорошо получить это право в первом раунде без дополнительных затрат ресурсов.

теперь почему это медленно? В сборнике.

"во время выполнения Excel всегда использует обычную нотацию (или так мне сказали), поэтому, когда код компилируется, все ссылки в Ярлыковой нотации должны быть преобразованы в обычную форму диапазона (или так мне сказали). {ie [A150] должен быть преобразован в форму диапазона("A150")}. Независимо от правды того, что мне сказали, Visual Basic должен запомнить оба его скомпилированная версия кода и любые обозначения, которые вы использовали для написания кода (т. е. все, что находится в модуле кода), свойства книги для размера файла (используемая память), таким образом, немного повышаются. "

Как вы видите, мой ответ больше соответствовал VBA. Однако после некоторых исследований доказано, что сторона VBA не сильно замедляется. Поэтому вам нужно только позаботиться на C# стороне. @Hans дает вам лучший ответ в перспективе C#. Надеюсь, сочетая оба, что вы получите отличный исполняющий код:)

вот некоторые находки о производительности Range [] vs Range () в Excel

enter image description here


Если вы используете C# версии 4 и выше, то вы можете использовать индексатор диапазона. Но вы должны использовать get_Range () в более ранних версиях.

обратите внимание, что в этом есть что-то особенное, свойство по умолчанию com-интерфейса сопоставляется индексатору. Но свойство Range не является свойством по умолчанию листа, это просто обычное свойство. Проблема в том, что C# не позволяет объявлять индексированные свойства, отличные от индексатора. Работает в VB.NET, не в C#, вы должны были позвонить свойство getter метод напрямую. По многочисленным просьбам команда C# сняла это ограничение в версии 4 (VS2010). Но только на COM-интерфейсах вы все равно не можете объявить индексированные свойства в своем собственном коде.


Я использовал оба и оба вернули те же результаты. Я думаю, что Range [] фактически использует get_Range () внутри.

для вопроса соглашения об именах я теперь использую только Range [].