Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Array.Length (да и в String) - как устроено? 
V
    Опции темы
Arks
  Дата 12.12.2006, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 7.5.2006
Где: Барнаул

Репутация: нет
Всего: нет



Интересует, что делают эти свойства: считывают значения из какой-то переменной или вычисляют? Как это в массиве и строках организовано?
Просто интересует надо ли запихивать в цикле эти данные отдельную переменную или также эффективно будет напрямую свойства читать?
PM MAIL ICQ Skype MSN   Вверх
ivashkanet
Дата 12.12.2006, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Arks, конечно считывают. 
Уж сильно часто эта длинна используется.

Для таких вопросов есть reflector

Это сообщение отредактировал(а) ivashkanet - 12.12.2006, 10:14
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 12.12.2006, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



В рефлекторе такие свойства помечены атрибутом [MethodImpl(MethodImplOptions.InternalCall)] и не имеют реализации  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 12.12.2006, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(mr.DUDA @  12.12.2006,  11:47 Найти цитируемый пост)
[MethodImpl(MethodImplOptions.InternalCall)]

 smile 
А во всяких ArrayList, List<T> --- длина храниться smile 
 smile Наверное потому, что не может быть вычислена  smile 
PM MAIL WWW ICQ   Вверх
Arks
Дата 12.12.2006, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 7.5.2006
Где: Барнаул

Репутация: нет
Всего: нет



Спасибо за ответы.
Для ivashkanet, неа. Потому что, вычислять долго и неэффективно, как и для массива. Или что ты имел в виду?

Это сообщение отредактировал(а) Arks - 12.12.2006, 16:36
PM MAIL ICQ Skype MSN   Вверх
ivashkanet
Дата 12.12.2006, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(mr.DUDA @  12.12.2006,  11:47 Найти цитируемый пост)
[MethodImpl(MethodImplOptions.InternalCall)]

Это как раз и означает, что длина обычного массива вычисляется. Но не обычными средствами, а низкоуровневыми. 
Типа <размер в байтах> /4 . А может и еще круче  smile 
PM MAIL WWW ICQ   Вверх
Arks
Дата 12.12.2006, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 7.5.2006
Где: Барнаул

Репутация: нет
Всего: нет



Так вы уж определитесь пожалуйста с когда вычисляется, когда нет? smile

Добавлено @ 17:12 
Кстати, я в рефлекторе ничего путного не нашёл:
Код
public: System::Int32 __gc* GetLength(System::Int32 __gc* dimension)
{
      return System::PInvoke::EE::Array_GetLength(this, dimension);
}

Мне это ровным счётом ничего не говорит.
PM MAIL ICQ Skype MSN   Вверх
ivashkanet
Дата 12.12.2006, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(Arks @  12.12.2006,  16:04 Найти цитируемый пост)
Так вы уж определитесь пожалуйста с когда вычисляется, когда нет? 

Во первых: а наф оно тебе?
Во вторых: Дуда же написал, что у этого свойства стоит атрибут MethodImpl(MethodImplOptions.InternalCall). 
Если перевести на русский, то РеализацияМетода(ВнутреннийВызов).

Что еще не понятно?
PM MAIL WWW ICQ   Вверх
Arks
Дата 12.12.2006, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 7.5.2006
Где: Барнаул

Репутация: нет
Всего: нет



1) Хочу знать как эффективнее - не охото, чтобы он в цикле тьму времени терял на вызовы фунцкий.
2) Из того, что сказал Дуда, я так понял, что длина в свойствах с MethodImpl(MethodImplOptions.InternalCall) хранится, а через пост ты сказал, что вычисляется. Так где правда?
И в том коде, что я показал как раз и есть этот внутренний вызов? MethodImpl(MethodImplOptions.InternalCall)?
Так?
PM MAIL ICQ Skype MSN   Вверх
ivashkanet
Дата 12.12.2006, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(Arks @  12.12.2006,  18:00 Найти цитируемый пост)
Хочу знать как эффективнее 

Зависит от ситуации.
Например для обычных массивов она вычисляется, а для коллекций --- хранится.
Цитата(Arks @  12.12.2006,  18:00 Найти цитируемый пост)
Так где правда?

См. выше и перечитай тему сначала.
Цитата(Arks @  12.12.2006,  18:00 Найти цитируемый пост)
И в том коде, что я показал как раз и есть этот внутренний вызов?

Нет. Там только вызов метода Array_GetLength. Нажми на него и посмотри что именно вызывается.

PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 12.12.2006, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Для строк размер стопудово хранится, а не вычисляется, т.к. строка - неизменяемый объект. Не хранится прямо в классе String по гейтс знает каким причинам, возможно это как-то связано с возможностью интернирования строк. Размер Array также неизменяемая величина, но здесь сложнее сказать, почему размер не хранится в классе. И тот и другой класс имеют синтаксические аналоги - возможно, причина как-то связана и с этим. В любом случае, нам остаётся только гадать. Хотя может в гугле что-то найдётся по этому поводу...


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 12.12.2006, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(mr.DUDA @  12.12.2006,  18:22 Найти цитируемый пост)
Для строк размер стопудово хранится

С чего это ты взял? Для строк стоит тот же MethodImpl(MethodImplOptions.InternalCall).
Цитата(mr.DUDA @  12.12.2006,  18:22 Найти цитируемый пост)
по гейтс знает каким причинам

А вот это чистая правда  smile 
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 12.12.2006, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(ivashkanet @  12.12.2006,  18:27 Найти цитируемый пост)
С чего это ты взял? Для строк стоит тот же MethodImpl(MethodImplOptions.InternalCall).

С того, что
Цитата(mr.DUDA @  12.12.2006,  18:22 Найти цитируемый пост)
 т.к. строка - неизменяемый объект.




--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 13.12.2006, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Нее, mr.DUDA, так и массив такой же неизменяемый  smile 

Хочу оговориться: Я бы хранил это значение, но меня смущает InternalCall  smile 

А вообще --- какая хрен разница  smile 
PM MAIL WWW ICQ   Вверх
Arks
Дата 13.12.2006, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 7.5.2006
Где: Барнаул

Репутация: нет
Всего: нет



А вот на что ссылается тот код:
Код
[System::Runtime::InteropServices::DllImport(S"mscoree", EntryPoint=S"#14")]
public: static extern System::Int32 __gc* Array_GetLength(System::Object __gc* array, System::Int32 __gc* dimension);

Что он делает я честно говоря не врубился, зато нашёл кое-что другое.

Длина строки действительно хранится. Вот:
Код
public private: System::Int32 __gc* StringLength;

Длина массива похоже хранится в этой переменной:
Код
private: System::Int32 __gc* cElems;


Это сообщение отредактировал(а) Arks - 13.12.2006, 09:53
PM MAIL ICQ Skype MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0974 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.