| = (Tek boru eşittir) ve & = (tek ve işareti eşittir) ne anlama gelir?


116

Aşağıdaki satırlarda:

//Folder.Attributes = FileAttributes.Directory | FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReadOnly;
Folder.Attributes |= FileAttributes.Directory | FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReadOnly;


Folder.Attributes |= ~FileAttributes.System;
Folder.Attributes &= ~FileAttributes.System;

C # ' da |=(tek boru eşittir) ve &=(tek ve işareti eşit) ne anlama gelir?
Sistem özniteliğini diğerlerini koruyarak kaldırmak istiyorum ...

Yanıtlar:


150

Bileşik atama operatörleri, çeviri yapıyorlar (çok gevşek)

x |= y;

içine

x = x | y;

ve aynısı için &. Örtük bir döküm ile ilgili birkaç durumda biraz daha fazla ayrıntı vardır ve hedef değişken yalnızca bir kez değerlendirilir, ancak temelde işin özü budur.

Bileşik olmayan operatörler açısından, &bit bazında "VE" ve bit bazında |"VEYA" dır .

DÜZENLEME: Bu durumda istersiniz Folder.Attributes &= ~FileAttributes.System. Nedenini anlamak için:

  • ~FileAttributes.System" hariç tüm öznitelikler" anlamına gelir System( ~bit düzeyinde DEĞİLDİR)
  • & "sonuç, işlenenin her iki tarafında bulunan tüm özniteliklerdir" anlamına gelir

Yani temelde bir maske görevi görüyor - yalnızca içinde görünen öznitelikleri koruyun ("Sistem hariç her şey"). Genel olarak:

  • |=hedefe yalnızca bit ekleyecektir
  • &=hedeften yalnızca bitleri kaldıracak

2
x = x | (y);bunu tarif etmenin daha iyi bir yolu çünkü x |= y + z;ile aynı şey değilx = x | y + z;
IronMensan

cevaplar için teşekkürler / ama amacım için (sistem özelliğini kaldırmak) hangisini kullanmalıyım (| = veya & =)?
SilverLight

1
@LostLord:Folder.Attributes &= ~FileAttributes.System;
George Duckett

33

a |= beşdeğerdir a = a | bo hariç asadece bir kez değerlendirilir
a &= beşdeğerdir a = a & bo hariç asadece bir kez değerlendirilir

Sistem bitini diğer bitleri değiştirmeden çıkarmak için kullanın

Folder.Attributes &= ~FileAttributes.System;

~bitsel olumsuzlamadır. Böylece, Sistem biti dışındaki tüm bitleri 1 olarak ayarlayacaksınız. andmask ile -ing 0 olarak Sistemini kurmak ve tüm diğer bitleri bırakacak bozulmadan dolayı 0 & x = 0ve 1 & x = xherhangix


1
aSadece bir kez değerlendirilmesinin anlamı nedir ? Neden bundan daha fazla kez değerlendirilsin?
silkfire

@silkfire Buna kısa devre değerlendirmesi denir, bkz. en.wikipedia.org/wiki/Short-circuit_evaluation
Polluks

@Polluks Yani temelde a |= baslında demek a = a || b?
silkfire

@silkfire Evet ama bir boruyu ve iki boruyu birbiriyle değiştirmeyin.
Polluks

3

Diğerlerini koruyarak sistem özniteliğini kaldırmak istiyorum ..

Bunu şu şekilde yapabilirsiniz:

Folder.Attributes ^= FileAttributes.System;

1
Sanırım bunun için AND yerine XOR kullanmak istiyorsunuz.
GameZelda

biraz kafası karışmış / ~ gerekli ya da değil
SilverLight

@LostLord Bildiğim kadarıyla bu iki yöntem benzer
Chris S

@ChrisS ^= bit, önceden ayarlanmamışsa biti ayarlayacaktır, &= ~bitayarlamaz.
Chronicle

kesinlikle bir xor kullanmak istemezsiniz. Gitmiş olsaydı bu onu geri koyardı.
John Lord
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.