Вопрос

Я веб-программист PHP и пытаюсь изучить C#.

Я хотел бы знать, почему C# требует от меня указания типа данных при создании переменной.

Class classInstance = new Class();

Почему нам нужно знать тип данных перед экземпляром класса?

Это было полезно?

Решение

Как говорили другие, C# является статическим/строго типизированным.Но я воспринимаю ваш вопрос скорее как «Почему бы вам хотеть C# должен быть статическим/строго типизированным?Какие преимущества это имеет перед динамическими языками?»

Учитывая это, есть много веских причин:

  • Стабильность Определенные виды ошибок теперь автоматически обнаруживаются компилятором еще до того, как код приблизится к рабочей версии.
  • Читабельность/ремонтопригодность Теперь вы предоставляете будущим разработчикам, которые его прочтут, дополнительную информацию о том, как должен работать код.Вы добавляете информацию о том, что конкретная переменная предназначена для хранения определенного типа значения, и это помогает программистам понять, каково назначение этой переменной.

    Вероятно, поэтому, например, рекомендации по стилю Microsoft рекомендуют программистам VB6 добавлять префикс типа к именам переменных, а программистам VB.Net этого не делать.

  • Производительность Это самая слабая причина, но позднее связывание/утиная печать могут работать медленнее.В конце концов, переменная относится к памяти, структурированной определенным образом.Без строгих типов программе придется выполнять дополнительную проверку типов или преобразование «за кулисами» во время выполнения, поскольку вы используете память, структурированную одним способом физически, как если бы она была структурирована другим способом логически.

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

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

  • Лучшие инструменты разработки Если ваша IDE знает, какого типа должна быть переменная, она может дать вам дополнительную информацию о том, какие действия может выполнять эта переменная.Среде IDE это сделать гораздо сложнее, если ей приходится определять тип за вас.А если вы получите дополнительную помощь в тонкостях API от IDE, то вы, как разработчик, сможете освоить более крупный и богатый API и добраться до него быстрее.

Или, возможно, вам просто интересно, почему вам нужно дважды указывать имя класса для одной и той же переменной в одной строке?Ответ двоякий:

  1. Часто вы этого не делаете.В C# 3.0 и более поздних версиях вы можете использовать var во многих случаях вместо имени типа используется ключевое слово.Переменные, созданные таким образом, по-прежнему являются статически типизированными, но теперь их тип предполагаемый для вас компилятором.
  2. Благодаря наследованию и интерфейсам иногда тип слева не соответствует типу справа.

Другие советы

Просто так был задуман язык.C# — это язык в стиле C, в котором типы располагаются слева.

В C# 3.0 и более поздних версиях во многих случаях эту проблему можно обойти с помощью вывода локального типа.

var variable = new SomeClass();

Но в то же время вы также можете утверждать, что вы все еще объявляете тип в LHS.Просто вы хотите, чтобы компилятор выбрал его за вас.

РЕДАКТИРОВАТЬ

Пожалуйста, прочитайте это в контексте исходного вопроса пользователя.

почему нам нужно [имя класса] перед именем переменной?

Я хотел прокомментировать несколько других ответов в этой теме.Многие люди отвечают: «C# является статически типизированным».Хотя это утверждение верно (C# статически типизирован), оно почти полностью не связано с вопросом.Статическая типизация не требует, чтобы имя типа располагалось слева от имени переменной.Конечно, это может помочь, но это выбор разработчика языка, а не обязательная функция статически типизированных языков.

Это легко доказать, рассмотрев другие статически типизированные языки, такие как F#.Типы в F# отображаются справа от имени переменной и очень часто могут быть вообще опущены.Есть и несколько противоположных примеров.PowerShell, например, чрезвычайно динамичен и помещает все свои типы, если они включены, слева.

Одна из основных причин заключается в том, что вы можете указывать разные типы, если тип в левой части присваивания является родительским типом типа слева (или интерфейсом, реализованным на этом типе).

Например, даны следующие типы:

class Foo { }
class Bar : Foo { }
interface IBaz { }
class Baz : IBaz { }

C# позволяет вам сделать это:

Foo f = new Bar();
IBaz b = new Baz();

Да, в большинстве случаев компилятор мог вывести тип переменной из присваивания (как в случае с var ключевое слово), но это не так по причине, указанной выше.

Редактировать: По порядку - в то время как C# является строго типизировано, важное различие (в контексте данного обсуждения) состоит в том, что на самом деле это также статически типизированный язык.Другими словами, компилятор C# выполняет статическую проверку типов во время компиляции.

C# — это статически типизированный, строго типизированный язык, такой как C или C++.В этих языках все переменные должны быть объявлены как относящиеся к определенному типу.

В конечном итоге потому, что так сказал Андерс Хейлсберг...

Вам нужно [имя класса] впереди, потому что во многих ситуациях первое [имя класса] отличается от второго, например:

 IMyCoolInterface obj = new MyInterfaceImplementer();
 MyBaseType obj2 = new MySubTypeOfBaseType();

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

Зачем нам знать тип данных до экземпляр класса?

