类和结构

类和结构实际上都是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法,。

结构与类的区别是它们在内存中的存储方式,访问方式(类是存储在堆(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()返回一个字符串,其包含类中的对象的值信息。该例还说明了如何使用属性封装字段。

最新文章

  1. 外景VR的应用
  2. Python爬虫:Xpath语法笔记
  3. Html页面head标签元素的意义和应用场景
  4. Android 动态加载 (二) 态加载机制 案例二
  5. 深入理解MYSQL的MDL元数据锁
  6. FIRST集和FOLLOW集
  7. Java 之文件IO编程 之写入
  8. [汇编学习笔记][第十三章int指令]
  9. TCP/IP之三次握手、四次挥手
  10. 【DDD】领域驱动设计实践 —— 框架实现
  11. MacBook Air 装win10系统 by DODUI
  12. ACL(Access Control List)
  13. python3对比python2的更新点
  14. Archlinux安装总结
  15. sublimit 编辑器 设置默认的编码
  16. Struts2学习第四天——全局结果,动态结果及异常映射
  17. redis pipeline 独占链接
  18. django中orm使用的注意事项
  19. Hive和并行数据仓库的比较
  20. springboot+shiro+redis(单机redis版)整合教程

热门文章

  1. PBOC/EMV 中SDA和DDA简介
  2. android手机上安装apk时出现解析包错误的一个解决办法
  3. WIN ERROR:C:\Windows\System32\<LANG_NAME>\mstsc.exe.MUI
  4. 10-3[RF] feature selection
  5. Keil 中的预处理命令const
  6. error: C2664: “zajiao::zajiao(const zajiao &)”: 无法将参数 1 从“const char [12]”转换为“char *”
  7. leftpad填充函数;
  8. CAD 致命错误
  9. table+js实现网站左侧列表下拉隐藏
  10. web.xml加载顺序详解