Сравнение строк в C#

221
13 декабря 2017, 20:25

У меня есть две строки

string str1 = "Привет всем";
string str2 = str1;
if(str1 == str2) {
}

За сколько операций делается проверка сравненияа и почему.

И за сколько вот эта.

string str1 = "Привет всем";
string str2 = "Привет всем";
if(str1 == str2) {
}
Answer 1
  1. Одинаковы ли ссылки?
  2. Является ли хотя бы одна из строк nullом?
  3. Одинаковы ли длины строк?
  4. Сравнение группами по 4 или 2 символа в зависимости от архитектуры процессора.

PS: В коде из вопроса проверка закончится на шаге 1 в обоих случаях.

Оператор bool string

public static bool operator == (String a, String b) {
   return String.Equals(a, b);
}

Метод Equals String

[Pure]
public static bool Equals(String a, String b) {
    if ((Object)a==(Object)b) {
        return true;
    }
    if ((Object)a==null || (Object)b==null) {
        return false;
    }
    if (a.Length != b.Length)
        return false;
    return EqualsHelper(a, b);
}

Метод EqualsHelper String

[System.Security.SecuritySafeCritical]  // auto-generated
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
private unsafe static bool EqualsHelper(String strA, String strB)
{
    Contract.Requires(strA != null);
    Contract.Requires(strB != null);
    Contract.Requires(strA.Length == strB.Length);
    int length = strA.Length;
    fixed (char* ap = &strA.m_firstChar) fixed (char* bp = &strB.m_firstChar)
    {
        char* a = ap;
        char* b = bp;
        // unroll the loop
#if AMD64
        // for AMD64 bit platform we unroll by 12 and
        // check 3 qword at a time. This is less code
        // than the 32 bit case and is shorter
        // pathlength
        while (length >= 12)
        {
            if (*(long*)a     != *(long*)b) return false;
            if (*(long*)(a+4) != *(long*)(b+4)) return false;
            if (*(long*)(a+8) != *(long*)(b+8)) return false;
            a += 12; b += 12; length -= 12;
        }
#else
        while (length >= 10)
        {
            if (*(int*)a != *(int*)b) return false;
            if (*(int*)(a+2) != *(int*)(b+2)) return false;
            if (*(int*)(a+4) != *(int*)(b+4)) return false;
            if (*(int*)(a+6) != *(int*)(b+6)) return false;
            if (*(int*)(a+8) != *(int*)(b+8)) return false;
            a += 10; b += 10; length -= 10;
        }
#endif
        // This depends on the fact that the String objects are
        // always zero terminated and that the terminating zero is not included
        // in the length. For odd string sizes, the last compare will include
        // the zero terminator.
        while (length > 0) 
        {
            if (*(int*)a != *(int*)b) break;
            a += 2; b += 2; length -= 2;
        }
        return (length <= 0);
    }
}
READ ALSO
SVG глобус, невидимая часть

SVG глобус, невидимая часть

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

278
Деструктурирующее присваивание

Деструктурирующее присваивание

При изучении ES-2015 я наткнулся на деструктуризацию и мой пытливый ум решил поэкспериментировать

281
Как использовать &lt;template&gt; в Internet explorer 11?

Как использовать <template> в Internet explorer 11?

Появилась необходимость поддерживать IEИ я хочу удобный способ использовать шаблоны html кода

317
Добавление объекта в объект

Добавление объекта в объект

Как добавить новый объект во вложенный products?

327