Почему в C # нет соглашения о не виртуальных вызовах? - PullRequest
3 голосов
/ 31 июля 2010

Вдохновленный этим SO вопросом :

Почему в C # нет ключевого слова для не-виртуального соглашения о вызовах?

РЕДАКТИРОВАТЬ: я имею в виду «почемубез ключевого слова для не виртуальных вызовов IL, учитывая, что компилятор C # всегда использует виртуальные вызовы IL по умолчанию "?

Ответы [ 2 ]

3 голосов
/ 31 июля 2010

Взгляните на , почему c # реализует методы как не виртуальные по умолчанию?

Цитировать Андерса Хейлсберга

Есть несколько причин. Один спектакль. Мы можем наблюдать это как люди пишут код на Java, они забывают отметить их методы окончательно. Таким образом, эти методы являются виртуальными. Потому что они виртуальные, они не выступи так же. Там просто накладные расходы, связанные с будучи виртуальным методом. Это один выпуск.

Более важной проблемой является управление версиями. Есть две школы мысли о виртуальные методы. Академическая школа мысли говорит: «Все должно быть виртуальный, потому что я мог бы хотеть переопределите это когда-нибудь. "Прагматичный школа мысли, которая исходит от создание реальных приложений, которые работают в реальный мир говорит: «Мы должны быть очень внимательно относимся к тому, что мы делаем виртуальный ".

Когда мы делаем что-то виртуальное в платформа, мы делаем очень много обещания о том, как оно развивается в будущее. Для не виртуального метода мы Обещаю, что когда ты называешь это метод, х и у произойдет. Когда мы опубликуем виртуальный метод в API, мы не только обещают, что когда вы звоните этот метод, х и у произойдет. Мы также обещаю, что когда вы переопределите этот метод, мы будем называть его в этом конкретная последовательность в отношении эти другие, и государство будет в этом и том инварианте.

Каждый раз, когда вы говорите виртуальный в API, Вы создаете ловушку обратного вызова. Как дизайнер ОС или API, ты должен быть очень осторожным тот. Вы не хотите, чтобы пользователи переопределяли и перехватывать в любой произвольной точке API, потому что вы не можете обязательно сделать эти обещания. И люди могут не до конца понимают обещания, которые они делают, когда они делают что-то виртуальная.

Источник: http://www.artima.com/intv/nonvirtual.html

2 голосов
/ 31 июля 2010

Это может объяснить это: http://blogs.msdn.com/b/ericgu/archive/2008/07/02/why-does-c-always-use-callvirt.aspx

Коротко: call инструкция может принять null в качестве this указателя (как в C ++). Это ошибочно, и команда C # решила использовать callvirt везде, где это возможно, чтобы при вызовах null указатели бросали NullReferenceException

...