类
我们前面学过许多类型,有int,string,double等等。通过类型,我们可以实例化一个对象,例如int[] a = new int[0];中,a就是int[]类型的对象。我们当然也可以自定义一种类型。
class 类名
{
成员变量...
成员变量...
属性...
属性...
成员方法...
成员方法...
构造方法...
}
可以看到,我们用class 类名{}就能创建一个类,而大括号内放的就是类的内容。你可以先实例化一个类,以便后续测试,代码如下:
using System;
namespace Csharp
{
class Test
{
}
class Program
{
static void Main(string[] args)
{
Test testObject = new Test();
}
}
}
接下来,我会详细介绍类都有哪些内容:
成员变量
和结构体一样,类也有成员变量,并且在使用上与结构体完全一致。我们为类添加上成员变量:
using System;
namespace Csharp
{
class Test
{
int x = 0;
int y = 0;
int z = 0;
}
class Program
{
static void Main(string[] args)
{
Test testObject = new Test();
}
}
}
但是,此时我们不能使用testObject.x来调用成员变量x,因为成员变量默认作用域为private,只能在类内部调用。
成员方法
同样是类似结构体,类也有自己的成员方法,代码如下:
using System;
namespace Csharp
{
class Test
{
int x = 0;
int y = 0;
int z = 0;
public void PrintXYZ()
{
Console.WriteLine("x:{0} y:{1} z:{2}", x, y, z);
}
}
class Program
{
static void Main(string[] args)
{
Test testObject = new Test();
}
}
}
作为给外部调用的方法,我们在前面加上public改变其作用域,就可以使用testObject.PrintXYZ()调用了。
属性
我们知道,变量可以读取(如Console.WriteLine(x);),也可以写入(如x = 3;),属性也是如此,不过他改变了读写的逻辑。
属性内有get和set两大块,所以属性的结构如下:
作用域 属性类型 属性名
{
get
{
}
set
{
}
}
get负责读,set负责写,接下来详细介绍这两部分:
get在属性被读取时使用,决定返回什么内容。你可以先定义一个private的成员变量,再通过属性返回给外界访问,这种间接访问的方式非常常用。
using System;
namespace Csharp
{
class Test
{
int x = 0;
int y = 0;
int z = 0;
private string name;
public string Name
{
get
{
return name;
}
set
{
}
}
public void PrintXYZ()
{
Console.WriteLine("x:{0} y:{1} z:{2}", x, y, z);
}
}
class Program
{
static void Main(string[] args)
{
Test testObject = new Test();
}
}
}
这样,你就可以通过testObject.Name间接访问访问不到的name了。
set,也就是写入、赋值。我们在赋值的时候,都是变量名 = 值,那么我们怎么知道用户赋予了什么值呢?
在set内,用户写入的值被存储在一个变量value内,你直接写value就能访问到用户写入的内容,如果我们想把私有成员变量赋值为value,可以这么写:
using System;
namespace Csharp
{
class Test
{
int x = 0;
int y = 0;
int z = 0;
private string name;
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
public void PrintXYZ()
{
Console.WriteLine("x:{0} y:{1} z:{2}", x, y, z);
}
}
class Program
{
static void Main(string[] args)
{
Test testObject = new Test();
}
}
}
那么,此时对Name进行操作就相当于对name进行操作了。当然,你也可以修改读写的流程,让他没那么无聊。不过,如果你确实只需要把属性当成员变量用的话,可以这么写:
public int XYZ
{
get; set;
}
此时,XYZ这个属性就和成员变量无异,读写功能与成员变量一致。
构造方法
正如在调用函数时我们希望传入一些参数,在实例化一个类时我们希望传入参数,就可以用构造方法实现。结构如下:
public 类名()
{
代码块...
}
可以看到,构造方法作用域必须为public,且方法名和类名一致,不用填写返回值类型。此时我们可以在方法参数内填入参数,来作为实例化类时需要传入的参数,例如我们希望实例化的时候传入xyz,就可以这么写:
using System;
namespace Csharp
{
class Test
{
int x = 0;
int y = 0;
int z = 0;
public void PrintXYZ()
{
Console.WriteLine("x:{0} y:{1} z:{2}", x, y, z);
}
public Test(int x, int y, int z)
{
this.x = x;
this.y = y;
this.z = z;
}
}
class Program
{
static void Main(string[] args)
{
Test testObject = new Test(0, 0, 0);
}
}
}
可以看到,我们希望将形式参数xyz赋值给成员变量xyz,但两者名称相同,怎么办?
此时,this.x代表成员变量的x,而x代表形式参数的x,this在此处就代表实例化对象,通过this.就可以调用成员变量,只是在大多数情况下this.可以省略。
构造方法也可以重载,例如我希望添加一个不输入参数就默认xyz为0的重载:
using System;
namespace Csharp
{
class Test
{
int x = 0;
int y = 0;
int z = 0;
public void PrintXYZ()
{
Console.WriteLine("x:{0} y:{1} z:{2}", x, y, z);
}
public Test(int x, int y, int z)
{
this.x = x;
this.y = y;
this.z = z;
}
public Test()
{
x = 0;
y = 0;
z = 0;
}
}
class Program
{
static void Main(string[] args)
{
Test testObject1 = new Test(0, 0, 0);
Test testObject2 = new Test();
}
}
}
可以看到,在不混淆的情况下,xyz默认指的就是this.xyz。
OK,下一篇继续面向对象!

Comments NOTHING