仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 630|回复: 11
打印 上一主题 下一主题

[学习教程] ASP.NET教程之[你必需晓得的.NET]第十回:咀嚼范例――值范例与援用范例(下)-使用征途仓酷云 ...

[复制链接]
飘灵儿 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:25:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
你所列的那些其实差不多都可以称为应用服务器(servlet应该说是一种语言更合适)net网页编程是开放的,相同的工具就会有很多公司在做,加上net网页编程已经发展了很多年了,因此这些工具就很多了。他们很多都是类似的。系列文章目次索引:《你必需晓得的.NET
本文将先容以下内容:


  • 范例的基础观点
  • 值范例深切
  • 援用范例深切
  • 值范例与援用范例的对照及使用
[下载]:[范例示例代码]
1.弁言
值范例与援用范例的话题经由了两个回合([第八回:咀嚼范例---值范例与援用范例(上)-内存有理]和[第九回:咀嚼范例---值范例与援用范例(中)-划定规矩无边])的会商和商讨,我们就基础的了解层面来讲已差未几了,可是对这一部分的进一步掌控和更深入的了解还要持续和深化,由于我本人就在两篇公布之际,我就失掉拆卸脑壳兄的不倦引导,以后又查阅了良多的材料发明范例在.NET大概说言语基本中何其主要的内在和深度,因而关于这个话题的会商还没有中断,今后我将持续分享本人的所得与所感。
不外作为一个阶段,本文将值范例和援用范例的会商从使用示例角度来进一步做以延长,能够看做是对前两回的增补性切磋。我们从范例界说、实例创立、参数传送、范例判等、渣滓接纳等几个方面来扼要的对上两回的内容做以分析,并以必定的IL言语和内存机制来讲明,希冀进一步加深我们的了解和剖析。
2.以代码分析
上面,我们以一个典范的值范例和援用范例对照的示例来分析,其区分和本色。在分析的过程当中,我们次要以实行剖析(次要是代码正文)、内存剖析(次要是图例申明)和IL剖析(次要是IL代码简析)三个方面来逐常识点剖析,最初再做以总结形貌,如许就能够有更深的了解。
2.1范例界说
界说复杂的值范例MyStruct和援用范例MyClass,在前面的示例中将渐渐完美,完全的代码能够点击下载[范例示例代码]。我们的会商如今入手下手,


  • 代码演示
//01界说值范例
publicstructMyStruct
{
privateint_myNo;

publicintMyNo
{
get{return_myNo;}
set{_myNo=value;}
}

publicMyStruct(intmyNo)
{
_myNo=myNo;
}

publicvoidShowNo()
{
Console.WriteLine(_myNo);
}

}//02界说援用范例
publicclassMyClass
{
privateint_myNo;

publicintMyNo
{
get{return_myNo;}
set{_myNo=value;}
}

publicMyClass()
{
_myNo=0;
}

publicMyClass(intmyNo)
{
_myNo=myNo;
}


publicvoidShowNo()
{
Console.WriteLine(_myNo);
}
}

  • IL剖析

<br>
剖析IL代码可知,静态办法.ctor用来暗示完成机关办法的界说,个中该段IL代码暗示将0赋给字段_myNo。
2.2创立实例、初始化及赋值
接上去,我们完成实例创立和初始化,和复杂的赋值操纵,然后在内存和IL剖析中发明实在质。


  • 代码演示

<br>
<br>创立实例、初始化及赋值
publicstaticvoidMain(string[]args)
{
//内存分派于线程的仓库上
//创立了值为等价"0"的实例
MyStructmyStruct=newMyStruct();
//在线程的仓库上创立了援用,但未指向任何实例
MyClassmyClass;
//内存分派于托管堆上
myClass=newMyClass();

//在仓库上修正成员
myStruct.MyNo=1;
//将指针指向托管堆
myClass.MyNo=2;

myStruct.ShowNo();
myClass.ShowNo();

//在仓库上新建内存,并实行成员拷贝
MyStructmyStruct2=myStruct;
//拷贝援用地点
MyClassmyClass2=myClass;

//在仓库上修正myStruct成员
myStruct.MyNo=3;
//在托管堆上修正成员
myClass.MyNo=4;

myStruct.ShowNo();
myClass.ShowNo();
myStruct2.ShowNo();
myClass2.ShowNo();
}


  • 内存实况
起首是值范例和援用范例的界说,这是统统面向对象的入手下手,

<br>
然后是初始化历程,

<br>
复杂的赋值和拷贝,是最基础的内存操纵,无妨看看,

<br>
2.3参数传送


  • 代码演示
