ASP.NET使用动态编写翻译技术,本质上的荒唐

System.NullReferenceException:未将指标引用设置到指标的实例,那是2个新鸟,中鸟,老鸟都避不开的失实。

上面基础的解释一下那错误:
1:本质上的错误:

ASP.NET使用动态编写翻译技术,在运作时动态将一如既往目录的*.aspx文件先生成*.cs,然后调用CompilerServices将其编写翻译成assemblies(能够到你的%SYSTEMROOT%/Microsoft.NET/Framework/V1.x.xxxx/Temporary
ASP.NET
Files下边看看)。由此精通ASP.NET编写翻译的长河是优化ASP.NET运转效用的重中之重之一。以常用的数据绑定语法为例,大家可以发现它的转折规则是:

 

复制代码 代码如下:

.aspx: 

下边基础的解释一下这错误:

object a;//a是Null对象
protected void Page_Load(object sender, EventArgs e)
{
a.ToString();//调用一个Null对象的法门
}

->

 

当然啦!结果就像是下图了:

.cs: System.Convert.ToString(data-binding
expression
);

1:本质上的一无是处:

公海赌船网址 1

中间data-binding expression是纹丝不动复制过来的,那样您写多少绑定表明式的时候就内心有谱了吧。关于常见于数据绑定表明式中的Container、DataItem、DataBinder.伊娃l是这样:DataBinder是System.Web里面包车型客车3个静态类,它提供了伊娃l方法用于简化数据绑定表达式的编排,可是它接纳的点子是透过Reflection等开支比较大的主意来完毕易用性,由此其性质并不是最好的。而Container则根本不是其他二个静态的对象或措施,它是ASP.NET页面编写翻译器在多少绑定事件处理程序内部宣称的局地变量,其品种是足以举办数量绑定的控件的数据容器类型(如在Repeater内部的数量绑定容器叫RepeaterItem),在那些器皿类中着力都有DataItem属性,由此你可以写Container.DataItem,那几个天性再次来到的是您正在被绑定的数据源中的这些数据项。假诺你的数据源是DataTable,则这些数目项的品类实际是DataRowView。

 

那般赤裸裸的写出那种代码,不太简单,常常更赞成于上面一种:

现今您能够考虑下边哪个种类写法功效最高(以Repeater+DataTable数据源为例):

object a;//a是Null对象
protected void Page_Load(object sender, EventArgs e)
{
    a.ToString();//调用三个Null对象的措施
}

2:平日性的错误:

  1. <@%
    DataBinder.Eval(Container.DataItem, “ColumnName”) %>
  2. <@%
    DataBinder.Eval(Container.DataItem, “ColumnName”, null) %>
  3. <@%
    DataBinder.Eval(Container, “DataItem.ColumnName”, null) %>
  4. <@%
    ((DataRowView)Container.DataItem)[“ColumnName”] %>
  5. <@%
    ((DataRowView)Container.DataItem).Row[“ColumnName”] %>

 

演示1:八个过滤有个别字符的函数:

NOTE:
后两种用法要求引入System.Data名称空间……答案一天后公布,欢迎有空的恋人自身测试得出结论!公海赌船网址 2

理所当然啦!结果就如下图了:

复制代码 代码如下:

 

 

public static string FilterValue(string value)
{
string[] filterChar = new string[] { “\'”, “,”, “>”, “<“,
“=”, “;”, “\””, “–” };
for (int i = 0; i < filterChar.Length; i++)
{
value = value.Replace(filterChar[i], “”);
}
return value.Trim(‘ ‘);
}


公海赌船网址 3

这么些函数比如不难看的出:假诺value传进来为Null的时候,就等于Null.Replace被调用,就应运而生了下边的不当。
据此,平常的,在函数的首行,都会对value实行:if(!string.IsNullOrEmpty(value))
一下。

公布+简要分析:

 

以身作则2:再举一下通用性的调用错误,绑定,伊娃l(“字段”)
,那个主意相比广泛,有个别境况要转字符串比较,这里示例一下:

 

诸如此类赤裸裸的写出那种代码,不太简单,日常更倾向于上边一种:

<%# Eval(“字段”).ToString()==”1″?”Yes”:”No” %>

乍一看1-3都以利用DataBinder.伊娃l方法来拓展数据绑定总结,而4-5是选择strong
type直接获取数据绑定的值。依据本人从前的演绎,很多情侣会以为4-5都会比1-3快,而实际第6种用法也是在网上很普遍的一种针对DataBinder.伊娃l而展开的“优化”。

 

当伊娃l(“字段”)为Null时,多个Null.ToString(),必然也会师世下面的荒谬,那怎么样景况出现?
1:字段的值为Null
2:空数据行,就是你表一行数据都没有,全是Null。
复制代码

实在依据大家的测试,第肆种写法的功能在好几很宽泛的事态下(即传入的字段名与数据表内部的字段名大小写有出入时)照旧没有最广泛的第贰种写法。可是原理仍旧对的,就是制止通过reflection或接近机制(如System.ComponentModel中的PropertyDescriptor机制)得到多少,但是使用DataRowView的indexer的功能在字段数量较多导致Hashtable发生寻址争持时不如使用其Row属性(DataRow类型)的indexer的频率。原因是DataRowView的indexer完毕了view的意义,而这些意义对于超过3/6运用在那么些地方都以不须求的,且它的开发甚至比DataBinder.Eval还要大!(本段内容过于武断,在被反复质问之下我又做了好多考试寻得科学原因)由此简单的选取第⑥种写法日常是足以博得较佳的质量的,而最为不用在不需要的时候平昔运用DataRowView的indexer。

2:平日性的谬误:

就此预防性的写法是:
<%# Convert.ToString(Eval(“字段”))==”1″?”Yes”:”No” %

于今重临1-3的议论。首先一点,请大家注意看伊娃l方法的三种overload:

 

好了,看到本文的无论是懂的照旧不懂的,现在都应该懂了,假设您非要说您不懂,作者得赞赏你智慧高,下边有灵性介绍,别放过。

object DataBinder.Eval(object container, string expression)
string DataBinder.Eval(object container, string expression, string format)

演示1:1个过滤有个别字符的函数:

来看那尤其:就是二个Null的对象调用了点子(属性或其余成员)变成Null.XXX引发的。

在意到ASP.NET在扭转的.cs文件中是应用System.Convert.ToString来将伊娃l的结果转换到string的,因而显式的提供值为null或String.Empty的format参数将使得伊娃l首先调用第贰种办法获得绑定结果的对象,然后直接调用该指标的ToString()方法将其回到到Convert.ToString方法,对于该方法编写翻译器已经在编写翻译期将其一而再到Convert.ToString(string)的重载上,而该办法则一向回到传入的字串。那假使直接使用第叁种艺术吗?即便第二种情势是先调用第壹种方式的,然而由于它的重回值是object类型,编写翻译器将为其接纳Convert.ToString(object)的重载,在那么些重载方法少校举香港行政局地外加的判定以将对象转换为string类型,而这几个额外判断明显带来了额外的支付——即便基本上算不得主要冲突。

 

当然啦,现身那种越发的光景,那只是万万千,数也数不完,但本质是同等的。

