在 OpenXML SDK 里面对于很多值,如字符串等的值,都包含一个 HasValue 属性。刚入门的小伙伴会认为这就是一个和可空类型一样的属性,表示这个属性是不是为空。其实这句话只是对一半,其实这个属性表示的是在重新定义的字符串参数里面的属性是否为空
在 OpenXML SDK 里面给很多基础类型都是自己新定义的,如 SingleValue 和 StringValue 等,这些定义都继承 OpenXmlSimpleType 类,而在 OpenXmlSimpleType 类就存在一个让刚入行的小伙伴会错误认为这是一个可空类型的 HasValue 属性
这个属性的命名刚好和可空类型相同,而刚好在 OpenXML SDK 里面存在大量的类型都是可能为空的。例如尝试获取文本的字体大小
Int32Value fontSize = run.RunProperties.FontSize;
此时拿到了 fontSize 但是可能在 PPT 里面没有定义这个属性,也就是 fontSize 为空,此时如果没有判断就开始使用,将会在某些有趣的课件里面在这里炸掉
但是如果使用下面代码判断,将会如何?
if (fontSize.HasValue)
{
}
哈哈,贺喜你踩到了这个 API 设计的坑,此时的 Int32Value 不是可空类型,也就是其实此时的 fontSize 是空,尝试获取他的属性将会炸掉
正确的做法是使用下面代码
if (fontSize != null)
{
}
那么这个 HasValue 的意思是什么?我将 OpenXmlSimpleType 的源代码写出来大家就知道了
public virtual bool HasValue => TextValue != null;
没错,这个属性只是用来判断是否存在值,而不是判断自己本身是否是空
我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新
如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入
如有不方便在博客评论的问题,可以加我 QQ 2844808902 交流
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。