在C#中使用| =运算符时会发生什么?

时间:2012-12-19 18:05:17

标签: c# .net operators assignment-operator

如果我使用的是这样的话:

xr.Settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;

|=到底完成了什么?

6 个答案:

答案 0 :(得分:11)

|=是将两个值组合在一起并将结果分配给第一个变量的快捷方式。

xr.Settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;

相当于:

xr.Settings.ValidationFlags = xr.Settings.ValidationFlags | XmlSchemaValidationFlags.ReportValidationWarnings;

|是C#中的OR运算符,因此上面的代码有效地在值ReportValidationWarnings上设置了xr.Settings.ValidationFlags标记。

答案 1 :(得分:1)

在这种情况下,您在XmlSchemaValidationFlags.ReportValidationWarnings中设置ValidationFlags标记。

|=通常是按位or运算符,如果Flags它用于设置标记。

答案 2 :(得分:1)

这是布尔OR-Equals。

相当于:

xr.Settings.ValidationFlags = xr.Settings.ValidationFlags | XmlSchemaValidationFlags.ReportValidationWarnings;

确保设置XmlSchemaValidationFlags.ReportValidationWarnings中的位。

答案 3 :(得分:1)

这是复合作业。基本上你在做:

xr.Settings.ValidationFlags = 
    xr.Settings.ValidationFlags | 
    XmlSchemaValidationFlags.ReportValidationWarnings;

这实际上会将XmlSchemaValidationFlags.ReportValidationWarnings添加到xr.Settings.ValidationFlags中包含的标记集。

答案 4 :(得分:0)

正如其他人所提到的,a = = b是a = a |的简写b,与a = a + b的a = b短的方式大致相同。 现在什么是|操作员呢?它可以重载,但它的一般用法是按位OR。它类似于||运算符,但它可以逐位工作(将每个位视为布尔值):

false ||的确如此

0100 | 0110是0111

然后最后一点是,传递一堆布尔标志的经典方法之一是将它们编码为整数。单个32位整数可以容纳32个单独的标志,每位一个。要设置标志,请将相应位设置为1。

因此0000没有设置标志,而1001在第1和第4位设置了标志。

然后| =是设置特定标志的便捷方式。

int my_flags = 0;

my_flag | = validate_flag;

答案 5 :(得分:0)

driis' answer是正确的。

|=与在条件测试中使用|运算符相同,如以下示例所示:

xr.Settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings

在语义上与

相同
xr.Settings.ValidationFlags = xr.Settings.ValidationFlags | XmlSchemaValidationFlags.ReportValidationWarnings

关于|||的补充说明

我发现另一个有用的花絮是logical OR|)和conditional OR||)之间的区别:

即使第一个是true,逻辑OR也将始终对两个操作数求值。如果第一个为false,则条件OR将仅对第二个进行求值,如果不需要执行第二个操作数来确定最终结果,则有效地短路。