Различия в строке сравнивают методы в C#

create_task()
  • принимает сопрограммы,
  • возвращает задачу,
  • вызывается в контексте цикла.

ensure_future()

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

Как вы видите, более конкретная функция create_task.


async функция без create_task или secure_future

Простой вызов async возвращает coroutine

>>> async def doit(i):
...     await asyncio.sleep(3)
...     return i
>>> doit(4)   

И поскольку gather под капотом гарантирует (ensure_future), что args являются фьючерсами, явно ensure_future является избыточным.

Аналогичный вопрос В чем разница между loop.create_task, asyncio.async / secure_future и Task?

256
задан AGuyCalledGerald 14 July 2014 в 21:46
поделиться

8 ответов

Вот правила для того, как эти функции работают:

stringValue.CompareTo(otherStringValue)

  1. null прибывает перед строкой
  2. это использует CultureInfo.CurrentCulture.CompareInfo.Compare, что означает, что это будет использовать зависимое от культуры сравнение. Это могло бы означать, что ß выдержит сравнение равный SS в Германии, или подобный

stringValue.Equals(otherStringValue)

  1. null не считается равным ничему
  2. , если Вы не определите StringComparison опция, она будет использовать то, что похоже на прямую порядковую проверку равенства, т.е. ß не то же как SS, ни на каком языке, или культура

stringValue == otherStringValue

  1. не Является тем же как [1 111].
  2. Эти == вызовы оператора помехи Equals(string a, string b) метод (который в свою очередь переходит к внутреннему EqualsHelper, чтобы сделать сравнение.
  3. Вызов .Equals() на null строка добирается null ссылочное исключение, в то время как на [1 118] не делает.

Object.ReferenceEquals(stringValue, otherStringValue)

Просто проверки, что ссылки являются тем же, т.е. это не всего две строки с тем же содержанием, Вы сравниваете строковый объект с собой.

<час>

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

Мой совет, если Вы просто хотите проверить на равенство, состоит в том, чтобы решиться, хотите ли Вы использовать зависимое от культуры сравнение или нет, и затем использовать .CompareTo или .Equals, в зависимости от выбора.

227
ответ дан Vadim Ovchinnikov 23 November 2019 в 02:45
поделиться

Из MSDN:

"Метод CompareTo был разработан, прежде всего, для использования в сортировке или расположении в алфавитном порядке операций. Это не должно использоваться, когда основная цель вызова метода должна определить, эквивалентны ли две строки. Чтобы определить, эквивалентны ли две строки, звоните, Равняется методу".

Они предлагают использовать .Equals вместо .CompareTo при искании только равенства. Я не уверен, существует ли различие между .Equals и == для string класс. Я буду иногда использовать .Equals или Object.ReferenceEquals вместо == для моих собственных классов в случае, если кто-то приезжает в более позднее время и переопределяет == оператор для того класса.

71
ответ дан FMFF 23 November 2019 в 02:45
поделиться

Если Вам когда-либо любопытно на предмет различий в методах BCL, , Отражатель является Вашим другом :-)

я следую этим инструкциям:

Точное совпадение: РЕДАКТИРОВАНИЕ: Я ранее всегда использовал == оператор на принципе, который внутри Равняется (строка, строка) объекту ==, оператор используется для сравнения ссылок на объект, но кажется, что strA.Equals (strB) все еще на 1-11% быстрее в целом, чем строка. Равняется (Стра, strB), Стра == strB, и строка. CompareOrdinal (Стра, strB). Я циклично выполняюсь протестированный с StopWatch и на строковых значениях interned/non-interned с теми же/отличающимися длинами строки, и на переменных размерах (1B к 5 МБ).

strA.Equals(strB)

Человекочитаемое соответствие (Западные культуры, нечувствительные к регистру):

string.Compare(strA, strB, StringComparison.OrdinalIgnoreCase) == 0

Человекочитаемое соответствие (Все другие культуры, нечувствительный случай/диакритический знак/кана/и т.д., определенный CultureInfo):

string.Compare(strA, strB, myCultureInfo) == 0

