Sobes.tech
Middle

Kā notiek virkņu salīdzināšana C#? Vai tiek salīdzinātas virkņu objektu atsauces?

sobes.tech AI

Atbilde no AI

C# virkņu salīdzināšana var notikt vairākos veidos:

  1. Operator ==: Virkņu literāliem un ja virknes satur vienādu saturu, operators == atgriezīs true. Atšķirībā no citiem atsauces tipiem, == operators ir pārlādīts virkņu salīdzināšanai pēc satura, nevis atsaucēm.
  2. Metode Equals(): Šī metode arī salīdzina virkņu saturu pēc noklusējuma. To ieteicams izmantot skaidrai satura salīdzināšanai un tas var būt uzticamāks, īpaši salīdzinot ar null. Ir pārlādījumi, ņemot vērā lielumu un kultūru.
  3. Metode String.Compare(): Statiska metode, kas salīdzina divas virknes un atgriež veselu skaitli, kas norāda uz to attiecību. Tā ļauj norādīt dažādus salīdzināšanas parametrus (reģistru, kultūru un citus).
  4. Metode String.CompareOrdinal(): Salīdzina virknes byte pēc byte, neņemot vērā kultūras īpatnības.
  5. Metode String.CompareTo(): Instanču metode, kas salīdzina pašreizējo virkni ar citu virkni vai objektu. Tā ir līdzīga String.Compare(), bet tiek izsaukta uz virknes objekta.

Virkņu objektu atsauces netiek tieši salīdzinātas ar operatoru == vai metodi Equals() (bez lietotāja pārlādējuma) parastajā saturā. Lai gan virknes ir atsauces tipi, == operators un Equals() ir īpaši pārlādīti, lai salīdzinātu tieši saturu.

string str1 = "hello";
string str2 = "hello";
string str3 = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });

// Satura salīdzināšana
Console.WriteLine(str1 == str2);           // true (saturu salīdzina)
Console.WriteLine(str1.Equals(str2));    // true (saturu salīdzina)
Console.WriteLine(str1 == str3);           // true (saturu salīdzina)
Console.WriteLine(str1.Equals(str3));    // true (saturu salīdzina)

// Atsauču salīdzināšana (prasa skaidru pārlādi vai `ReferenceEquals` izmantošanu)
// Šajā gadījumā str1 un str2 var atsaukties uz vienu un to pašu objektu,
// virkņu interninga dēļ:
Console.WriteLine(object.ReferenceEquals(str1, str2)); // var būt true vai false, atkarīgs no JIT un CLR
Console.WriteLine(object.ReferenceEquals(str1, str3)); // lielākoties false