关于这两行代码如何工作的问题

时间:2010-01-28 21:56:45

标签: c# active-directory

我正在阅读有关如何通过C#使用AD的this文章。在文章的中间部分,会出现以下代码。

用户帐户属性是复选框。有没有人知道下面的代码行将返回一个选中的复选框?如果选中多个复选框,该怎么办?我以为回归的布尔会更直观吗?

//Add this to the create account method

int val = (int)newUser.Properties["userAccountControl"].Value; 
 //newUser is DirectoryEntry object

为什么我们做逻辑或以下?它是如何在int和第二个值之间起作用的(是一个字节?)

 newUser.Properties["userAccountControl"].Value = val | 0x80000; 
//ADS_UF_TRUSTED_FOR_DELEGATION

我知道这听起来很天真...

由于

3 个答案:

答案 0 :(得分:1)

userAccountControl属性包含一个双字节值,其中每个位具有重要意义。如果该位打开,则使用某个选项 - 如果它未打开,则该选项不存在。

这比拥有大量布尔值更紧凑,空间更优化。此外,许多“较旧的”Win16和Win32 API只是这样工作。

按位“AND”运算符用于检查是否存在这样的单个位:

if(newUser.Properties [“userAccountControl”]。Value& 0x400 == 0x400)

在这种情况下,设置0x​​400位。

为了实际设置一个位,使用按位“OR”运算符:

newUser.Properties [“userAccountControl”]。Value = val |为0x800

这将设置“0x800”位。

这是基本的逐位布尔逻辑,真的。确实有点混乱 - 但.NET有一些帮助使事情变得更容易(例如,查看BitArray数据类型)

答案 1 :(得分:0)

userAccountControl是一个标志字段,这就是他们将它放入int的原因。

有关详细信息,请参阅http://support.microsoft.com/kb/305144

答案 2 :(得分:0)

根据您提供的信息,我猜他们正在使用标志类型系统来指示所选项目。每个选项都有一个特定的值,它们会相加,以便您可以返回选中的内容。

这可以通过逻辑证明,也可以用于查看是否包含特定值。