Человекочитаемое соответствие с пользовательскими правилами (Все другие культуры):

CompareOptions compareOptions = CompareOptions.IgnoreCase
                              | CompareOptions.IgnoreWidth
                              | CompareOptions.IgnoreNonSpace;
string.Compare(strA, strB, CultureInfo.CurrentCulture, compareOptions) == 0
50
ответ дан Noctis 23 November 2019 в 02:45
поделиться

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

существует различие, однако, между.Equals и ==.

== решает к по существу следующий код:

if(object.ReferenceEquals(left, null) && 
   object.ReferenceEquals(right, null))
    return true;
if(object.ReferenceEquals(left, null))
    return right.Equals(left);
return left.Equals(right);

простая причина следующая, выдаст исключение:

string a = null;
string b = "foo";

bool equal = a.Equals(b);

И следующее не будет:

string a = null;
string b = "foo";

bool equal = a == b;
18
ответ дан Community 23 November 2019 в 02:45
поделиться

Не то, чтобы производительность обычно имеет значение с 99% времен, необходимо сделать это, но если бы необходимо было сделать это в цикле несколько миллионов раз, то я высоко предложил бы, чтобы Вы использовали.Equals или ==, потому что, как только это находит символ, который не соответствует ему, выводит все это как ложь, но если Вы используете CompareTo, это должно будет выяснить, который символ является меньше, чем другой, ведя к немного худшему времени производительности.

, Если бы Ваше приложение будет работать в разных странах, я рекомендовал бы, чтобы Вы смотрели на последствия CultureInfo и возможно использовали.Equals. Так как я только действительно пишу приложения для США (и не заботьтесь, не работают ли они правильно кем-то), я всегда просто использую ==.

7
ответ дан viggity 23 November 2019 в 02:45
поделиться

В формах Вы перечислили здесь, нет большого различия между двумя. CompareTo заканчивает тем, что звонил CompareInfo метод, который делает сравнение с помощью текущей культуры; Equals назван == оператор.

, Если Вы рассматриваете перегрузки, тогда вещи становятся отличающимися. Compare и == может только использовать текущую культуру для сравнения строки. Equals и String.Compare может взять StringComparison аргумент перечисления, которые позволяют Вам определить нечувствительные к культуре или нечувствительные к регистру сравнения. [Только 119] позволяют Вам определять CultureInfo и выполнять сравнения с помощью культуры кроме культуры по умолчанию.

из-за его универсальности, я нахожу, что использую [еще 1111], чем какой-либо другой метод сравнения; это позволяет мне определить точно, что я хочу.

5
ответ дан OwenP 23 November 2019 в 02:45
поделиться

Используя.Equals также намного легче к , читает .

-1
ответ дан hometoast 23 November 2019 в 02:45
поделиться

с .Equals вы также получаете параметры StringComparison. очень удобен для игнорирования дела и прочего.

кстати, это будет оцениваться как false

string a = "myString";
string b = "myString";

return a==b

Поскольку == сравнивает значения a и b (которые являются указателями), это будет оцениваться как true, только если указатели указывают на один и тот же объект в памяти. .Equals разыменовывает указатели и сравнивает значения, хранящиеся в указателях. a.Равенство (b) здесь будет истинным.

и если вы измените b на:

b = "MYSTRING";

, тогда a.Equals (b) будет ложным, но

a.Equals(b, StringComparison.OrdinalIgnoreCase) 

будет истинным

a.CompareTo (b) вызывает функцию CompareTo строки, которая сравнивает значения в указателей и возвращает <0, если значение, хранящееся в a, меньше значения, хранящегося в b, возвращает 0, если a.Equals (b) истинно, и> 0 в противном случае. Однако это чувствительно к регистру, я думаю, что у CompareTo есть варианты игнорировать регистр и тому подобное, но сейчас нет времени смотреть. Как уже было сказано другими, это будет сделано для сортировки. Такое сравнение на равенство приведет к ненужным накладным расходам.

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

-9
ответ дан 23 November 2019 в 02:45
поделиться
Другие вопросы по тегам:

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