参数传送
//04ref和out
publicclassRefAndOut
{
publicstaticvoidMain()
{
//必需举行初始化,才干利用ref体例传送
intx=10;
ValueWithRef(refx);
Console.WriteLine(x);

//利用out体例传送,不用初始化
inty;
ValueWithOut(outy);
Console.WriteLine(y);

objectoRef=newobject();
RefWithRef(refoRef);
Console.WriteLine(oRef.ToString());

objectowith;
RefWithOut(outowith);
Console.WriteLine(owith.ToString());
}
staticvoidValueWithRef(refinti)
{
i=100;
Console.WriteLine(i.ToString());
}

staticvoidValueWithOut(outinti)
{
i=200;
Console.WriteLine(i.ToString());
}

staticvoidRefWithRef(refobjecto)
{
o=newMyStruct();
Console.WriteLine(o.ToString());
}

staticvoidRefWithOut(outobjecto)
{
o=newString("a",10);
Console.WriteLine(o.ToString());
}
}
不用多说,就是一个扼要阐释,关于参数的传送作者将企图以更多的文字来在前面的系列中做以廓清和深切。
2.4范例转换
范例转换的演示,包含良多个方面,在此我们只以自界说范例转换为例来做以申明,更具体的范例转换能够参考[第九回:咀嚼范例---值范例与援用范例(中)-划定规矩无边]的[再论范例转换部分]。


  • 代码演示
起首是值范例的自界说范例转换,
publicstructMyStruct
{
//01.2自界说范例转:整形->MyStruct型
staticpublicexplicitoperatorMyStruct(intmyNo)
{
returnnewMyStruct(myNo);
}

}

然后是援用范例的自界说范例转换,
publicclassMyClass
{
//02.2自界说范例转换:MyClass->string型
staticpublicimplicitoperatorstring(MyClassmc)
{
returnmc.ToString();
}

publicoverridestringToString()
{
return_myNo.ToString();
}
}

最初,我们对自界说的范例做以测试,

publicstaticvoidMain(string[]args)
{
#region03.范例转换
MyStructMyNum;
inti=100;
MyNum=(MyStruct)i;
Console.WriteLine("整形显式转换为MyStruct型---");
Console.WriteLine(i);

MyClassMyCls=newMyClass(200);
stringstr=MyCls;
Console.WriteLine("MyClass型隐式转换为string型---");
Console.WriteLine(str);
#endregion
}
2.5范例判等
范例判等次要包含:ReferenceEquals()、Equals()虚办法和静态办法、==操纵符等方面,同时注重在值范例和援用范例判等时的分歧的地方,能够参考[第九回:咀嚼范例---值范例与援用范例(中)-划定规矩无边]的[4.再论范例判等]的简述。


  • 代码演示
//01界说值范例
publicstructMyStruct
{
//01.1值范例的范例判等
publicoverrideboolEquals(objectobj)
{
returnbase.Equals(obj);
}
}
publicclassMyClass
{
//02.1援用范例的范例判等
publicoverrideboolEquals(objectobj)
{
returnbase.Equals(obj);
}
}
publicstaticvoidMain(string[]args)
{
#region05范例判等
Console.WriteLine("范例判等---");
//05.1ReferenceEquals判等
//值范例老是前往false,经由两次装箱的myStruct不成能指向统一地点
Console.WriteLine(ReferenceEquals(myStruct,myStruct));
//统一援用范例对象,将指向一样的内存地点
Console.WriteLine(ReferenceEquals(myClass,myClass));
//RefenceEquals以为null即是null,因而前往true
Console.WriteLine(ReferenceEquals(null,null));
//05.2Equals判等
//重载的值范例判等办法,成员巨细分歧
Console.WriteLine(myStruct.Equals(myStruct2));
//重载的援用范例判等办法,指向援用不异
Console.WriteLine(myClass.Equals(myClass2));
#endregion
}
2.6渣滓接纳
起首,渣滓接纳机制,相对不是一言半语就可以交卸分明,剖析分明的。因而,本示例只是从最复杂的申明动身,对渣滓接纳机制做以复杂的剖析,目标是善始善终的交卸实例由创立到灭亡的全历程。


  • 代码演示
publicstaticvoidMain(string[]args)
{
#region06渣滓接纳的复杂阐释
//实例界说及初始化
MyClassmc1=newMyClass();
//声明但不实体化
MyClassmc2;
//拷贝援用,mc2和mc1指向统一托管地点
mc2=mc1;
//界说另外一实例,并完成初始化
MyClassmc3=newMyClass();
//援用拷贝,mc1、mc2指向了新的托管地点
//那末本来的地点成为GC接纳的对象,在
mc1=mc3;
mc2=mc3;
#endregion
}


  • 内存实况

