Как работает CLR при вызове методом в C #, VB.Net, - PullRequest
1 голос
/ 17 августа 2011

Я не знаю, как объяснить мой вопрос, пожалуйста, примите его в форме примера:

Я написал библиотеку на языке C #, которая имеет следующий метод:

public object GetValueAt(int idx) {
    return arr[idx];
}

Затем я использую его в VB.Net, разумеется, в индексе есть различия между C # и VB.Net.Поэтому, если я вызываю этот метод с idx = 6, как CLR узнает объект, к которому я пытаюсь получить доступ (он имеет idx = 5 на C #)?

Это всего лишь мой пример, а как насчет существующей библиотеки в .Net?

Ответы [ 2 ]

6 голосов
/ 17 августа 2011

Единственное различие, которое мне известно о том, где вы можете поверить, что существует разница в индексировании между C # и VB.Net, - это когда объявляет массив.

В VB.Net вы объявляете верхняя граница массива:

Dim x(10) as Int32

объявляет массив из 11 элементов, начиная с 0 и заканчивая 10. В C # вы объявляете length массива:

Int32 []x = new Int32[10];

объявляет массив из 10 элементов, начиная с 0 и заканчивая 9.

Индексированный доступ с одинаковыми значениями индекса работает так жеоба языка.

3 голосов
/ 17 августа 2011

Если вы вызовете этот метод из VB с idx = 6, он вернет arr[6], обработав arr как 0 (то есть седьмой элемент), потому что код написан на C #. Автоматический перебазирование не применяется, потому что вы просто вызываете метод из VB.

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

РЕДАКТИРОВАТЬ: Это связано со страницей MSDN "Массивы в Visual Basic" , которая показывает пример и объясняет:

Массив студентов в предыдущем примере содержит 7 элементов. Индексы элементов варьируются от 0 до 6.

А с это сообщение в блоге :

Как могут знать многие давние веб-разработчики, Visual Basic и VB Script в течение многих лет имели массивы на основе 1, в то время как почти во всех других языках, которые я использовал - C, C ++, JScript, JavaScript - было 0- основанные массивы. У меня не было особого предпочтения одного над другим, но было сложно настроить свой ум при переключении с одного на другое.

Затем, когда был выпущен .Net, Visual Basic изменился на использование массивов на основе 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...