有关说第壹种写法,由于在expression参数中多引入了一层直接,因而要求多展开三遍反射以解析表达式,因而效能尤其之低。

        public static string FilterValue(string value)
        {
            string[] filterChar = new string[] { “\'”, “,”, “>”, “<“, “=”, “;”, “\公海赌船网址,””, “–” };
            for (int i = 0; i < filterChar.Length; i++)
            {
                value = value.Replace(filterChar[i], “”);
            }
            return value.Trim(‘ ‘);
        }

个人观点认为,在两只鸟中产生此错误的缘由各分歧,基本如下:

那那里再卖个难点,请猜测第陆种办法是还是不是还足以越发优化?(作者是指在最普遍的ASP.NET开发情状中):P

 

复制代码 代码如下:

透过地点的解析,大家得以博得下边包车型地铁定论:

以此函数比如简单看的出:假诺value传进来为Null的时候,就相当于Null.Replace被调用,就应运而生了上边的荒谬。

新鸟:不晓得那个错误,或见那错误的次数太少,所以代码基本防都不防,模仿式,多量的函数都掩藏那种张冠李戴刺客。

  1. DataBinder.伊娃l是最常用也相比易用的数码绑定表明式写法,但鉴于其促成机制使用了反光,所以须求关爱其所带来的习性损失。平常,当使用开发进入稳定期后得以针对的对那个表明式进行优化。
  2. 可是优化不是光从字面上就能感到到的,第⑥种所谓优化各处可知,然则在少数景况下它反而拉动其余环节的开销,带来相比较低的实践效能。
  3. 要留心格局重载是一种编写翻译期机制,通过显式告诉编写翻译器须要采纳的主意重载,日常能够在收获相同结果的前提下取得更佳的习性。
  4. 属性虽主要,成效价更高——在一般的品类支出中,照旧第3关注功用的贯彻,然后再通超过实际际测试有针对性的优化比较优异的属性瓶颈。

故而,常常的,在函数的首行,都会对value举行:if(!string.IsNullOrEmpty(value))
一下。

私家估量:新鸟写的代码,都不加判断的由来也许:
那些:是他俩不知那种场所,刚上学,经验不足,未有处理那种卓殊的经历。
其二:推测是他们高调的以为:多3个Null的判定,会使得品质下跌,他们追求高品质,因而,基本上,不加。

 

中鸟:知道那个错误,只是考虑的不多,心不够细,人不够稳,写代码基本会加,但周边不加。

演示2:再举一下通用性的调用错误,绑定,伊娃l(“字段”)
,那么些艺术相比较普遍,某个情状要转字符串相比,那里示例一下:

中鸟比新鸟吃的虫,肯定多,所以出现那种状态,原因自然不同了啊。
民用估算:中鸟写的代码,出现Null引用的原由想必是:

 

复制代码 代码如下:

<%# Eval(“字段”).ToString()==”1″?”Yes”:”No” %>

这么些:没有养成思维习惯,在加班的压力下,写个函数都是刷刷的就出来了,偶尔会加,普遍不加,加依然不加,等张冠李戴出来了再加。

 

那多少个:中鸟那时期处于高品质研究开发性时代,最欢娱的和别人商讨质量难题,尤其是当for的次数高达百万级别时,当品质从0.03秒降低到0.01秒时,会为全体提升3倍的本性而欢乎,并以为那是七个重量级的意识,然后推荐推荐给后来者,并BS一些不这么写的新手或同级的鸟。
同理:2个函数加二个null判断,得上涨到百万次的调用级别的可观考虑,如若那判断被调用百万次,那质量不是大大的损失?
如果加2个判断,那就是2*百万次的调用,那就是十分的大的习性损失,那怎么基本上能用的吗?
据此,能不加就不加,加不加,等漏洞非常多出来了再加。
其三:太懒了,那么些自家是如此驾驭的说:
大伙儿都了解,中鸟写代码,基本都属于面向对象型的了,那就是时刻和指标搞在一块的了,每一种对象都要搞来搞去,再多的精也伤不起!
可以吗,二个函数字传送一个参数,给您加叁个断定,代码也不多,不算大括号就两行。
可是中鸟基本上写的函数的参数,偏偏三四五六七八玖11个,这下令人纠结了:
加吧,一想,工作量太大了,而且那品质感到不高;
不加吧,好像也没怎么难点,这么一想啊,日前阔然开朗,好,加不加,错误出来了再加。
再有的,不仅是参数的论断要折腾,函数内部发生的靶子,也要搞一搞,太多指标要考虑。
光靠精力与考虑,加点人之常情,所以大多数情景是爆发在:加不加,错误出来了再加!

当伊娃l(“字段”)为Null时,三个Null.ToString(),必然也会油然则生下边包车型地铁一无所长,那什么意况出现?

老鸟:对那错误太熟练,心也够细,写代码潜意识会主动加防,但百密一疏,该来的依旧会来,躲过初中一年级,躲可是十五。

1:字段的值为Null

老鸟吃的虫就更加多了,而且老鸟们身经百战之后,觉得系统稳定,才是幸福。
个体估量:老鸟写的代码,现身Null引用的案由恐怕是:

2:空数据行,便是你表一行数据都未曾,全是Null。

复制代码 代码如下:

 

其一:代码写多了,基本上都靠潜意识反应,正是说潜能发挥了,再白点正是习惯性思维。
由此基本上都不会怎么犯那错误,然而光靠潜意识,基本都能挡住,基本之外的,还得靠正常思维。
老鸟平时生气不太好,偶尔会走神,一走神,就漏了3个,再一走神,又漏了三个,再一走神,被神招唤了,太平间多了一个人客人。
由此笔者写代码,尽量不走神,免的被招唤,但神迹也会漏。
其二:是假老鸟,老鸟是装的,其实照旧中鸟,硬要装,但是会装,表明智商高。
社会的原理注解,生存的越好的,装的程度越高,越会装,生活就越好,装到最高境界,那就是装外甥。
外甥是一名历史人物:会三十六计,装孙子的辨证智商真的很高,没里相对没有鄙视之意,因为三十六计有时候笔者也在学,只是智力商数一直上不去,所以境界一贯上不去。

由此预防性的写法是:

上边再补充一下,个人对中年老年鸟的看法,以下意见仅为小编扮演的村办的臆想观点,和我本身非亲非故:

<%# Convert.ToString(Eval(“字段”))==”1″?”Yes”:”No” %

中鸟何以追求品质?

 

复制代码 代码如下:

好了,看到本文的甭管懂的依旧不懂的,今后都应有懂了,倘诺您非要说您不懂,作者得表彰你智慧高,下边有智慧介绍,别放过。

臆测:因为她俩平凡只触及到系统的一部分,缺乏任何系统系统的打听,所以她们盼望在她们承担的那多少个区域里,写出质量最佳的代码,那能说有错吗?
正确,而且理论上就相应这么干!不过,稳定不足,假使能写出又安静又高质量的代码,有多好呢!

 

要害还是讲老鸟:老鸟何以不太关切质量,而求平安?

见状那尤其:正是一个Null的指标调用了办法(属性或任何成员)变成Null.XXX引发的。

实际上,老鸟并不是不珍爱质量,而是她关怀的是:

 

一:稳定,那些很重点:

本来啦,现身那种特别的气象,那只是万万千,数也数不完,但真相是一律的。

复制代码 代码如下:

 

因为系统一上线:
率先:得对老总负责啊,你便是否?
接下来:假如那个产品是要给客户演示的,那得对客户承担啊,你身为不是?
再者:借使这几个产品要上线运行,这得对访客负责啊,你身为不是?
故此,不管您系统怎么样,首先,有限支撑平稳,至少给总老板或客户或访客演示或操作的时候,你无法出错,至于慢点极快点,那么些好协商,好协商。

个人观点认为,在多只鸟中发生此错误的案由各区别,基本如下:

二:全部品质大于局地质量

 

复制代码 代码如下:

新鸟:不明了那一个颠倒是非,或见那错误的次数太少,所以代码基本防都不防,模仿式,多量的函数都躲藏那种不当杀手。

I:那些就很显明了,你1个算法写的很好,可是别的选手数据库写的差,一做客,不快,那怎么说的过去。
II:所以要保险总体访问品质大概先,然后再展开一些优化,那多符合中国人眼下的优化思维啊。
III:再说了,各样人有些品质都最大化了,一访问,依旧慢,找不到着优化的地点,那只是要出事的:主任得流血买硬件了。
IV:还有,全部上加了缓存+静态化html后,你会发觉,局域的最大优化代码,基本都派不上用场了,因为间接正是造访+重返,
有关你那最大化品质的逻辑代码,那是千年走三遍了。

 

当然了,个人对此意见是很负责的,相对没有其他轻视局部质量最大化的趣味,相反还得鼓励我们局地性能最大化,努力写出最优代码:

个体估摸:新鸟写的代码,都不加判断的原由恐怕:

复制代码 代码如下:

本条:是他俩不知这种情景,刚上学,经验不足,未有处理那种卓殊的经验。

一来:这是各样码农往上走必经的级差,跳过不是件善事。
二来:多让业主出下血,能够抵消下职员和工人不满的情绪:你让自家加班加点,笔者就让你出血,多好吧。

其二:估量是她们高调的以为:多二个Null的论断,会使得性能下降,他们追求高品质,因而,基本上,不加。

重庆大学表明:
本篇文章绝大部分见解为我扮演的个人的估计观点,和本身无关,本身认为,以上意见有点片面,大概与客观事实不符。
请各位看客看在小礼拜的份上,少一份偏激,多一份感动,开X吧!

 

本摄像到此截至,欢迎收看,下次再会,多谢!

 

PS:近日顺道折腾了下 CYQ.Data V4.5离线扶助文书档案,一点也不慢发表,敬请关怀。

中鸟:知道那些破绽百出,只是考虑的不多,心不够细,人不够稳,写代码基本会加,但广大不加。

你只怕感兴趣的篇章:

 

中鸟比新鸟吃的虫,肯定多,所以出现那种意况,原因当然不同了啦。

村办猜想:中鸟写的代码,出现Null引用的来由也许是:

 

本条:没有养成思维习惯,在加班加点的下压力下,写个函数都以刷刷的就出去了,偶尔会加,普遍不加,加仍然不加,等悖谬出来了再加。

那些:中鸟那年代处于高质量研究开发性时代,最欣赏的和别人谈论质量难点,尤其是当for的次数达到百万级别时,当质量从0.03秒降低到0.01秒时,会为一体提升3倍的属性而欢乎,并认为那是1个重量级的觉察,然后推荐推荐给后来者,并BS一些不那样写的新手或同级的鸟。

 

同理:3个函数加三个null判断,得上涨到百万次的调用级其余冲天考虑,借使这判断被调用百万次,那质量不是大大的损失?

如果加2个判断,那就是2*百万次的调用,那即是非常的大的性格损失,那怎么还行的吧?

于是,能不加就不加,加不加,等不当出来了再加。

 

其三:太懒了,这些自家是那样清楚的说:

我们都了然,中鸟写代码,基本都属于面向对象型的了,那正是时刻和对象搞在一块的了,每种对象都要搞来搞去,再多的精也伤不起!

好吧,1个函数字传送3个参数,给您加3个论断,代码也不多,不算大括号就两行。

不过中鸟基本上写的函数的参数,偏偏三四五六七八九十五个,那下令人纠结了:

加吧,一想,工作量太大了,而且那品质感到不高;

不加吧,好像也没怎么难题,这么一想啊,日前阔然开朗,好,加不加,错误出来了再加。

 

再有的,不仅是参数的论断要折腾,函数内部产生的对象,也要搞一搞,太多指标要考虑。

 

光靠精力与考虑,加点人之常情,所以一大半意况是发出在:加不加,错误出来了再加!

 

 

老鸟:对这错误太熟练,心也够细,写代码潜意识会主动加防,但百密一疏,该来的依旧会来,躲过初中一年级,躲不过十五。

 

老鸟吃的虫就更加多了,而且老鸟们身经百战之后,觉得系统稳定,才是美满。

个人猜想:老鸟写的代码,出现Null引用的原委只怕是:

 

以此:代码写多了,基本上都靠潜意识反应,正是说潜能发挥了,再白点正是习惯性思维。

就此基本上都不会怎么犯那错误,可是光靠潜意识,基本都能挡住,基本之外的,还得靠平常思维。

老鸟日常生气不太好,偶尔会走神,一走神,就漏了三个,再一走神,又漏了七个,再一走神,被神招唤了,太平间多了壹位客人。

所以笔者写代码,尽量不走神,免的被招唤,但偶尔也会漏。

其二:是假老鸟,老鸟是装的,其实依然中鸟,硬要装,然而会装,表明智力商数高。

社会的原理表明,生存的越好的,装的水平越高,越会装,生活就越好,装到最高境界,那就是装儿子。

孙子是一名历史人物:会三十六计,装儿子的印证智力商数真的很高,没里相对没有鄙视之意,因为三十六计有时候作者也在学,只是智力商数从来上不去,所以境界平素上不去。

 

上边再补充一下,个人对中老鸟的眼光,以下意见仅为笔者扮演的民用的估算观点,和作者自个儿无关:

 

中鸟何以追求品质?

 

臆测:因为他俩一般只触及到系统的一有的,缺乏任何系统系统的垂询,所以他们期待在她们负责的那几个区域里,写出品质最佳的代码,那能说有错吗?

是的,而且理论上就相应如此干!可是,稳定不足,如若能写出又安静又高品质的代码,有多好啊!

 

 

重庆大学照旧讲老鸟:老鸟何以不太关切质量,而求稳定?

 

实质上,老鸟并不是不关心性能,而是她关切的是:

 

一:稳定,那个很重点:

 

因为系统一上线:

首先:得对老总负责啊,你身为不是?

下一场:假设那几个产品是要给客户演示的,这得对客户负责啊,你便是或不是?

再者:假设这一个产品要上线运营,那得对访客负责啊,你正是或不是?

故而,不管你系统怎么着,首先,保障平稳,至少给老董娘或客户或访客演示或操作的时候,你不可能出错,至于慢点相当的慢点,那几个好协商,好研究。

 

 

二:整体品质大于局地质量

 

I:那几个就很分明了,你1个算法写的很好,然则其它选手数据库写的差,一造访,一点也不快,那怎么说的千古。

II:所以要保管总体访问品质大致先,然后再开始展览一些优化,那多符合中华人民共和国人近年来的优化思维啊。

III:再说了,每个人某天性能都最大化了,一造访,如故慢,找不到着优化的地点,那可是要出事的:CEO得流血买硬件了。

IV:还有,全部上加了缓存+静态化html后,你会意识,局域的最大优化代码,基本都派不上用场了,因为直接正是访问+再次来到,

有关你那最大化品质的逻辑代码,这是千年走一遍了。

 

理所当然了,个人对此意见是很负责的,相对没有任何轻视局地品质最大化的情趣,相反还得鼓励大家局地质量最大化,努力写出最优代码:

 

一来:那是每种码农往上走必经的等级,跳过不是件善事。

二来:多让业主出下血,能够抵消下职员和工人不满的心绪:你让我加班加点,我就让你出血,多可以吗。

 

重视表明:

本篇作品绝大部分见解为小编扮演的私有的推测观点,和自家非亲非故,自己认为,以上意见有点片面,大概与客观事实不符。

请各位看客看在周末的份上,少一份偏激,多一份感动,开X吧! 

 

本录制到此停止,欢迎收看,下次再会,谢谢!

 

PS:方今顺道折腾了下 CYQ.Data
V4.5离线援救文书档案,相当的慢发表,敬请关怀。

 

相关文章