Каково различие между этими двумя объявлениями?

Используйте метод .serialize() для отправки данных всей формы в jQuery Ajax.

data:$('#formID').serialize()

Пример скрипта можно найти здесь - Как отправить данные всей формы в jQuery Ajax

9
задан eKek0 5 June 2009 в 06:12
поделиться

7 ответов

В последней версии директивы using применяются только внутри объявления пространства имен.

В большинстве случаев у вас будет только одно объявление пространства имен:

// Using directives
...
namespace X
{
    // Maybe more using directives
    // Code
}
// End of file

Основное различие в том, если у вас есть несколько пространств имен в одном файле:

// Using directives
...
namespace X
{
    // Maybe more using directives
    // Code
}

namespace Y
{
    // Maybe more using directives
    // Code
}
// End of file

В этом случае директивы using в объявлении пространства имен X не влияют на код внутри объявления пространства имен Y, и наоборот.

Однако это не единственное различие - существует тонкий случай, на который указывает Эрик Липперт , где он может повлиять на код даже с помощью всего лишь одного объявления пространства имен. (Обычно, если вы пишете , используя Foo; внутри объявления пространства имен X, и есть пространство имен X.Foo , а также Foo , поведение меняется. Это может можно исправить с помощью псевдонима пространства имен, например. грамм. using global :: Foo; , если вы действительно хотите.)

Лично я бы придерживался:

  • Одно объявление пространства имен для каждого файла (и обычно один тип верхнего уровня на файл)
  • Использование директив вне декларации пространства имен
26
ответ дан 4 December 2019 в 06:41
поделиться

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

Подробности здесь .

6
ответ дан 4 December 2019 в 06:41
поделиться

Второе может быть неоднозначным;

Верхний проясняет ваше после этих пространств имен:

  • System
  • System.Collections
  • System.Collections.Generic

В то время как второй будет сначала искать эти пространства имен:

  • AProject .Helpers.System
  • AProject.Helpers.System.Collections
  • AProject.Helpers.System.Collections.Generic

И обратитесь к ним вместо этого, если они найдены ... Если нет, они оба будут ссылаться в те же пространства имен.

Более безопасная перезапись второго будет:

namespace AProject.Helpers
{
    using global::System;
    using global::System.Collections;
    using global::System.Collections.Generic;
}
2
ответ дан 4 December 2019 в 06:41
поделиться

Думаю, есть причина использовать вторую альтернативу с точки зрения пуристов, поскольку она дает более ясное представление о масштабах использование директив :

0
ответ дан 4 December 2019 в 06:41
поделиться

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

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

0
ответ дан 4 December 2019 в 06:41
поделиться

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

0
ответ дан 4 December 2019 в 06:41
поделиться

Другое важное различие между ними возникает при использовании LINQ-to-SQL и сгенерированных классов контекста данных. Например, образец базы данных Northwind; изначально вы получите:

  • Northwind.dbml
    • Northwind.dbml.layout
    • Northwind.designer.cs

Если теперь вы хотите расширить частичные классы, добавив свой собственный Northwind.cs , вы получите

  • Northwind.dbml
    • Northwind.dbml.layout
    • Northwind.designer.cs
    • Northwind.cs

Забавно , в генераторе кода есть ошибка ( MSLinqToSQLGenerator ) - это означает, что если директивы using находятся вне пространства имен (как они есть по умолчанию), он прерывается - с сообщением:

Произошла ошибка пользовательского инструмента MSLinqToSQLGenerator. Неизвестная ошибка

И файл Northwind.designer.cs удаляется. Нет больше контекста данных!

Однако, если вы переместите с помощью директив внутрь пространства имен (и повторно запустите настраиваемый инструмент - щелкните правой кнопкой мыши в проводнике решений), он работает правильно.

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

Обратите внимание, что вы также можете исправить это, просто назвав свой файл другим способом - например, NorthwindExtras.cs .

Чумовая.

если вы переместите с помощью директив внутрь пространства имен (и повторно запустите настраиваемый инструмент - щелкните правой кнопкой мыши в проводнике решений), он будет работать правильно.

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

Обратите внимание, что вы также можете исправить это, просто назвав свой файл другим способом - например, NorthwindExtras.cs .

Чумовая.

если вы переместите с помощью директив внутрь пространства имен (и повторно запустите настраиваемый инструмент - щелкните правой кнопкой мыши в проводнике решений), он будет работать правильно.

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

Обратите внимание, что вы также можете исправить это, просто назвав свой файл другим способом - например, NorthwindExtras.cs .

Чумовая.

1
ответ дан 4 December 2019 в 06:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: