来讲讲C#中的类
1、什么是类?
面向对象的语言,最基本的就是类。在C#中,类是这样来定义的:类代表一组具有公共属性和行为的对象。
举个例子,现实生活中,人就是一个“类”,但这只是一个统称,指所有的人。我们要找个人一起去玩,此时就需要找到一个具体的人。比如我和小红,我们两个就是“人”这个类的两个实例。
2、C#中如何定义一个类?
C#中采用关键词class来定义。
class 类名{}
class前面还可以有访问修饰符进行修饰。
| 访问修饰符 | 说明 |
| public | 公有访问。不受任何限制。 |
| private | 私有访问。只限于本类成员访问,子类,实例都不能访问。 |
| protected | 保护访问。只限于本类和子类访问,实例不能访问。 |
| internal | 内部访问。只限于本项目内访问,其他不能访问。 |
| protected internal | 内部保护访问。只限于本项目或是子类访问,其他不能访问 |
3、类的成员
类的成员包括字段、属性、方法和构造函数等。它们与类一样,都有自己的访问权限。也可以使用static关键字将其声明为类的静态成员,注意,静态成员属于类级别的概念,不属于类的实例。
3.1 字段
字段由三个部分组成-访问修饰符,字段的类型和字段名字。
public class Person
{
private string name;
public int age;
protected bool sex;
}
当然,也可以使用readonly和const来修饰,readonly不需要定义时初始化,可以在构造函数中进行初始化,而const修饰字段也必须定义字段的时候就完成初始化。
类可以用static进行修饰,字段也可以使用static。当字段使用static进行修饰的时候,只能使用 类名.字段名进行访问。
3.2 属性
属性是对字段的扩展
public class Person
{
private string name;
public string Name
{
get{return name;}
set{name=value;}
}
}
属性定义主要由get访问器和set访问器组成。前面有介绍过,属性中get和set在IL代码中,是被编译成两个方法的。用属性来包装字段是因为可以更好的保护字段,可以根据需要加入更多的逻辑控制代码。当然,属性也可以使用static关键字进行声明,跟字段是一样的,属于类级别,不能通过类的实例进行访问,也不能在静态属性中使用非静态字段。
3.3 方法
方法=方法签名+一系列语句的代码
public class Person
{
public void Print(string name)
{
Console.WriteLine("aaaa");
}
}
方法也可以使用static关键字进行修饰,此时的静态方法也属于类级别的,不能用过类的实例进行访问。
关于方法,还有一个很重要的地方,那就是方法重载,方法重载指的是在类中可以定义多个名称相同但方法签名不同的方法,这里的方法签名不同指的是方法的参数顺序、参数类型和个数的不同(Warning:方法的返回值类型不属于方法签名的一部分)。
public class Person
{
public void Print(string name){}
public void Print(int age){}
}
3.4 构造函数
构造函数是用于创建类的实例对象的。当调用构造函数创建一个对象时,构造函数会为对象分配内存空间,并初始化类的成员。构造函数分为实例构造函数和静态构造函数两种。
(1)实例构造函数
一般在程序中,都是使用new关键字来创建对象的。new创建的过程,就是调用实例构造函数,来初始化类中所有的实例成员。
比如上面的Person类,虽没有显示写出实例构造函数,但C#编译器会帮我们自动生成一个函数体为空的默认午餐的实例构造函数。
构造函数有以下特点:
- 构造函数可以进行方法重载。
- 如果没有为类显示地定义一个构造函数,则C#编译器会帮我们生成一个函数体为空的默认午餐的实例构造函数。
- 可以对实例构造函数指定访问级别,即可以使用public、protected和private修饰符来修饰。
- 构造函数必须与类同名,并且不允许有返回类型。
(2)静态构造函数
静态构造函数用于初始化类中的静态成员,在创建第一个实例或引用任何静态成员之前,CLR都将自动调用静态构造函数。
静态构造函数有以下特点:
- 静态构造函数不能使用任何访问修饰符。
- 静态构造函数不能带有任何参数。
- 静态构造函数只会执行一次。
- 不能直接调用静态构造函数。
- 在程序中,程序员无法控制静态构造函数的时机。
3.5 析构函数
析构函数用于在类销毁之前释放类实例所使用的托管和非托管资源。析构函数实际上是隐式地调用了基类Object的Finalize方法。
class Person
{
~Person()
{
Console.WriteLine("析构函数被调用了");
}
}
上面的析构函数代码会被编译器转化为下面的代码:
protected override void Finalize()
{
try{Console.WriteLine("析构函数被调用了");}
finally{base.Finalize();}
}
在定义析构函数时必须要注意以下几点:
- 不能在结构体中定义析构函数,只能对类使用析构函数。
- 一个类只能有一个析构函数。
- 无法继承或重载析构函数。
- 无法显示地调用析构函数,析构函数是由垃圾回收器自动调用的。
- 析构函数既没有修饰符也没有参数。
3.6 索引器
索引器的定义类似于属性,也具有get访问器和set访问器。
[修饰符] 数据类型 this[索引类型 index]
{
get{//返回类中数组的某个元素;}
set{//对类中数组元素赋值;}
}
this表示所操作的是对类对象的数组成员
4、类实例化
前面说过了,要得到一个类的实例对象,就必须先声明一个该类类型的变量,然后使用new运算符后跟类的实例构造函数来完成实例化。类的实例化对象是对类的具体化。
需要注意的是:只有包含实例构造函数的类才能被实例化,而在静态类中是不能定义实例构造函数的。
5、类与结构体的区别
- 语法上的区别在于 定义类要使用关键字class,而结构体是使用关键字struct。
- 结构体中不可对声明字段字段进行初始化,但类可以。
- 如果没有味类显示地定义构造函数,C#编译器会自动生成一个无参数的实例构造函数。结构体中,无论是否显示地定义了构造函数,隐式构造函数都是一直存在的。
- 结构体中不能显示地定义无参数的构造函数。
- 在结构体的构造函数中,必须要为结构体中的所有字段赋值。
- 创建结构体对象可以不实用new关键字,但此时结构体对象中的字段是没有初始值的;而类必须使用new关键字来创建对象。
- 结构体不能继承结构或者类,但可以实现接口;而类可以继承类但不能继承结构,它也可以实现接口。
- 类是引用类型,而结构体是值类型。
- 结构体不能定义析构函数,而类可以有析构函数。
- 不能用abstract和sealed关键字修饰结构体,而类可以。
感觉这篇非常非常的基础,我也是在想到底要不要写,后来我决定还是写下来。万丈高楼平地起,加上技术更新也快,但有基础,就可以以不变应万变了。
来讲讲C#中的类的更多相关文章
- Python中的类、对象、继承
类 Python中,类的命名使用帕斯卡命名方式,即首字母大写. Python中定义类的方式如下: class 类名([父类名[,父类名[,...]]]): pass 省略父类名表示该类直接继承自obj ...
- 基础知识(05) -- Java中的类
Java中的类 1.类的概念 2.类中的封装 3.对象的三大特征 4.对象状态 5.类与类之间的关系 ------------------------------------------------- ...
- Objective-C中的类目,延展,协议
Objective-C中的类目(Category),延展(Extension),协议(Protocol)这些名词看起来挺牛的,瞬间感觉OC好高大上.在其他OOP语言中就没见过这些名词,刚看到这三个名词 ...
- CSS中伪类及伪元素用法详解
CSS中伪类及伪元素用法详解 伪类的分类及作用: 注:该表引自W3School教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的 ...
- Android中View类OnClickListener和DialogInterface类OnClickListener冲突解决办法
Android中View类OnClickListener和DialogInterface类OnClickListener冲突解决办法 如下面所示,同时导入这两个,会提示其中一个与另一个产生冲突. 1i ...
- C#中timer类的用法
C#中timer类的用法 关于C#中timer类 在C#里关于定时器类就有3个 1.定义在System.Windows.Forms里 2.定义在System.Threading.Timer类 ...
- JAVA中的类和接口
1.类: 类是具有相同属性和方法的一组对象的集合,它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和方法两个主要部分.在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属 ...
- java中Color类的简单总结
java中Color类的简单总结 1.颜色的常识 任何颜色都是由三原色组成(RGB),JAVA中支持224为彩色,即红绿蓝分量取值 介于0-255之间(8位表示) 2.Color类中的常量 publi ...
- 《CoffeeScript应用开发》学习:第五章 CoffeeScript中的类
在CoffeeScript中定义类 在CoffeeScript中,使用class定义类,使用关键字new实例化对象. 给类绑定方法 class Airplane takeOff: -> cons ...
随机推荐
- 豆约翰博客备份专家博客导出示例(PDF,CHM)
示例1: CSDN博客: 示例博客主页:http://blog.csdn.net/shenyisyn/ CHM文件图示:下载地址 PDF文件图示:下载地址 示例2: 新浪博客: 示例博客主页:http ...
- jQuery的文档操作方法
jQuery 文档操作方法 这些方法对于 XML 文档和 HTML 文档均是适用的,除了:html(). 方法 描述 addClass() 向匹配的元素添加指定的类名. after() 在匹配的元素之 ...
- C语言、Java的编译系统
Java是跨平台的. Java代码的编译是由Java语言的编译器来执行的,执行后生成的是.class文件,该文件是字节码文件. 然后交给虚拟机进行运行,虚拟机是在各个平台上可移植的.从而决定了Java ...
- 写一段方便的SQL 循环查每一天的数据
declare @recd int,@i int,@a int,@count int,@day1 date,@day2 date,@days int set @day1='2014-8-24' set ...
- Java调用MySQL存储过程
Java调用MySQL的存储过程,需要用JDBC连接,环境eclipse 首先查看MySQL中的数据库的存储过程,接着编写代码调用 mysql> show procedure status; + ...
- jQuery 简单归纳总结
jQuery语法是为HTML元素的选取编制的,能够对元素运行某些操作. 基础语法是:$(selector).action() +美元符号定义 jQuery +选择符(selector)"查询 ...
- varchar(n)和varchar(max)有什么区别
如果列数据项的大小一致,则使用 char. 如果列数据项的大小差异相当大,则使用 varchar. 如果列数据项大小相差很大,而且大小可能超过 8,000 字节,请使用 varchar(max).
- MVC 音乐商店 第 9 部分: 注册和结帐
MVC 音乐商店是介绍,并分步说明了如何使用 ASP.NET MVC 和 Visual Studio 为 web 开发教程应用程序. MVC 音乐商店是一个轻量级的示例存储实现它卖音乐专辑在线,并实现 ...
- 使用 JSSE 定制 SSL 连接的属性--转载
当数据在网络上传播的时候,通过使用 SSL 对其进行加密和保护,JSSE 为 Java 应用程序提供了安全的通信.在本篇有关该技术的高级研究中,Java 中间件开发人员 Ian Parkinson 深 ...
- mvvm框架下页面与ViewModel的各种参数传递方式
传单个参数的话在xaml用 Command={Binding ViewModel的事件处理名称} CommandParameter={Binding 要传递的控件名称} ViewMode ...