Что произойдет, если использование пространства имен, но не использовано в C # [duplicate]

Это очень распространенная проблема, с которой мы сталкиваемся, борясь с «таинствами» JavaScript.

Давайте начнем с простой функции JavaScript:

function foo(){
// do something 
 return 'wohoo';
}

let bar = foo(); // bar is 'wohoo' here

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

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

function foo(){
 setTimeout( ()=>{
   return 'wohoo';
  }, 1000 )
}

let bar = foo() // bar is undefined here

Итак, вы идете, эта задержка просто сломала функциональность, которую мы ожидали! Но что именно произошло? Ну, на самом деле это довольно логично, если вы посмотрите на код. функция foo() после выполнения ничего не возвращает (таким образом, возвращаемое значение равно undefined), но оно запускает таймер, который выполняет функцию после 1s, чтобы вернуть «wohoo». Но, как вы можете видеть, значение, присвоенное бару, является немедленно возвращенным материалом из foo (), а не что-либо еще, что приходит позже.

Итак, как мы решаем эту проблему?

Давайте попросим нашу функцию для ОБЕЩАНИЯ. Обещание действительно о том, что это означает: это означает, что функция гарантирует, что вы предоставите любой результат, который он получит в будущем. поэтому давайте посмотрим на это в нашей маленькой проблеме выше:

function foo(){
   return new Promise( (resolve, reject) => { // I want foo() to PROMISE me something
    setTimeout ( function(){ 
      // promise is RESOLVED , when exececution reaches this line of code
       resolve('wohoo')// After 1 second, RESOLVE the promise with value 'wohoo'
    }, 1000 )
  })
}

let bar ; 
foo().then( res => {
 bar = res;
 console.log(bar) // will print 'wohoo'
});

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

78
задан user2864740 14 July 2015 в 19:05
поделиться

6 ответов

Неиспользованное использование не влияет на производительность вашего приложения во время выполнения.

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

Это также может повлиять на производительность оценки выражений в отладчике по тем же причинам.

99
ответ дан JaredPar 26 August 2018 в 10:51
поделиться

Нет, это просто стиль стиля компиляции / кодирования. .NET-файлы используют полные имена под капотом.

12
ответ дан ChrisV 26 August 2018 в 10:51
поделиться

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

Ниже приведены некоторые выдержки из ссылки :

  1. Удалив неиспользуемые ссылки в вашем приложении, вы предотвращаете загрузку CLR неиспользуемых ссылочных модулей во время выполнения. Это означает, что вы сократите время запуска вашего приложения, так как требуется время для загрузки каждого модуля и избегает наличия метаданных загрузки компилятора, которые никогда не будут использоваться. Вы можете обнаружить, что в зависимости от размера каждой библиотеки время запуска заметно уменьшается. Это не означает, что ваше приложение будет быстрее после загрузки, но может быть очень удобно знать, что время запуска может быть уменьшено.
  2. Еще одно преимущество удаления любых неиспользуемых ссылок - это то, что вы уменьшите риск конфликтов с пространствами имен. Например, если у вас есть ссылки System.Drawing и System.Web.UI.WebControls, вы можете обнаружить, что возникают конфликты при попытке ссылаться на класс Image. Если вы используете директивы в своем классе, которые соответствуют этим ссылкам, компилятор не может определить, какие из них использовать. Если вы регулярно используете автозаполнение при разработке, удаление неиспользуемых пространств имен уменьшит количество значений автозаполнения в текстовом редакторе по мере ввода.
3
ответ дан Deepak Tekchandani 26 August 2018 в 10:51
поделиться

Нет, при компиляции программы выполняется несколько процессов. Когда компилятор начнет искать ссылки (классы, методы), он будет использовать только те, которые используются в коде. Директива using указывает только компилятору, где искать. Многие неиспользуемые операторы могут иметь проблемы с производительностью, но только во время компиляции. Во время выполнения весь внешний код правильно связан или включен как часть двоичного файла.

4
ответ дан Freddy 26 August 2018 в 10:51
поделиться

Код, который не выполняется, не влияет на производительность программы.

4
ответ дан Jeff Leonard 26 August 2018 в 10:51
поделиться

Не влияет на скорость выполнения, но может быть некоторое влияние на скорость компиляции / intellisense, поскольку для поиска подходящего класса существует больше потенциальных пространств имен. Я не стал бы слишком беспокоиться об этом, но вы можете использовать пункт меню «Упорядочить использование» для удаления и сортировки операторов using.

5
ответ дан tvanfosson 26 August 2018 в 10:51
поделиться
Другие вопросы по тегам:

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