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:
- Operator
==: Virkņu literāliem un ja virknes satur vienādu saturu, operators==atgriezīstrue. Atšķirībā no citiem atsauces tipiem,==operators ir pārlādīts virkņu salīdzināšanai pēc satura, nevis atsaucēm. - 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 arnull. Ir pārlādījumi, ņemot vērā lielumu un kultūru. - 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). - Metode
String.CompareOrdinal(): Salīdzina virknes byte pēc byte, neņemot vērā kultūras īpatnības. - Metode
String.CompareTo(): Instanču metode, kas salīdzina pašreizējo virkni ar citu virkni vai objektu. Tā ir līdzīgaString.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