.Net令人纠结的Nu“.NET研究”ll

  从我们刚学.Net编程起,我们的程序不断被从天而降NullReferenceException打断。直到今天,我们仍然时常为C#的Null或者VB的Nothing困惑。什么情况下我们该返回null,如果参数是null代表什么。许多类型,有两种不同意义的空状态,一种是null,一种是其本身或其某个属性集合中没有元素,这就更容易产生误用。常听有人说,Null这个概念在编程语言中根本不应该存在。但是,从C++到Java到.Net,它从未离开过。

  最近,注意到.Net Framework在读取程序配置文件的一个小Bug。比如我在配置文件中,自定义了名为ReviewPeriod的节点:


<configuration>
<configSections>
<section name=上海徐汇企业网站设计与制作"color: #800000;">"reviewPeriod" type="WordPadTest.ReviewPeriod,WordPadTest"/>
</configSections>
<reviewPeriod>
<Periods>
<上海闵行企业网站设计与制作 style="color: #000000;">period id="1" />
<period id="2" name="d" />
<period id="3" name="m" />
</Periods>
</reviewPeriod>
</configuration>

  注意第一个period节点没有定义name属性。.Net Framework中关于程序配置处理的类都在System.Configuration命名空间下,应用很广泛,比如Asp.Net和WCF项目,还有许多第三方框架如NHibernate。下面定义三个类,分别描述自定义节点配置,自定义节点集合,自定义节点实体,这也是最普通的程序自定义配置处理方式。然后就可以遍历ConfigurationManager.GetSection("reviewPeriod") as ReviewPeriod 访问每个period对象。


namespace WordPadTest
{
class ReviewPeriod : ConfigurationSection
{
[ConfigurationProperty("Periods")]
public Periods Periods
{
get { return this["Periods"] as Periods; }
}
}

class Periods: ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
return new Period();
}

protected override object GetElementKey(ConfigurationElement element)
{
return (element as Period).Id;
}

public override ConfigurationElementCollectionType CollectionType
{
get { return ConfigurationElementCollectionType.BasicMap; }
}

protected override string ElementName
{
get { return "period"; }
}
}

public class Period:ConfigurationElement
{
[ConfigurationProperty("name")]
public上海企业网站制作 string Name
{
get { return (string)this["name"]; }
}
[ConfigurationProperty("id")]
public int Id
{
get { return (int)this["id"]; }
}
}
}

  这段程序运行没问题,意外的是在第一个period节点上,它的Name属性是什么呢,一直以来我都弄错了,可能还有许多人也弄错了。正确答案是String.Empty,而不是null。而且即使我在ConfigurationProperty加上DefaultValue=null,Name返回的依然是String.Empty。

  在我看来,null应该用于表示一种在我们预料之外的状态,包括传入的参数和返回的结果。比如一段从数据库读取记录的代码,如果执行中出现异常,则返回null,和正常执行后未找到任何匹配记录的情况截然不同。同理,对于节点的name属性未定义的情况,显然也不同于定义了name=”"的情况,返回null是合理的。而ConfigurationElement不允许string属性为null,可能有某方面的考虑,但这应该是个Bug,因为它返回值含混不清,是对string空值的误解。

  请再来看另一个例子:如果这个返回值变成了参数的情况。在实际软件中,读取XML数据源时,通常要进行架构验证,比如像下面这样:


XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.上海网站建设Add(targetNamespace, "postlist.xsd"); //targetNamespace是传入方法的参数
settings.ValidationType = ValidationType.Schema;
XmlReader reader = XmlReader.Create("postlist.xml", settings);

  这段代码有一个问题,它未判断targetNamespace的是Null还是String.Empty。对于XmlSchemaSet的Add方法,targetNamespace参数如果为null,则表示使用xsd文件中定义的命名空间,而如果传入String.Empty,XmlSchemaSet依然认为,是我们手动指定了一个空的命名空间,而这完全不是我们想要的。

  如果在xsd文件中定义了targetNamespace,我们手动指定的namespace必须与之一致,否则将抛出异常。而xsd文件中的targetNameSpace属性,你可以不加它,但加了就不允许空值。换句话说,我们传入的为String.Empty时targetNameSpace参数时,xsd中只要有targetNamespace的定义,程序必然出错。下图也是上面代码执行的结果,和传null值的情况有天壤之别。

  我们不能怪罪写Xml验证的人太马虎,微软一个内部框架中就有这个问题。归根究底,是.Net Framework对null的误用,导致了我们的误解。

  首先,ConfigurationElement类对返回值的误用,属性值该是null却返回String.Empty。

  其次,XmlSchemaSet类的Add方法有一定问题,应该提供一个重载函数,不需要传入为null的targetNamespace参数,直接用xsd文件中的对应属性。 不但方便,也减少出错的机会。当然,它正确的区分了null和empty的含义,这点还是值得称赞的。

  连.Net Framew上海企业网站设计与制作ork对null使用上都有如此的问题,我们写程序时,应该更小心翼翼,对付这个难以捉摸、令人纠结的null。

时间: 2024-10-16 17:01:27

.Net令人纠结的Nu“.NET研究”ll的相关文章

一起谈.NET技术,.Net令人纠结的Null

从我们刚学.Net编程起,我们的程序不断被从天而降NullReferenceException打断.直到今天,我们仍然时常为C#的Null或者VB的Nothing困惑.什么情况下我们该返回null,如果参数是null代表什么.许多类型,有两种不同意义的空状态,一种是null,一种是其本身或其某个属性集合中没有元素,这就更容易产生误用.常听有人说,Null这个概念在编程语言中根本不应该存在.但是,从C++到Java到.Net,它从未离开过. 最近,注意到.Net Framework在读取程序配置文

