Я удивлен, что там, кажется, такого консенсуса здесь не -virtual-by-default - правильный способ сделать что-то. Я собираюсь спуститься на другую - я думаю, прагматичная сторона забора.
Большая часть оправданий читается мне как старая «Если мы дадим вам силу, которую вы могли бы навредить себе». От программистов ?!
Мне кажется, что кодер, который не знал достаточно (или имел достаточно времени) для разработки своей библиотеки для наследования и/или расширяемости, является кодер, который создал именно те библиотеки, которые, вероятно, мне придется исправить или tweak - именно библиотека, где возможность переопределения пригодится в наибольшей степени полезной.
Количество раз, когда мне приходилось писать уродливый, отчаянный код обхода (или отказаться от использования и бросить свое собственное альтернативное решение), потому что я не могу переопределить далеко, намного перевешивает количество раз, когда-либо был укушен (например, на Java), переопределив место, которое разработчик мог бы не считать возможным.
Не виртуальный по умолчанию делает мою жизнь труднее.
ОБНОВЛЕНИЕ: Было указано [совершенно правильно], что я фактически не ответил на вопрос. Итак - и с извинениями за то, что вы довольно поздно ....
Я вроде как хотел написать что-то содержательное, как «C# реализует методы как не виртуальные по умолчанию, потому что было принято плохое решение, которое оценивало программы более высоко, чем программисты». (Я думаю, что это может быть несколько оправдано на основе некоторых других ответов на этот вопрос - например, производительность (преждевременная оптимизация, кто-то?) Или гарантирование поведения классов.)
Тем не менее, я понимаю, что просто хочу изложить свое мнение, а не тот окончательный ответ, который желает переполнение стека. Разумеется, я думал, что на самом высоком уровне окончательный (но бесполезный) ответ таков:
Они не виртуальны по умолчанию, потому что разработчики языка приняли решение сделать это и выбрали именно то, что они выбрали.
Теперь я думаю, что именно потому, что они приняли это решение, мы никогда не ... ой, подождите! The transcript of a conversation!
Таким образом, кажется, что ответы и комментарии здесь об опасностях переопределения API-интерфейсов и необходимости явного проектирования для наследования находятся на правильном пути, но все они не имеют важного временного аспекта: основная проблема Андерса заключалась в поддержании неявный контракт класса или API по версиям. И я думаю, что он больше обеспокоен тем, что платформа .Net/C# изменилась под кодом, а не беспокоилась о смене пользовательского кода поверх платформы. (И его «прагматическая» точка зрения - это полная противоположность моей, потому что он смотрит с другой стороны.)
(Но разве они не могли выбрать виртуальные по умолчанию, а затем начинали «окончательную» через кодовую базу? Возможно, это не совсем то же самое. И Андерс явно умнее меня, поэтому я собираюсь позволить ему солгать.)
Ответы, в которых упоминаются соображения производительности, игнорируют тот факт, что компилятор C# в основном компилирует вызовы методов на * callvirt *, а не на * call *. Именно поэтому в C# невозможно иметь метод, который ведет себя по-другому, если ссылка 'this' равна null. См. [Здесь] (http://www.pvle.be/2008/11/extension-methods-and-null-objects/) для получения дополнительной информации. – Andy
Правда! * call * IL-инструкция в основном предназначена для вызовов статических методов. – RBT
Мысли автора C# Андерса Хейлсберга [здесь] (http://www.artima.com/intv/nonvirtualP.html) и [здесь] (http://stackoverflow.com/questions/973240/why-are-methods-virtual -по-умолчанию-в-Java-но-не-виртуальных по-умолчанию в-с). – RBT