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()返回一个字符串,其包含类中的对象的值信息。该例还说明了如何使用属性封装字段。

时间: 2024-11-06 14:50:39

3.一步一步学c#(三):对象和类型的相关文章

一步一步跟我学DeviceOne开发 - 仿微信应用(一,二,三)

这是一个系列的文档,长期目标是利用DeviceOne开发一些目前使用广泛的优质手机应用,我们会最大化的实现这些应用的每一个功能和细节,不只停留在简单的UI模仿和Demo阶段,而是一个基本可以使用的实际App. 在实现的过程中,会有很多困难,还会发现有一些功能目前缺乏组件支持而无法实现,也会碰见各种移动开发中都会碰到的常见技术问题.一步一步的操作和问题的解决可以让开发者直观的了解通过DeviceOne如何开发一个实际App,也可以了解移动开发本身的很多技术细节,可以让App开发者少走很多弯路. 这

Rhythmk 一步一步学 JAVA (21) JAVA 多线程

1.JAVA多线程简单示例 1.1 .Thread  集成接口 Runnable 1.2 .线程状态,可以通过  Thread.getState()获取线程状态: New (新创建) Runnable (可以运行) Blocked  (被阻塞) Waiting  (等待) Timed waiting (计时等待) Terminated  (被终止) ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

一步一步学ROP之linux_x64篇

一步一步学ROP之linux_x64篇 一.序 **ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防御(比如内存不可执行和代码签名等).上次我们主要讨论了linux_x86的ROP攻击:<一步一步学ROP之linux_x86篇>,在这次的教程中我们会带来上一篇的补充以及linux_x64方面的ROP利用方法,欢迎大家继续学习. 另外文中涉及代码可在我的github下载:https://githu

【DG】[三思笔记]一步一步学DataGuard

[DG][三思笔记]一步一步学DataGuard 它有无数个名字,有人叫它dg,有人叫它数据卫士,有人叫它data guard,在oracle的各项特性中它有着举足轻理的地位,它就是(掌声)......................Oracle Data Guard.而对于我而言,我一定要亲切的叫它:DG(注:主要是因为打着方便). 不少未实际接触过dg的初学者可能会下意识以为dg是一个备份恢复的工具.我要说的是,这种形容不完全错,dg拥有备份的功能,某些情况下它甚至可以与primary数据库

一步一步学ROP之linux_x86篇

0x00 本文仅解释说明蒸米大神一步一步学ROP之linux_x86篇,读者应先阅读这篇文章,遇到问题再来看我这篇文章. 阅读完这两篇文章后,我们会理解ROP(返回导向编程),DEP(堆栈不可执行),ASLR(内存地址随机化),Stack Protector(栈保护),Memory Leak. 0x01 第一个问题:为什么要构造成"A"*140+ret字符串,这个140是怎么来的呢? 要回答这个问题,我们需要把level1.c反汇编,level1.c代码如下: #include <

一步一步学Linq to sql系列文章 转lovecherry

http://www.cnblogs.com/lovecherry/archive/2007/08/13/853754.html 现在Linq to sql的资料还不是很多,本人水平有限,如果有错或者误导请指出,谢谢. 一步一步学Linq to sql(一):预备知识 一步一步学Linq to sql(二):DataContext与实体 一步一步学Linq to sql(三):增删改 一步一步学Linq to sql(四):查询句法 一步一步学Linq to sql(五):存储过程 一步一步学L

一步一步学ROP Linux x86

一步一步学ROP Linux x86 学习笔记一.无任何防护二.开启DEP三.开启DEP和ASLR四.开启DEP和ASLR,无libc 一步一步学ROP Linux x86 学习笔记 这部分文章主要依据的是蒸米大神的一步一步学ROP系列文章,我也是跟着做的,本文主要记录其中的问题和实验没有成功的地方. 一.无任何防护 在github可以找到相关的资料,不用自己编译漏洞代码了,也有写好的exp. 从最基础的开始,先学无任何防护的栈溢出.使用checksec看一下防护: 那就简单了,直接用shell

Rhythmk 一步一步学 JAVA (20) JAVA enum常用方法

JAVA 枚举定义常用方法: 1.static Enum valueOf(Class enum,String name) 返回指定name的枚举类型 2.Static Enum values[] 返回枚举常量集合 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

一步一步学会puppet(三)--节点和模板

这篇主要介绍puppet中需要理解的2个重要概念:节点和模板: =================================================================== 1 节点 1.1 定义 1.2 详细说明 1.3 实例 2 模板 2.1 定义 2.2 详细说明 2.3 模板文件的语法 2.4 模板文件实例 2.5 使用模板文件生成实际配置文件 ===========================================================

一步一步学习数据结构(三)栈的顺序存储结构实现代码

//栈这种逻辑结构的实现与一般线性表的实现类似,有两种存储方式:顺序存储和链式存储 //先学习顺序存储 //1. #include<stdio.h> #include<stdlib.h> #define null NULL #define SIZE 100 typedef int dataType ; typedef struct { dataType data[SIZE]; int top; }cStack,*cStackPointer; //初始化栈空间 void initSt