Вы не делаете! Читать справа налево. Вы создаете переменную, а затем сохраняете ее в переменной типа, безопасной для типа, чтобы знать, какого типа эта переменная, для дальнейшего использования.

Рассмотрим следующий фрагмент: отладка будет кошмаром, если вы не получите ошибки до времени выполнения.

 void FunctionCalledVeryUnfrequently()
 {
   ClassA a = new ClassA();
   ClassB b = new ClassB();
   ClassA a2 = new ClassB(); //COMPILER ERROR(thank god)

   //100 lines of code

   DoStuffWithA(a);
   DoStuffWithA(b);      //COMPILER ERROR(thank god)
   DoStuffWithA(a2);
 }

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

   string s = "abc";
   string s2 = new string(new char[]{'a', 'b', 'c'});
   //Does exactly the same thing

   DoStuffWithAString("abc");
   DoStuffWithAString(new string(new char[]{'a', 'b', 'c'}));
   //Does exactly the same thing

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

Указав заранее, какой тип вы собираетесь создать, вы получите предупреждения во время компиляции при попытке присвоить недопустимое значение.Заранее указав, какой тип параметров вы принимаете в методах, вы получаете те же самые предупреждения во время компиляции, когда случайно передаете бессмыслицу в метод, который ее не ожидает.Это избавит вас от некоторой паранойи.

Наконец, что довольно приятно, в C# (и во многих других языках) нет такого же нелепого подхода «конвертировать что угодно во что угодно, даже если это не имеет смысла», как в PHP, что, откровенно говоря, может сбить вас с толку еще несколько раз. чем это помогает.

Потому что C# — строго типизированный язык.

C# — это строго типизированный язык, такой как C++ или Java.Поэтому ему необходимо знать тип переменной.вы можете немного подделать это в С# 3.0 с помощью ключевого слова var.Это позволяет компилятору определить тип.

В этом разница между строго типизированным и слабо типизированным языком.C# (а также C, C++, Java и большинство более мощных языков) строго типизированы, поэтому вам необходимо объявить тип переменной.

Когда мы определяем переменные для хранения данных, мы должны указать тип данных, которые будут хранить эти переменные.Затем компилятор проверяет, имеет ли смысл то, что мы делаем с данными, т.е.следует правилам.Например, мы не можем хранить текст в числе — компилятор этого не позволит.

int a = "fred"; // Not allowed. Cannot implicitly convert 'string' to 'int' 

Переменная a имеет тип int, и присвоение ей значения «fred», которое представляет собой текстовую строку, нарушает правила — компилятор не может выполнить какое-либо преобразование этой строки.

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

var foo = new ClassName();

с этого момента переменная «foo» будет иметь тип «ClassName».

Единственное, что не было упомянуто, это то, что C# является языком, совместимым с CLS (Common Language Specification).Это набор правил, которых должен придерживаться язык .NET, чтобы быть совместимым с другими языками .NET.

Так что на самом деле C# просто придерживается этих правил.Цитировать эта статья MSDN:

CLS помогает улучшить и обеспечить совместимость языка, определяя набор функций, на которые разработчики могут полагаться на широкий спектр языков.CLS также устанавливает требования для соответствия CLS;Это поможет вам определить, соответствует ли ваш управляемый код CLS, и в какой степени данный инструмент поддерживает разработку управляемого кода, который использует функции CLS.

Если ваш компонент использует только функции CLS в API, которые он подвергает другому коду (включая производные классы), компонент гарантированно будет доступен на любом языке программирования, который поддерживает CLS.Компоненты, которые придерживаются правил CLS и используют только функции, включенные в CLS, являются компонентами, соответствующими CLS, являются компонентами CLS

Частью CLS является CTS. Система общего типа.

Если вам недостаточно сокращений, то в .NET есть еще масса таких сокращений, как CLI, ILasm/MSIL, CLR, BCL, FCL,

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

Статическая типизация также помогает в обслуживании и рефакторинге кода.Мой любимый пример — функция переименования во многих высокопроизводительных IDE.Благодаря статической типизации IDE может с уверенностью найти каждое появление идентификатора в вашем коде и оставить нетронутыми несвязанные идентификаторы с тем же именем.

Я не заметил, упоминалось ли это еще или нет, но в C# 4.0 появилась динамическая проверка ЧЕРЕЗ dynamic ключевое слово.Хотя я уверен, что вы захотите избежать этого, когда в этом нет необходимости.

Почему C# требует от меня указания типа данных при создании переменной.

Почему нам нужно знать тип данных перед экземпляром класса?

Я думаю, что в большинстве ответов не упоминается тот факт, что C # был изначально задуман и спроектирован как «управляемый», «безопасный» язык, среди прочего, и многие из этих целей достигаются с помощью статической проверки/проверяемости во время компиляции.Явное знание типа данных переменной значительно упрощает решение этой проблемы.Это означает, что можно выполнить несколько автоматических оценок (компилятор C#, а не JIT) возможных ошибок/нежелательного поведения, даже не допуская выполнения.

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

Статическая типизация означает, что компилятор может выполнять какие-то проверки во время компиляции, а не во время выполнения.Каждая переменная имеет определенный или строгий тип статического типа.C# строго типизирован.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top