仓酷云
标题:
ASP.NET教程之C#锋利体验之第七讲 域与属性
[打印本页]
作者:
愤怒的大鸟
时间:
2015-1-16 22:34
标题:
ASP.NET教程之C#锋利体验之第七讲 域与属性
就安全性而言,Java已经远远低于VB.NET,更无法与安全性著称的C#相比。
域
域(Field)又称成员变量(MemberVariable),它暗示存储地位,是C#中类不成短少的一部分。域的范例能够是C#中任何数据范例。但关于撤除string范例的其他援用范例因为在初始化时触及到一些类的机关器的操纵,我们这里将不说起,我们把这一部份内容作为“类的嵌套”放在“接口承继与多态”一讲内来论述。
域分为实例域和静态域。实例域属于详细的工具,为特定的工具所专有。静态域属于类,为一切工具所共用。C#严厉划定实例域只能经由过程工具来猎取,静态域只能经由过程类来猎取。比方我们有一个范例为MyClass的工具MyObject,MyClass内的实例域instanceField(存取限定为public)只能如许猎取:MyObject.instanceField。而MyClass的静态域staticField(存取限定为public)只能如许猎取:MyClass.staticField。注重静态域不克不及像传统C++那样经由过程工具猎取,也就是说MyObject.staticField的用法是毛病的,不克不及经由过程编译器编译。
域的存取限定会合表现了面向工具编程的封装准绳。如前所述,C#中的存取限定润色符有5种,这5种对域都合用。C#只是用internal扩大了C++本来的friend润色符。在有需要使两个类的某些域相互可见时,我们将这些类的域声明为internal,然后将它们放在一个组合体内编译便可。假如必要对它们的承继子类也可见的话,声明为protectedinternal便可。实践上这也是组合体的原本意义--将逻辑相干的类组合封装在一同。
C#引进了readonly润色符来暗示只读域,const来暗示稳定常量。望文生义对只读域不克不及举行写操纵,稳定常量不克不及被修正,这二者究竟有甚么区分呢?只读域只能在初始化--声明初始化或机关器初始化--的过程当中赋值,其他中央不克不及举行对只读域的赋值操纵,不然编译器会报错。只读域能够是实例域也能够是静态域。只读域的范例能够是C#言语的任何范例。但const润色的常量必需在声明的同时赋值,并且请求编译器可以在编译时代盘算出这个断定的值。const润色的常量为静态变量,不克不及够为工具所猎取。const润色的值的范例也无限制,它只能为以下范例之一(或可以转换为以下范例的):sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,decimal,bool,string,enum范例,或援用范例。值得注重的是这里的援用范例,因为撤除string范例外,一切的范例进来null值之外在编译时代都不克不及由编译器盘算出他们切实其实切的值,以是我们可以声明为const的援用范例只能为string或值为null的其他援用范例。明显当我们声明一个null的常量时,我们已得到了声明的意义--这也能够说是C#计划的为难的地方!
这就是说,当我们必要一个const的常量时,但它的范例又限定了它不克不及在编译时代被盘算出断定的值来,我们可接纳将之声明为staticreadonly来办理。但二者之间仍是有一点渺小的不同的。看上面的两个分歧的文件:
//file1.cs//csc/t:libraryfile1.csusingSystem;namespaceMyNamespace1{publicclassMyClass1{publicstaticreadonlyintmyField=10;}}//file2.cs//csc/r:file1.dllfile2.csusingSystem;namespaceMyNamespace2{publicclassMyClass1{publicstaticvoidMain(){Console.WriteLine(MyNamespace1.MyClass1.myField);}}}
我们的两个类分属于两个文件file1.cs和file2.cs,并分隔编译。在文件file1.cs内的域myField声明为staticreadonly时,假如我们因为某种必要改动了myField的值为20,我们只需从头编译文件file1.cs为file1.dll,在实行file2.exe时我们会失掉20。但假如我们将staticreadonly改动为const后,再改动myField的初始化值时,我们必需从头编译一切援用到file1.dll的文件,不然我们援用的MyNamespace1.MyClass1.myField将不会如我们所愿而改动。这在年夜的体系开辟过程当中特别必要注重。实践上,假如我们可以了解const润色的常量是在编译时便被盘算出断定的值,并代换到援用该常量的每个中央,而readonly时在运转时才断定的量--只是在初始化后我们不但愿它的值再改动,我们便能了解C#计划者们的良苦专心,我们才干完全掌控const和readonly的举动!
域的初始化是面向工具编程中一个必要出格注重的成绩。C#编译器缺省将每个域初始化为它的默许值。复杂的说,数值范例(列举范例)的默许值为0或0.0。字符范例的默许值为x0000。布尔范例的默许值为false。援用范例的默许值为null。布局范例的默许值为其内的一切范例都取其响应的默许值。固然C#编译器为每一个范例都设置了默许范例,但作为面向工具的计划准绳,我们仍是必要对变量举行准确的初始化。实践上这也是C#保举的做法,没有对域举行初始化会招致编译器收回告诫信息。C#中对域举行初始化有两个中央--声明的同时举行初始化和在机关器内举行初始化。如前所述,域的声明初始化实践上被编译器作为赋值语句放在了机关器的外部的最入手下手处实行。实例变量初始化会被放在实例机关器内,静态变量初始化会被放在静态机关器内。假如我们声了然一个静态的变量并同时对之举行了初始化,那末编译器将为我们机关出一个静态机关器来把这个初始化语句酿成赋值语句放在内里。而作为const润色的常量域,从严厉意义上讲不克不及算作初始化语句,我们能够将它看做相似于C++中的宏代换。
属性
属性能够说是C#言语的一个立异。固然你也能够说不是。不是的缘故原由是它面前的完成实践上仍是两个函数--一个赋值函数(get),一个取值函数(set),这从它天生的两头言语代码能够明晰地看到。是的缘故原由是它的切实其实确在言语层面完成了面向工具编程一向以来对“属性”这一OO作风的类的特别接口的诉求。了解属性的计划初志是我们用好属性这一工具的基本。C#不倡始将域的回护级别设为public而利用户在类外恣意操纵--那样太不OO,大概详细点说太不平安!对一切有需要在类外可见的域,C#保举接纳属性来表达。属性不暗示存储地位,这是属性和域的基本性的区分。上面是一个典范的属性计划:
usingSystem;classMyClass{intinteger;publicintInteger{get{returninteger;}set{integer=value;}}}classTest{publicstaticvoidMain(){MyClassMyObject=newMyClass();Console.Write(MyObject.Integer);MyObject.Integer++;Console.Write(MyObject.Integer);}}
一如我们等候的那样,程序输入01。我们能够看到属性经由过程对办法的包装向程序员供应了一个友爱的域成员的存取界面。这里的value是C#的关头字,是我们举行属性操纵时的set的隐含参数,也就是我们在实行属性写操纵时的右值。
属性供应了只读(get),只写(set),读写(get和set)三种接口操纵。对域的这三种操纵,我们必需在统一个属性名下声明,而不成以将它们分别,看上面的完成:
classMyClass{privatestringname;publicstringName{get{returnname;}}publicstringName{set{name=value;}}}
下面这类分别Name属性完成的办法是毛病的!我们应当像后面的例子一样将他们放在一同。值得注重的是三种属性(只读,只写,读写)被C#以为是统一个属性名,看上面的例子:
classMyClass{protectedintnum=0;publicintNum{set{num=value;}}}classMyClassDerived:MyClass{newpublicintNum{get{returnnum;}}}classTest{publicstaticvoidMain(){MyClassDerivedMyObject=newMyClassDerived();//MyObject.Num=1;//毛病!((MyClass)MyObject).Num=1;}}
我们能够看到MyClassDerived中的属性Num-get{}屏障了MyClass中属性Num-set{}的界说。
固然属性远远不止仅仅限于域的接口操纵,属性的实质仍是办法,我们能够依据程序逻辑在属性的提取或赋值时举行某些反省,告诫等分外操纵,看上面的例子:
classMyClass{privatestringname;publicstringName{get{returnname;}set{if(value==null)name="Microsoft";elsename=value;}}}
因为属性的办法的实质,属性固然也无方法的各种润色。属性也有5种存取润色符,但属性的存取润色常常为public,不然我们也就得到了属性作为类的大众接口的意义。除办法的多参数带来的办法重载等特征属性不具有外,virtual,sealed,override,abstract等润色符对属性与办法一样的举动,但因为属性在实质上被完成为两个办法,它的某些举动必要我们注重。看上面的例子:
abstractclassA{inty;publicvirtualintX{get{return0;}}publicvirtualintY{get{returny;}set{y=value;}}publicabstractintZ{get;set;}}classB:A{intz;publicoverrideintX{get{returnbase.X+1;}}publicoverrideintY{set{base.Y=value<0?0:value;}}publicoverrideintZ{get{returnz;}set{z=value;}}}
这个例子会合地展现了属性在承继高低文中的某些典范举动。这里,类A因为笼统属性Z的存在而必需声明为abstract。子类B中经由过程base关头字来援用父类A的属性。类B中能够只经由过程Y-set便掩盖了类A中的虚属性。
静态属性和静态办法一样只能存取类的静态域变量。我们也能够像做内部办法那样,声明内部属性。
前几天同学问我学习方向的问题。有点想法,不知道对不对,怕误导同学,现在“开源一下”。注:括号内是我现在整理的时填加上的。
作者:
简单生活
时间:
2015-1-18 22:57
Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(ParentThread)来实现资源共享,这样就减轻了服务器的负担,所以,JavaServlet可以用来做大规模的应用服务。
作者:
只想知道
时间:
2015-1-23 22:29
Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(ParentThread)来实现资源共享,这样就减轻了服务器的负担,所以,JavaServlet可以用来做大规模的应用服务。
作者:
老尸
时间:
2015-2-6 22:16
HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了.
作者:
若天明
时间:
2015-2-18 22:42
HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了.
作者:
活着的死人
时间:
2015-3-6 11:18
asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源
作者:
小女巫
时间:
2015-3-13 00:09
主流网站开发语言之PHP
HP的全名非常有趣,它是一个巢状的缩写名称——“PHP:HypertextPreprocessor”,打开缩写还是缩写。PHP是一种HTML内嵌式的语言(就像上面讲的ASP那样)。而PHP独特的语法混合了C,Java,Perl以及PHP式的新语法。它可以比CGI或者Perl更快速地执行动态网页。
作者:
兰色精灵
时间:
2015-3-20 07:28
ASP.net1.1和2.0在程序上的语法也有很大不同,现在2.0属于新出来的,不知道半年后会不会有3.0(说笑一下)。Windows2003系统自动支持ASP和ASP.net环境,不用安装任何程序。Asp.net属于编译语言。ASP的最大不同(ASP属于解释语言)。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2