2013-02-18 3 views
2

Может кто-то прояснить, если C# строго типизирован или слабо типизированный язык? И объясните, почему.Является ли C# строго типизированным или слабо типизированным языком?

Если у меня есть функция concat, которая может принимать любой объект, это значит, что она считается слабо типизированной?

function concat(Object stuff) 
{ 
    //do something here to stuff 
} 
+6

Помогите ли вы, чтобы downvoter дал причину, поэтому @ Mrshll187 будет знать, чего не следует делать в будущем? –

+0

@AbeMiessler Ты имеешь в виду, как комментарий, отправленный Сержем за две минуты до того, как вы отправили свой комментарий, и у него есть несколько оборотов? – Servy

+0

Зачем вы верили тому или другому? Вам не хватает фона в вашем вопросе – random

ответ

2

Here является блоге на эту тему с кем-то, кто был (в то время он написал пост) один из главных разработчиков C# компилятор.

Короче говоря, сам вопрос является ошибочным и не может быть разумно отреагирован в его текущей форме.

+5

Вот почему существуют близкие голоса: P – BoltClock

+6

@BoltClock Ну, ответ в том, что ответа нет, в отличие от «Никто из нас не может понять, что такое ответ». На самом деле есть довольно хорошее объяснение, которое может быть дано для * почему * не может быть никакого ответа, поэтому я не проголосовал за закрытие. – Servy

1

Согласно MSDN, C# является строго типизированным языком.

+5

MSDN также ошибается, поскольку тривиально писать программу на C#, которая не сильно типизирована. C# * может * писать сильно типизированные программы, но ничто не заставляет вас это делать. – Servy

14

От http://ericlippert.com/2012/10/15/is-c-a-strongly-typed-or-a-weakly-typed-language/

Is C# строго типизированный или слабо типизированный язык?

Да.

Это бесполезно.

Я не сомневаюсь в этом. Интересно, что если вы перефразировали вопрос как « » и «вопрос», ответ будет таким же.

Что? Вы имеете в виду, что C# строго типизирован и слабо типизированный язык?

Да, C# - строго типизированный язык и слабо типизированный язык.

Я в замешательстве.

Меня тоже. Возможно, вы должны сказать мне точно, что вы подразумеваете под «сильно набраны» и «слабо напечатаны».

Ум. Я не знаю, что я имею в виду под этими терминами, поэтому, возможно, это вопрос, который я должен задать. Что это значит для язык, который будет «слабо типизирован» или «строго типизирован»?

«Слабосвязанный напечатало» означает «этот язык использует систему проверки типа , что я нахожу отвратительным», и «сильно типизированным» означает «этот язык использует систему типа, что я нахожу привлекательным».

+3

@ Mrshll187 Ну, это единственный бар, в котором я не могу сказать, что это доказуемо неправильно. Все здесь, безусловно, так же правильно, как можно было бы ожидать, учитывая заданный вопрос. Ссылка также должна отображаться для вас в Google, когда вы искали ответы. – Servy

+0

Википедия в значительной степени подтвердила, что «сильно типизированные» и «слабо типизированные» обычно не означают ничего, и один используется для похваливания языков и других, чтобы критиковать его. Эта статья более самоуверенная, чем большая часть tbh. – trysis

2

Есть много, много определений как strongly typed и слабо типизированных, к точке, где вы должны определить, что вы имеете в виду под термином, когда вы его используете. Определение, которое я нахожу полезным, - это . «Язык заставляет меня указывать тип для таких вещей, как параметры?» Это отделяет языки, такие как C#, с одной стороны, и Javascript к другому, что я считаю полезным.

Требование кого-то назвать тип вместо того, чтобы полагаться на такие вещи, как «утиная печать», создает преимущества в статическом анализе, но имеет недостатки, когда дело касается определения типов, которые имеют общую функциональность.По этой причине многие из этих языков развивают сложные системы спецификации отношения типов, как правило, сначала программирование на основе классов, а затем разрабатывают системы шаблонов или , так что программисты могут говорить такие вещи, как «тип А - это подмножество типа B "или" тип C является метатипом, который может быть применен к любому другому типу, который удовлетворяет условиям D и E "и так далее.

+0

