2012-03-13 3 views
1

Я проходил курс C#, и в моем сознании возникла следующая тема, и настало время, надеюсь, избавиться от нее: каковы последствия типизации в язык программирования?Последствия типизации на языке программирования

Когда я спрашиваю себя, каковы причины/мотивы завещания для создания безопасного типа, конечный ответ (возможно, единственный), который я придумал: способность определять типы на языке позволяет мы должны применять ограничения времени компиляции для данных, которые мы используем в нашей программе, так что IDE/компилятор может помочь, как в предотвращении/обнаружении ошибок, которые в противном случае мы пропустили бы - и, вероятно, выясним только намного позже - что, конечно, проблема , Среди этих ошибок - недопустимые операции, недопустимый доступ к члену и т. Д.

Если я прав до этого момента, я спрашиваю: что это означает/действительно происходит с кастингом на языках, таких как C#? Скажем, у меня есть метод, который определяется с помощью параметра типа Object, и я передаю ему любой вывод типа (т. Е. Любого типа) - что происходит на данный момент, за кулисами?

Я склонен предположить, что ввод текста также предлагает мне ограничения, по которым члены могут получить доступ в любом экземпляре объекта. Другими словами, я предполагаю, что компилятор всегда ищет тип переменной, а не экземпляр, который он получает для выполнения/применения своих правил проверки, а затем запускает или не выводит сообщение об ошибке. Это правильно? В приведенном ниже примере, поскольку тип переменной - Object, компилятор не разрешает мне обращаться к любому из моих экземпляров - если я не выполняю приведение к типу экземпляра. Здесь я хочу пояснить, что экземпляр был и будет всегда сохранять свой тип - независимо от того, выполняется ли какое-либо действие или нет. Приведение, следуя моей теории, необходимо только для того, чтобы компилятор - инструмент, который помогает нам в нашей работе, - и на какой одобрение мы подчиняемся на каждом этапе нашего построения нашей программы, - можно признать, что этот код действительно 100% доверенных/«безопасных».

Я тогда думаю о вышеупомянутом применении к полиморфизму и, по-видимому, имеет смысл: более общий тип, содержащий экземпляр более специализированного типа, не приводит к ошибке компилятора, поскольку нет никакого риска при доступе к члену экземпляра который не определен в более общем типе, поскольку более специализированный наследует их всех (переопределяя их или нет, или даже скрывая их). Другой способ, с другой стороны (когда тип более специализирован, чем экземпляр), заключается в проблеме, поскольку программист может очень ошибочно получить доступ к специализированному члену в экземпляре (который не будет существовать).

В качестве последнего примечания я предполагаю, что каждый экземпляр выделяет блок памяти (я задаюсь вопросом, обязательно ли он должен быть смежным или нет), который суммирует по размеру сумму каждого из своих требований к памяти членов типа (плюс еще несколько метаданных/header), и что каждое определение элемента генерирует определенный адрес памяти, который будет использоваться при доступе к экземпляру для доступа к любому данному члену (будь то переменная, метод и т. д.).

Являются ли какие-либо из вышеперечисленных допущений неправильными? (Или, может быть, я должен спросить ... есть ли кто-нибудь из них? :)

+0

Возможно, вас заинтересует [статья Википедии о системах типов] (http://en.wikipedia.org/wiki/Type_system); в частности, разделы по динамическому типированию и статической типизации очень актуальны для ваших вопросов. – ruakh

+0

Спасибо, я действительно думаю, что эта дискуссия начала принимать форму после того, как я прочитал ее, но я определенно не прочитал ее полностью или, по крайней мере, все разделы, которые вы упомянули. Посмотрите. – Veverke

ответ

0

Ваш ответ показывает хорошее понимание причин, по которым у нас есть типы в языках программирования.

Смежные вопросы