Объявления и определения

В С# как объявление отличается от определения, то есть:

  • Объявление класса и определение класса
  • Объявление переменной vs definition
  • Объявление параметра метода vs definition

В С++ это было довольно очевидно, но в С# из того, что я могу сказать по стандарту ECMA, и MSDN - это то, что все является объявлением и где используется определение слова, оно используется как означающее то же, что и декларация.

Ответ 1

  • Это различие не существует. Вы имеете в виду область действия объявления, точка определения не имеет отношения к сфере действия переменной/поля.

  • int x;  // 'x' is declared
    x = 10; // 'x' is assigned
    
    
    int y = 20; // 'y' is both declared and assigned
    
  • Это не имеет большого смысла. Аргумент метода объявляется в сигнатуре метода.

Я думаю, вы немного запутались в терминологии в 1 и 3.

Ответ 2

где используется определение слова, оно используется как означающее декларацию

Правильно.

Понятие "декларация" как мягкое/прямое определение необходимо в C и С++ из-за их модели компиляции. С++ (концептуально) использует однопроходную компиляцию, С# - многопроходный. Рассмотрим:

class Bar; // declaration: needed in C++, illegal and unnecessary in C#

class Foo  // counts as a declaration of Foo
{
    Foo f; // use of declared but still incomplete type
    Bar b; // use of declared but still undefined class Bar
}

class Bar  //  definition and re-declaration  
{
}

С++ не может обрабатывать поле Bar b без объявления сначала. С# может.

Ответ 3

Модель построения С++ датируется эпохой, когда ферритовые ядра были долларом дюжины. Несколько файлов исходного кода скомпилированы по одному. С однопроходным компилятором. Компилятор для склеивания всего вместе. Это сделало отдельные декларации в файлах заголовков и прототипах.

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

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

Ответ 4

Это не потому, что С# не нужно делать различия.

Ответ 5

По словам Кернигана и Ричи в "языке программирования C": "Объявление" объявляет свойства переменных; он состоит из имени и списка переменных, таких как: int fahr, celsius;

Согласно Stroustrup в "языке программирования С++": "Объявление" - это выражение, в котором вводится имя в программу. Он указывает тип для этого имени. Тип определяет правильное использование имени или выражения.

Ни одна книга не определяет "определение". Но оба используют термин в научном смысле VALUE переменной. Таким образом, объявление функции объявляет функцию, вызывающую подпись. Определение функции содержит фактический код.

Необходимость иметь отдельные значения на этих языках связана с прошлыми компиляторами. Им нужно было знать типы имен раньше времени, прежде чем имя фактически использовалось. В противном случае они должны будут сделать еще один проход через исходный код.

Ответ 6

Ответы на исходные вопросы 1, 2, 3: никакой разницы в С#

Однако, возможно, стоит упомянуть эти термины в отношении методов:

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