И все же существует ряд мест, в которых C# допускает, что вы указываете «утиная печать», является чертой не строго типизированных языков. Наиболее известным примером может служить цикл foreach, который работает для любого объекта с методом GetEnumerator. – Servy

+0

@ Серви, это не утка набрав. Он не проверяет * имя * «GetEnumerator», он проверяет, объявлен ли тип реализации «System.Collections.IEnumerable» или «System.Collections.Generic.IEnumerable ». – Plynx

+2

@ Plynx на самом деле это своего рода; он основан на именах/подписях, а не на конкретном интерфейсе. Другие примеры включают LINQ и 'await'. –

9

C# строго типизирован.

ECMA-334 Определяет C# как «C# (произносится как« C Sharp ») - это простой, современный, ориентированный на объекты и типный язык программирования».

Википедия определяет типобезопасность

Тип безопасности является синонимом одного из многочисленных определений сильной ввода; но тип безопасности и динамическая типизация взаимно совместимы.

Википедия определяет сильную типизации, как

В информатике и компьютерном программировании, система типа, как говорят особенность сильной типизации, когда он задает один или несколько ограничений на , как операции с участием значений различных типы данных могут быть смешаны. Противоположность сильному набору символов - слабое типирование.

Возможно, лучше спросить, является ли C# языком, безопасным для типов, поскольку никто не может согласиться с тем, что «сильный» и «слабый» означает «действительно», если компилятор выполнит проверку типов.

У C# есть некоторые динамические языки, подобные конструкциям, но замечательно они по-прежнему безопасны во время компиляции.

Начиная с Visual C# 3.0, переменные, объявленные в метод объема может иметь неявный тип var. Неявно типизированная локальная переменная строго типизирована так же, как если бы вы сами объявили тип , но компилятор определяет тип.

http://msdn.microsoft.com/en-us/library/bb383973.aspx

dynamic Ключевое слово в основном работает так же, за исключением того, что вычисляется во время выполнения, а не во время компиляции, как и в случае с var.

Visual C# 2010 представляет новый тип, динамический. Тип - статический тип , но объект типа dynamic обходит проверку статического типа. В большинстве случаев он работает как объект типа. Во время компиляции предполагается, что элемент , который вводится как динамический, поддерживает любую операцию.

http://msdn.microsoft.com/en-us/library/dd264736.aspx

+0

Зачем проголосовать за этот ответ. Это совершенно правильно. Дайте комментарий, если вы решите проголосовать. Таким образом, я могу понять, почему вам не понравился ответ. –

+0

'Нет никакого аргумента if 'и' s ', но для этого аргумента.'' Ну, так как «строго типизированный» не имеет четкого значения, нельзя сказать, относится ли оно к данному языку или нет. – Servy

+1

Я дал вам преимущество, но я думаю, что dw приходит от вас, утверждая: «Нет, если есть и есть/но есть к этому аргументу». Я могу дать вам несколько подсказок о том, почему не так хорошо говорить: Если вы дадите аргумент, а аргументы «нет счетчиков, которые действительны перед фронтом», то вы вообще не даете аргумент, вместо этого вы что-то утверждаете. Второй: Конечно, есть ifs и buts: см. ответ от Gideon, который будет принятый в ближайшее время, если SO сохраняет почти постоянный уровень качества. –

4

В общем: С # используется в строго типизированного образом, означает: переменная объявлена ​​конкретной Type (либо: String, Int, определенный пользователем тип и т. д.), и впоследствии не может быть присвоено значение другого типа.

Например: Вы не можете иметь следующее в C#:

int i = 10; 
i = "ten"; 

Как и в комментариях ниже, C# могут быть использованы по-разному.

Использование «сильной» типизации позволяет редактору/компилятору предупреждать вас об ошибках и позволяет редактору дать вам рекомендации, суженные до того, что вам, скорее всего, понадобится.

+2

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

+0

@Servy Возможно, я был неясен. Я имел в виду, что переменная будет постоянно установлена ​​на определенный тип. В отличие от, скажем, JavaScript, где переменная может быть строкой, а затем int и т. Д. – ispiro

+4

Вы имеете в виду как в C#, где я могу назначить строку переменной типа 'object', а затем назначить ей' int' ? – Servy

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