Bunu yapmak için başka bir yol daha şıktır ve bu yüzden kısa süre önce yazdığım bir şeyi paylaşacağımı düşündüm. Çok az matematik gerektiren bir yararı vardır ve bu yüzden daha az hata eğilimli olduğunu düşünüyorum. Çok okunabilir, IMHO.
[Flags][Serializable]
public enum ScopeType : int
{
Unknown = 0,
Global = 1,
Namespace = Global << 1,
Class = Namespace << 1,
Struct = Class << 1,
Interface = Struct << 1,
Enum = Interface << 1,
Function = Enum << 1,
Property = Function << 1,
PropertyGetter = Property << 1,
PropertySetter = PropertyGetter << 1,
Using = PropertySetter << 1,
If = Using << 1,
ElseIf = If << 1,
Else = ElseIf << 1,
Switch = Else << 1,
Case = Switch << 1,
For = Case << 1,
While = For << 1,
DoWhile = While << 1,
Lambda = DoWhile << 1,
Try = Lambda << 1,
Catch = Try << 1,
Finally = Catch << 1,
Initializer = Finally << 1,
Checked = Initializer << 1,
Unchecked = Checked << 1,
Unsafe = Unchecked << 1,
Lock = Unsafe << 1,
Fixed = Lock << 1,
// I can also group flags together using bitwise-OR.
PropertyAccessor = PropertyGetter | PropertySetter,
TypeDefinition = Class | Struct | Interface | Enum,
TryCatchFinally = Try | Catch | Finally,
Conditional = If | ElseIf | Else,
Branch = Conditional | Case | TryCatchFinally,
Loop = For | While | DoWhile
}
NOT: numaralandırma System.Int32
devraldığı beri, sadece 32 bayrakları tanımlayabilirsiniz. Daha fazlasına ihtiyacınız varsa, daha büyük bir tamsayı (System.Int64
) kullanmanız, birden fazla numaralandırma oluşturup bunları birleştirmeniz veya yalnızca bir grup boolean değeriyle bir sınıf oluşturmanız gerekir.
Bu 2 kod fragmanı için üretilen IL kodu aynıdır. –
Bu kodda hatayı bulun: BackupOperator = 1073714824. Hata ile ilk etapta BackupOperator = 1 << 30 –
diyebilirim. Tüm bilgi için teşekkürler, çünkü daha iyi görünüyor çünkü ilk yaklaşımını kullanacağım tüm ama en basit durumlar. – Nate