Почему C# не позволяет константу и статичный на той же строке?

Хорошо, если кому-то когда-нибудь понадобится это, вот как я исправил мою проблему: используя модуль ng-file-upload ( https://www.npmjs.com/package/ng-file-upload ) HTML:

в ngf-drop = "dragDrop ($ file)" вызовет перетаскивание функции всякий раз, когда файл будет удален в поле. в ngf-select = "fileSelected ($ files)" при нажатии запускает поиск по вашим папкам для загрузки файла

Javascript:

    $scope.dragDrop = function(file) 
    {
        var files = [
            file
        ];
}

и

    $scope.fileSelected = function(file)
    {
         var files = [file];
}

[ 118] Надеюсь, что это будет полезно для кого-то еще.

24
задан Cuga 9 May 2009 в 03:51
поделиться

5 ответов

const и static действительно означают разные вещи, разные механизмы хранения, разные инициализация. static предназначен для чтения / записи, поэтому для него должна быть выделена память и инициализироваться во время выполнения. Статический объект может быть инициализирован литеральным значением или выражением. Напротив, константа является неизменной и должна быть инициализирована константой времени компиляции (обычно это буквальное значение или выражение, которое может быть полностью вычислено во время компиляции). Значение известно во время компиляции, поэтому оно может быть встроено непосредственно в сгенерированный код, поэтому не требует выделения памяти во время выполнения.

static предназначен для чтения / записи, поэтому для него должна быть выделена память и инициализироваться во время выполнения. Статический объект может быть инициализирован литеральным значением или выражением. Напротив, константа является неизменной и должна быть инициализирована константой времени компиляции (обычно это буквальное значение или выражение, которое может быть полностью вычислено во время компиляции). Значение известно во время компиляции, поэтому оно может быть встроено непосредственно в сгенерированный код, поэтому не требует выделения памяти во время выполнения.

static предназначен для чтения / записи, поэтому для него должна быть выделена память и инициализироваться во время выполнения. Статический объект может быть инициализирован литеральным значением или выражением. Напротив, константа является неизменной и должна быть инициализирована константой времени компиляции (обычно это буквальное значение или выражение, которое может быть полностью вычислено во время компиляции). Значение известно во время компиляции, поэтому оно может быть встроено непосредственно в сгенерированный код, поэтому не требует выделения памяти во время выполнения.

a const является неизменяемым и должен быть инициализирован константой времени компиляции (обычно буквальным значением или выражением, которое может быть полностью вычислено во время компиляции). Значение известно во время компиляции, поэтому оно может быть встроено непосредственно в сгенерированный код, поэтому не требует выделения памяти во время выполнения.

a const является неизменяемым и должен быть инициализирован константой времени компиляции (обычно буквальным значением или выражением, которое может быть полностью вычислено во время компиляции). Значение известно во время компиляции, поэтому оно может быть встроено непосредственно в сгенерированный код, поэтому не требует выделения памяти во время выполнения.

41
ответ дан 28 November 2019 в 22:22
поделиться

Это правда, что C # const подразумевает static НО, C # имеет эквивалент Java final ключевое слово в ключевом слове readonly .

Таким образом, на самом деле C # допускает const final , это static readonly в C # .

3
ответ дан 28 November 2019 в 22:22
поделиться

Константы по своей природе являются статическими, поэтому они будут избыточными.

22
ответ дан 28 November 2019 в 22:22
поделиться

Потому что разрешение или запрет на использование присущих модификаторов может вызвать путаницу. Если вы видите

static const int A = 3
const int B = 5

, вы можете подумать, что это константы двух разных типов.
Даже VB 2008 (который может быть очень многословным, если хотите) этого не допускает.

2
ответ дан 28 November 2019 в 22:22
поделиться

Как было сказано ранее, static final в Java совпадает с static readonly в C #. Фактически, вы говорите, что этот член статичен и его содержимое не может быть изменено. Также вы можете указать в обоих случаях значение из статического конструктора.

Но const в C # - совсем другое дело. Это больше похоже на константы в C (директивы DEFINE ), но с учетом ООП. Он статичен, потому что он постоянный - каждый экземпляр будет иметь эту константу с одинаковым значением, ни один конструктор не может ее установить. Также возможно, что кто-то захочет получить доступ к константе без создания экземпляра. Когда вы думаете об этом, нестатическая константа просто не имеет смысла. Можно почти сказать, что константы не являются частью объекта - они просто используют его для предоставления контекста, строгого имени.

В Java нет эквивалента const . Вы можете где-то прочитать, что static final эквивалентно DEFINE , но это очень расплывчато. Совершенно другой механизм, ничего общего, но в конечном итоге в коде тот же - лучшая ремонтопригодность и читабельность кода.

Вам просто нужно перестать думать о константах в C # как о статических членах, потому что это не так. Считайте их ООП-версией DEFINE . Когда вы рассматриваете инкапсуляцию, единственная причина для полей final и readonly состоит в том, чтобы предотвратить случайное изменение своего значения вашим собственным кодом. И это не кажется мне постоянным.

Итоги:

  • final = readonly
  • static final = static readonly
  • Н / Д = const
9
ответ дан 28 November 2019 в 22:22
поделиться