<br>
GC实行时,会遍历一切的托管堆对象,依照必定的递回遍历算法找出一切的可达对象和不成会见对象,明显本示例中的托管堆A对象没有被任何援用会见,属于不成会见对象,将被列进实行渣滓搜集的方针。对象由newobj指令发生,到被GC接纳是一个庞大的历程,我们希冀在系列的前期对此做以深切浅出的了解。
2.7总结报告
这些示例次要从从基本的偏向动手来分析前前两回中的切磋,不求可以周全而深奥,但求可以一点而及面的睁开,手艺的魅力正在于一成不变,手艺寻求者的力图倒是从变更中追求稳定,否则我们本色太累了,我想这就是好办法,本系列但愿的就是供应一个出口,翻开一个办法。示例的具体剖析能够下载[范例示例代码],复杂的剖析但愿能带来丝丝满意。
3.结论
值范例和援用范例,要说的,要做的,另有良多。此篇只是一个阶段,更多的深切和切磋我信任还在持续,同时普遍的存眷手艺力气的发展,是每一个人应当朝上进步的空间和路途。
咀嚼范例,为使用之路启示手艺基本。
咀嚼范例,持续切磋还会更多出色。

<br>

参考文献
(USA)JeffreyRichter,AppliedMicrosoft.NETFrameworkProgramming
(USA)JacquieBarker,GrantPalmer,BeginningC#ObjectsFromConceptstoCode
广而告之
[下载]:[范例示例代码]
简单生活 该用户已被删除
沙发
发表于 2015-1-25 14:58:27 | 只看该作者
通过这次激烈的讨论,我从大家身上学到了太多,开阔了眼界,不管是支持我的还是骂我的,都感谢你们。
飘飘悠悠 该用户已被删除
板凳
发表于 2015-1-31 13:09:55 | 只看该作者
比如封装性、继承性、多态性等等,这就解决了刚才谈到的ASP的那些弱点。封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变。
第二个灵魂 该用户已被删除
地板
发表于 2015-2-5 10:09:00 | 只看该作者
我的意思是.net好用,从功能上来说比JAVA强还是很明显的。
愤怒的大鸟 该用户已被删除
5#
发表于 2015-2-11 05:30:37 | 只看该作者
可以通过在现有ASP应用程序中逐渐添加ASP.NET功能,随时增强ASP应用程序的功能。ASP.NET是一个已编译的、基于.NET的环境,可以用任何与.NET兼容的语言(包括VisualBasic.NET、C#和JScript.NET.)创作应用程序。另外,任何ASP.NET应用程序都可以使用整个.NETFramework。开发人员可以方便地获得这些技术的优点,其中包括托管的公共语言运行库环境、类型安全、继承等等。
admin 该用户已被删除
6#
发表于 2015-2-11 08:20:44 | 只看该作者
在asp.net虚拟主机的服务提供商中,目前首推的是CNNIC的其中一家域名注册机构---时代互联(www.now.net.cn),他们早在2001年微软刚推出Asp.net时就推出了对应的Asp.net虚拟主机了,经笔者的使用测试,他提供的Asp.net性能非常的稳定,版本也会定期的更新,目前他的
7#
发表于 2015-2-12 08:46:26 | 只看该作者
使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。
深爱那片海 该用户已被删除
8#
发表于 2015-2-21 07:37:29 | 只看该作者
在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数。
乐观 该用户已被删除
9#
发表于 2015-3-6 19:58:33 | 只看该作者
虽然在形式上JSP和ASP或PHP看上去很相似——都可以被内嵌在HTML代码中。但是,它的执行方式和ASP或PHP完全不同。在JSP被执行的时候,JSP文件被JSP解释器(JSPParser)转换成Servlet代码,然后Servlet代码被Java编译器编译成.class字节文件,这样就由生成的Servlet来对客户端应答。所以,JSP可以看做是Servlet的脚本语言(ScriptLanguage)版。
透明 该用户已被删除
10#
发表于 2015-3-13 07:09:33 | 只看该作者
由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA–WriteOnce,RunAnywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。
精灵巫婆 该用户已被删除
11#
发表于 2015-3-13 07:09:33 | 只看该作者
Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。
只想知道 该用户已被删除
12#
发表于 2015-3-20 16:16:38 | 只看该作者
可以看作是VC和Java的混合体吧,尽管MS自己讲C#内核中更多的象VC,但实际上我还是认为它和Java更象一些吧。首先它是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-19 12:34

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表