3.一步一步学c#(三):对象和类型
类和结构
类和结构实际上都是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法,。
结构与类的区别是它们在内存中的存储方式,访问方式(类是存储在堆(heap)上的引用类型),而结构是存储在栈(stack)上的值类型)和他们的一些特征(如结构不支持继承)。结构与类非常相似,主要的区别是使用关键字struct代替class来声明结构。
对于类和结构,都使用关键字new来声明实例:这个关键字创建对象并对其进行初始化。
类和结构的字段值都默认0:
类中的数据和函数称为类的成员。
数据成员:数据成员是包含类的数据——字段,常量和事件的成员。数据成员可以是静态数据。
字段是与类相关的变量。
常量与类的关联方式同变量与类的关联方式。const关键字声明常量,假如把它声明为public,就可以在类的外部访问他:
函数成员
函数成员提供了操作类中数据的某些功能,包括方法,属性,构造函数和终结器(finalizer),运算以及索引器。
方法
正式的c#术语分函数和方法。
方法的声明
表示矩形的.NET基类System.Drawing.Rectangle.
如果方法有返回值时,return语句就必须与返回值一起使用。如果方法没有返回值时,就把返回类型指定为void,因为不能省略返回类型。
方法可以包含任意多条return语句
调用方法。
MathTest说明了类的定义和实例化,方法的定义和调用的语法,除了包含main()方法的类之外,还定义了Math Test.
从代码中看出,MathTest类包含一个字段和一个方法,该字段包含一个数字,该方法计算该数字的平方,类还包括两个静态方法,一个返回pi的值,另一个计算作为参数传入的数字的平方。
下面的例子parameterTest.cs说明了如果把数组或其他引用类型(如类)传递给方法,对应的方法就会使用该引用改变这个数组中的值,而新值会反射在原始数组对象上:
注意,i的值保持不变,而在ints中改变的值在原始数组中也改变了。
out参数
编译器使用out关键字来初始化,在方法的输入参数前面加上out前缀时,传递给该方法的变量可以不初始化,该变量通过引用传递,所以在被用的方法中返回时,对该方法对该变量进行的任何改变都会保留下来,在调用该方法是,还需要out关键字,与在定义该方法时一样:
命名参数,命名参数允许按任意顺序传递,方法如下:
假如方法有几个参数,就可以在同一个调用中混合使用位置和命名参数。
可选参数,参数也可以是可选的,可选参数还必须是方法定义的最后一个参数:
要想此方法正常工作,必须在最后定义optionalNumber参数。
方法的重载。为了方法的重载,值需声明同名单参数个数或参数类型不同的方法即可:
假如不能使用可选参数,就可以使用方法重载来达到此目的:
两种方法不能仅在返回类型上有区别。两个方法不能仅根据参数是声明为ref还是out来区分。
属性
它是一个方法或一对方法,在客户代码看来,它(们)是一个字段。
c#中定义属性,可以使用下面的语法:
构造函数
声明基本构造函数的语法就是声明一个与类同名的方法,但该方法没有返回类型;
构造函数的重载循环与其他方法相同的规则。
带参数的构造函数,编译器不会自动提供默认的构造函数。
}
}
把构造函数定义为private或protectcd这样不相关的类不能访问他们:
在mynumber中编写一个共有静态属性或方法已实例化该类。两种有用的情况:类仅用作某些静态成员或属性的容器,因此永远不会实例化它。希望类仅通过调用某个静态成员函数来实例化。
静态构造函数
编写静态构造函数的原因,类有一些静态字段或属性,需要在第一次使用类之前,从外部源中初始化这些静态字段或属性。注意,静态构造函数没有方法修饰符,静态构造函数不带任何参数,一个类也只能有一个静态构造函数。
上面的例子说明静态构造函数的用法。为了使用colour结构,需要引用system.drawing.dll程序集,且必须为system.drawing名称空间加上一条using语句;
using system;
using system .Drawing;
用下面的代码测试静态构造函数:
运行代码,得到以下结果:
匿名类型
var关键字,它用于表示隐式类型化的变量。var与new一起使用时,可以创建匿名类型,匿名类型只是一个继承自object且没有名称的类。
假如需要一个对象包含某个人的姓氏,中间名和名字,则声明如下:
结构
为结构定义函数与为类定义函数完全相同,以下代码说明了结构的构造函数和属性:
}
}
结构是值类型,不是引用类型,。结构不支持继承,对于结构构造函数的工作方式有一些区别,尤其是编译器总是提供一个无参数的默认构造函数,它不允许许替换的。
结构的构造函数
默认构造函数把数值字段都初始化为0,把引用类型字段初始化为null,总是隐式的给出。提供字段的初始化值也不能绕过默认构造函数,下面代码产生编译错误:
部分类
partial关键字的用法:把partial放在class,struct或interface关键字的前面,下例:
在嵌套的类型中,只要partial关键字位于class关键字的前面,就可以嵌套部分类。
把部分类编译到类型中时,属性,XML注释,接口,泛型类型的参数属性和成员会合并。
静态类
如果类只包含静态的方法和属性,该类就是静态的。
tostring()方法,他是快速获取对象的字符串表示的最便捷方式。
例子;
}
}
该例子说明了如果不在自己定义的类中重写Tostring(),该类将继承system.object的实现方式,它显示的名称,如果希望tostring()返回一个字符串,其包含类中的对象的值信息。该例还说明了如何使用属性封装字段。
3.一步一步学c#(三):对象和类型的更多相关文章
- 一步一步跟我学DeviceOne开发 - 仿微信应用(一,二,三)
这是一个系列的文档,长期目标是利用DeviceOne开发一些目前使用广泛的优质手机应用,我们会最大化的实现这些应用的每一个功能和细节,不只停留在简单的UI模仿和Demo阶段,而是一个基本可以使用的实际 ...
- 一步一步学ROP之linux_x64篇
一步一步学ROP之linux_x64篇 一.序 **ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防 ...
- 一步一步学ROP之linux_x86篇
一步一步学ROP之linux_x86篇 作者:蒸米@阿里聚安全 一.序 ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过 ...
- (转载)一步一步学Linq to sql系列文章
现在Linq to sql的资料还不是很多,本人水平有限,如果有错或者误导请指出,谢谢. 一步一步学Linq to sql(一):预备知识 一步一步学Linq to sql(二):DataContex ...
- 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计
本帖最后由 xinxincaijq 于 2013-1-9 10:27 编辑 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计 转自博客:http:// ...
- 一步一步学android控件(之十六)—— CheckBox
根据使用场景不同,有时候使用系统默认的CheckBox样式就可以了,但是有时候就需要自定义CheckBox的样式.今天主要学习如何自定义CheckBox样式.在CheckBox状态改变时有时需要做一些 ...
- 【DG】[三思笔记]一步一步学DataGuard
[DG][三思笔记]一步一步学DataGuard 它有无数个名字,有人叫它dg,有人叫它数据卫士,有人叫它data guard,在oracle的各项特性中它有着举足轻理的地位,它就是(掌声)..... ...
- 一步一步从原理跟我学邮件收取及发送 2.邮箱的登录和绕不开的base64
一步一步从原理跟我学邮件收取及发送 2.邮箱的登录和绕不开的base64 好了,经过本系列上一篇文章 "1.网络命令的发送",假设大家已经掌握了 email 电子邮件的命令发送的方 ...
- 一步一步学Linq to sql(五):存储过程
普通存储过程 首先在查询分析器运行下面的代码来创建一个存储过程: create proc sp_singleresultset as set nocount on select * from cust ...
- Linux网络编程一步一步学【转】
转自:http://blog.chinaunix.net/uid-10747583-id-297982.html Linux网络编程一步一步学+基础 原文地址:http://blogold.chin ...
随机推荐
- [置顶] 实习总结3-job hunting(西安工作)
开始整理关于西安top level的IT企业的工作从去年开始实习就慢慢展开了,到了北京之后一直关注的比较密切,因此前前后后也整理了很多.本来不打算那么急着写这一篇的,但是在因为在公司呆着,对于西安的一 ...
- android-vlc for rtsp build OK
近期研究 rtsp http stream 流获取方式 vlc over live555 是个很不错的选择,当然了 andorid framework av也是支持rtsp http的,相同不错的选 ...
- oracle动态游标
declare v_col1 varchar2(254); v_col2 varchar2(254); v_sql varchar2(1024); type my_cursor is ...
- javascript高级知识分析——函数访问
代码信息来自于http://ejohn.org/apps/learn/. 可以通过函数的名字在它的内部引用它. function yell(n){ return n > 0 ? yell(n-1 ...
- JS继承,原型继承,构造函数的继承,非构造函数"的继承
a.原型继承 一.new运算符的缺点 用构造函数生成实例对象,有一个缺点,那就是无法共享属性和方法.比如,在DOG对象的构造函数中,设置一个实例对象的共有属性species. function DOG ...
- iOS-NSAttributedString自定义文字变色
1.使用注意: 1.给UILabel设置attributedText了会导致给UILabel中text,font,textColor,shadowColor,shadowOffset,textAlig ...
- C++ 虚函数机制学习
致谢 本文是基于对<Inside the c++ object model>的阅读和gdb的使用而完成的.在此感谢Lippman对cfront中对象模型的解析,这些解析帮助读者拨开迷雾.此 ...
- 内存管理之二——Cocos2d-x学习历程(六)
1.工厂方法 工厂方法是程序设计中一个经典的设计模式,指的是基类中只定义创建对象的接口,将实际的实现推迟到子类中. CCObject* factoryMethod() { CCObject* ret ...
- Ubuntu12.04 配置Java开发环境:JDK1.7+Eclipse+Tomcat7.0
软硬件环境 Ubuntu12.04+JDK1.7+Eclipse+Tomcat7.0 内容列表 1.安装JDK1.7,配置JAVA环境 2.安装Eclipse 3.安装Tomcat7.0 1.安装JD ...
- Facebook 调试工具Stetho配置入门
I decided to spend a few hours on Stetho.Stetho is a sophisticated debug bridge for Android applicat ...