.Net令人纠结的Null

从我们刚学.Net编程起,我们的程序不断被从天而降NullReferenceException打断.直到今天,我们仍然时常为C#的Null或者VB的Nothing困惑.什么情况下我们该返回null,如果参数是null代表什么.许多类型,有两种不同意义的空状态,一种是null,一种是其本身或其某个属性集合中没有元素,这就更容易产生误用.常听有人说,Null这个概念在编程语言中根本不应该存在.但是,从C++到Java到.Net,它从未离开过. 最近,注意到.Net Framework在读取程序配置文

网络安全:一场令人纠结的持久战

本报记者 张伟报道 针对日益严重的网络安全问题,工业和信息化部部长李毅中日前表示,网络安全要标本兼治,重在治本,目前相关部门正在研究实施手机.网络实名制.对此,网络安全服务提供商的代表们发表了各自不同的看法. 靠技术还是实名制 江民新科技术有限公司策划部总经理曹凌翔向记者表示,技术的问题是永远存在的,因为操作系统和各种网络应用程序可能存在这样那样的未知漏洞,安全厂商永远不可能预知或封堵住所有的安全漏洞,从这种意义上讲,网络也永远不可能百分之百安全. "实行实名制是网络安全有效治本手段之一,在发现

这些令人纠结的百度快照你遇到过吗

  最近的百度的确有些让人捉摸不透,打着整理网络环境的旗号疯狂K站不说,快照也是千奇百怪,不仅自己的网站快照出现了很多问题,朋友的网站也是这样十分蛋疼.不过毕竟是做过几年的网站,对于百度的脾性多少有些了解,所以不会太慌张,可是新手朋友就不好说了,辛辛苦苦做的网站快照说没就没,说有又有,真的挺折磨人的,下面艺星就根据自己的经历来总结一下那些令我们蛋疼的快照,以便让大家尤其是新手朋友有个参考. 快照无缘无故的回档 昨天有一个朋友向我询问,为什么自己的网站坚持天天更新,认真做外链,但是快照却无缘无故得

这费那费收得令人纠结

本报记者 金涛 终结免费午餐, 银行收费如滚雪球 在杭州体育场路上某市级事业单位工作的80后白领史伊萍,是此次ATM机跨行取款 手续费上调的"受害者".工资卡拿的是工行牡丹灵通卡,家门口却是建行.广发银行的营业网点.所以,几乎每个月小史都要在ATM机上跨行取款.涨价后,她每月的手续费多支出了一半.小史说:"说实话,这点手续费还负担得起,但银行说涨就涨,连一声招呼都不打,终归心里有点不舒服."她还表示,自己从ATM机上取款也是为了响应银行的倡导,减少营业窗口排队压力,

浅谈案例研究的内容营销

中介交易 SEO诊断 淘宝客 云主机 技术大厅 案例研究:是对某一单独的例子或活动进行深入研究.它提供一种分析信息.报告结果的方法,以便对某一特殊的概念或理念产生更好的理解或洞察. 那样的标题,一开始是不是听起来像在深夜的电视节目里,反复播出的吸水抹布广告? 也许是的!但它完全正确. 大多数案例研究是一些干巴巴.令人厌烦的文章,里面塞满了统计数据和让人提不起精神的信息,乏味透顶,毫无生气.它们注重产品的特点,而不是人类使用那些产品的好处.它们往往充满了自吹自擂和专业的行话. 关键在于讲一个目标受

赵斌:生态学研究正进入大科学、大数据时代

说起"大科学"这个词,首先让人联想到的是火箭.天文望远镜和粒子加速器的研究,这些研究需要大量的资金支撑.而生态学研究,让人联想到的是带着样方尺的植物生态学家.拿着望远镜的鸟类生态学家.以及手持捕虫网的昆虫学家等等,很少会有人将他们的研究与大科学联系起来.其实,反过来想,这又是特别令人奇怪的!生态学家研究的地区,例如大多数陆地,是一个真正被人类占领的区域,却一直没有归为大科学的范畴.不过,在David Schimel的带领下,一大邦美国生态学家们正打算纠正这种状态.他们计划将撼动陆地生态

毕业生、待业毕业生应该做的几件事

写在前面: 在IT(IT,Information Technology,信息技术,或许有人真的忘了或不知道IT代表什么含义)这个偏向于技术的行业里,聚集着大量的信息技术爱好者.他们相当一部分是年轻的学生或者刚进入社会不久的青年."教育从娃娃抓起",这话一点也不假,而且一直是这么做的.但是很多人(其中还包括一些教育工作者)认为教育是教育者的事而与被教育者关系不大,认为教育者仅仅是传道授业解惑而忽略了他们内心的想法和变化.很多学生在中学时或者在小时候不理解老师或家长告诫自己的话或者强迫要求

医疗网站 从外链相关性谈对百度排名的影响

百度的近几次大更新影响数不尽的医疗站点,每天群里论坛讨论最多的都是你的站怎么样了,被K了吗,恢复了吗.医疗站和其他的站有些不同就是行业间的竞争大,大部分seoer都是在做医疗站点,想要自己的网站有好的排名就是要挤掉其他竞争对手的站,踩着别人的尸体前进.因此,医疗站的外链也就在一定程度上决定了这个站前景. SEO都知道"内链为皇,外链为王"这句话,而每天的工作也都围绕这内链.外链进行,其中做的最多的就是外链了.关于怎么做外链,做外链要注意哪些,这些知识在网上已经是泛滥的地步,随便百度一下