有时我想知道某些API更改的原因.由于谷歌没有帮助我解决这个问题,也许StackOverflow可以.为什么Microsoft选择删除GetAttribute
XML元素上的辅助方法?在System.Xml
世界上有XmlElement.GetAttribute("x")
类似于getAttribute
之前的MSXML,它们都会在缺失时返回属性值或空字符串.随着XElement
有SetAttributeValue
,但GetAttributeValue
没有实现.
当然,修改逻辑来测试和使用XElement.Attribute("x").Value
属性并不是太多的工作,但它不是那么方便,并且提供实用功能的一种方式(SetAttributeValue
)而不是另一种似乎很奇怪.有没有人知道决定背后的原因,以便我可以轻松地休息,也许从中学到一些东西?
Microsoft有一篇通用知识库文章(Q316748),描述了如何使用该DirectoryEntry
对象对Active Directory进行身份验证.在他们的示例中,他们通过将域名和用户名连接到标准NetBIOS格式("domain\username")并将其作为参数传递给目录条目构造函数来生成用户名值:
string domainAndUsername = domain + @"\" + username;
DirectoryEntry entry = new DirectoryEntry(_path, domainAndUsername, pwd);
Run Code Online (Sandbox Code Playgroud)
它最近引起了我们的注意,用户名的域名部分被完全忽略,在多个环境中我已经确认了这种行为.实际上正在使用用户名和密码,因为身份验证在无效时失败,但可以为域名和身份验证传递提供任意值.我一眼就认为这种格式适用于基于WinNT的目录访问,但LDAP的域部分被忽略.
谷歌检查显示许多LDAP示例将"域\用户名"值传递给DirectoryEntry
对象,所以我要么在我的配置中弄乱了一些东西,或者很多人对KB文章感到困惑.任何人都可以确认这是预期的行为或建议一种方法来接受"域\用户名"值并与他们对Active Directory进行身份验证?
谢谢,
首先,我知道这个问题可以通过一个简单的响应回答,即空字符串不是空值.此外,我最近才通过另一个stackoverflow问题在今年早些时候发现了演员操作员,并且没有很多经验.即使如此,当与空合并运算符结合使用时,这些转换运算符并不完全那么简单的原因被称为处理LINQ表达式中缺少元素或属性等错误条件的优雅解决方案.我开始使用由ScottH中描述的方法"提高LINQ代码味道......",并通过ScottGu "空合并运算符(和使用它与LINQ)",以此来防范无效/缺失数据以简洁和半优雅时尚.从我可以收集的内容看来,似乎是将所有转换重载放在LINQ类中的动机之一.
因此,在我看来,处理缺失值的用例与处理空值并不完全不同,在链接文章中,这种方法被认为是处理这种情况的好方法.
场景:
int length = (int?)elem.Attribute("Length") ?? 0;
Run Code Online (Sandbox Code Playgroud)
如果缺少@Length属性,则强制转换为空值并且?运算符返回0;
如果@Length属性存在但是为空,则转换内部在int.tryparse上分支并抛出格式异常.当然对于我的用法,我希望它不会,并且只会返回null,所以我可以继续在我已经有些复杂的LINQ代码中使用这种方法.
最终,我不能提出一个解决方案,但更多的是我有兴趣听到是否有一个我错过的明显方法,或者是否有人对错失价值情景为何具有良好前景解决但空值的情况并非如此.
编辑
似乎有一些关键点我应该尝试并强调:
链接的文章来自MS工作人员,我很钦佩并寻求指导.这些文章似乎提出(或至少引起注意)处理可选值的改进/替代方法
在我的例子中,可选值有时以缺少元素或属性的形式出现,但也以空元素或值的形式出现
所描述的方法对于缺失值起到预期的作用,但对于空值失败
遵循所描述的方法的代码似乎是在防止缺少可选值,但实际上是脆弱的并且在特定情况下中断.事实上,当你仍处于危险之中时,这就是保护的外观
如果目标元素存在但是为空,则可以通过声明两个链接的示例都因运行时异常而失败来突出显示
最后,似乎关键的问题是,当您签订合同(可能通过架构)时,所描述的方法非常有效,这可以确保元素或属性永远不会为空,但如果该合同不存在,则此方法无效,需要替代品