来讲讲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关键字修饰结构体,而类可以。

感觉这篇非常非常的基础,我也是在想到底要不要写,后来我决定还是写下来。万丈高楼平地起,加上技术更新也快,但有基础,就可以以不变应万变了。

时间: 2024-12-28 14:18:44

来讲讲C#中的类的相关文章

【Android】Android中Service类onStartCommand的返回值有关问题(转)

@Override public int onStartCommand(Intent intent, int flags, int startId) { System.out.println("---------->>onStartCommand2"); return super.onStartCommand(intent, flags, startId); } Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象

Android中Service类onStartCommand的返回值问题

Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,然后在onStartCommand方法中做一些处理.然后我们注意到这个函数有一个int的返回值,这篇文章就是简单地讲讲int返回值的作用. 从Android官方文档中,我们知道onStartCommand有4种返回值: START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但

C++中的类

摘要:在看Qt时,其中:在.cpp的文件(是类的源文件)---实现槽,在.h的文件中声明槽.  于是打算在这篇随笔中尽可能多的通学C++语言中的类. -------------------------------------------------------------------------------------------------- 一. 在<C/C++程序设计> 吴国凤.吴善立主编中10.3节的---类与对象 1.类和对象的定义 1) 类的声明 实际上类是一种新的数据类型. 它是

静态方法中访问类的实例成员

public class StaticShiLi { static int i=1; int j=2; static void m(){ System.out.println(j);报错 } public static void main(String[] args) { // TODO Auto-generated method stub } } 程序报错,显示无法访问. 疑问:那么怎样在静态方法中访问类的实例成员呢?

Object-C中Category类体验

Object-C开发的时候有的时候会用到Category类,类似于Java和C#中扩展类,就是如果你觉得如果你觉得常用的方法在String中没有,可以根据业务需求和个人喜好写一个扩展类,然后在其中补充自己的方法,如果单纯的扩展已有类型来看基本上是一样的.OC还有可以对已经存在类通过Category进行扩展,这个特点又和C#中的partial class有的类似,先来看下是如何操作的吧: 新建的时候选择Object-C File: 选择类型为Category,第一个是是Categroy名称,第三个

C++中的类所占内存空间总结

C++中的类所占内存空间总结 最近在复习c++的一些基础,感觉这篇文章很不错,转载来,大家看看! 类所占内存的大小是由成员变量(静态变量除外)决定的,成员函数(这是笼统的说,后面会细说)是不计算在内的. 摘抄部分: 成员函数还是以一般的函数一样的存在.a.fun()是通过fun(a.this)来调用的.所谓成员函数只是在名义上是类里的.其实成员函数的大小不在类的对象里面,同一个类的多个对象共享函数代码.而我们访问类的成员函数是通过类里面的一个指针实现,而这个指针指向的是一个table,table

ASP.NET中GUID类

GUID(Global unique identifier)全局唯一标识符,它是由网卡上的标识数字(每个网卡都有唯一的标识号)以及 CPU 时钟的唯一数字生成的的一个 16 字节的二进制值. GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字.例如:6F9619FF-8B86-D011-B42D-00C04FC964FF 即为有效的 GUID 值. 世界上的任何两台计算机都不会生成重复的

文件中的类都不能进行设计,因此未能为该文件显示设计器 VS2008(Visual Studio 2008) x64

项目属性 运行平台x64 Form2 继承 Form1 , Form2 设计器 报错 64位dll  无法加载 DLL 找不到指定的模块 原因Vs2008(Visual Studio 2008)默认 没安装64编译器 安装参照:<http://blog.csdn.net/clever101/article/details/8844314> 安装sp1补丁会报这个, 安装目录:D:\Program Files (x86)\Microsoft Visual Studio 9.0\Microsoft

Android技术18:Android中Adapter类详解

1.Adapter设计模式 Android中adapter接口有很多种实现,例如,ArrayAdapter,BaseAdapter,CursorAdapter,SimpleAdapter,SimpleCursorAdapter等,他们分别对应不同的数据源.例如,ArrayAdater对应List和数组数据源,而CursorAdapter对应Cursor对象(一般从数据库中获取的记录集).这些Adapter都需要getView方法返回当前列表项显示的View对象.当Model发生改变时,会调用Ba