来,深入了解一下C#类【01】
:::tips
本文主要介绍类的概念,实例成员及静态成员,深入解析及示例,希望对你理解C#类有点帮助。欢迎微信搜一搜公众号【昆腾码头羊】
:::
1、C#类到底是个啥?
1.1、一个问题:类是干什么用的?
类是一种活动的数据结构:程序的数据和功能被组织为逻辑上相关的数据项和函数的封装集合,并被称为类。
类是一个能存储数据并执行代码的数据结构。它包含数据成员和函数成员;
怎么理解类是一个活动的数据结构呢?可以想象成为房子这个东西:我们准备去买房子,确定要交首付了,那就相当于我们要开始创建类的实例了,那就是你交钱了,就能拿到这个户型的一个副本(具体房间号的套房)。然后我们就可以往这个房子里面,装修,添置家居,住进家人等等。我们添置的储物柜,就是用来存储东西的,就像我们的数据成员。我们买过来的扫地机器人,就像函数成员,能够帮助我们实现扫地的功能。但是你发现:从你买过来这个房子,到10年后,你的房子里面的东西(成员)越来越多,那就好像房子是一个一直在活动的生命体一样(这就好比是活动的结构)。
2、类就是个“家”
根据上面所述,我们知道类是有成员的,就像一个房子一样,里面会有各种各样的东西和事物。类的成员包括:数据成员和函数成员。
【1】数据成员:它存储与类或类的实例相关的数据。数据成员通常模拟该类所表示的现实世界事物的特性。 数据成员有:字段和常量;
【2】函数成员:执行代码,通常会模拟类所表示的现实世界事物的功能和操作。函数成员有:方法,属性,构造函数,析构函数,运算符,索引,事件。
3、“成员小红花”
想起幼儿园,活动中你跳支舞,帮助别的小盆友,通常都能得到一个小红花,这朵小红花别在衣服上面那是一种装饰,让人开心快乐。我们定义类中的成员是,同样也有小红花,就是特性和修改符。我们知道字段是数据保存的实体,类中字段的声明方式通常如下:
[][]【特性】【修饰符】 核心声明;
public static int VarSaveFiled;
// static public int VarSaveFiled;
public static void VarGetValue(){ /* 方法体*/};
public static int VarGetValue()
{
int GetValue;
/* 方法体*/
return int GetValue;
};
//【注意】:字段的类型和方法的返回类型不是修饰符,这些是属于核心声明。
//上面public和static两个修饰符,顺序是可以调换的,无关简要!如果加入特性,那就需要写在修饰符前面了。
4、“房子里的东西”–实例成员
前面我们说,类是一个模板,定义好模板,我们创建类的实例,就像我们拿着模板去复制我们想要的东西,跟前面买房子的例子对应:就是我们买到的房子都是某个户型的复制版本一样,就是个副本(打游戏刷副本的感觉);那你拿到你买的户型(房子)之后,就是创建了一个类的实例。我们有了自己的房子,那房子就是一个活动的数据结构了。我们往房子里面添加储物柜,就像我们创建的用来保存数据的字段,我们买个扫地机器人,就像我们创建的方法,可以帮我们实现某种现实的功能,只不过我们抽象了而已。每个类实例拥有自己的类成员,就像我们每家每户都有自己家的东西一样,那每家每户里面的东西,都是这个家的“实例成员”。
一个户型可以在一个小区内,复制出来多套相同户型的房子。同样的我们一个类,也可以创建多个类的实例对象,就像小杨家,小王家一样,都是类模板的副本。但是,我们使用类对象(副本),要知道:一个副本里的成员变化,不会影响另一个副本中成员的值。就像小杨家的油烟机和小王家的油烟机,虽然都是油烟机,但是小杨家是格力的,小王家的可能是老板的,因此小杨家的油烟机对小王家的油烟机不可能有啥影响。
类实例成员代码实例如下:
class Program
{
static void Main(string[] args)
{
Home Home1 = new Home();
Home Home2 = new Home();
Home1.HoodName = 10;
Home2.HoodName = 20;
Console.WriteLine($"Home1={Home1.HoodName},Home2={Home2.HoodName}");
Console.ReadLine();
}
}
class Home
{
public string HoodName;
}
5、静态字段和访问静态字段
前面我们讲了字段是保存数据的实体,就像我们家里面的储物柜,每个家里面的储物柜存储的东西是不一样的。但是有没有一种可能:我们小区里面有个公共的储物柜,我们大家都可以储存东西,每次储存柜变化了。我们大家取到的都是新变化后的东西,答案是肯定的。静态字段,就是这样一个“公共储物柜”;这个“公共储物柜”在内存中的地址是同一个,而且还有有朵小红花标识(static关键字)这是一个“公共储物柜”;关于静态字段,请大家记住:【同一内存地址,大家公用,一变都变】。
那我们如何访问静态字段呢?【1】我们可以通过类的实例进行访问;【2】我们也可以不创建类的实例,直接通过类.字段名的方式访问。
静态字段是静态成员的一种,还有静态方法,静态属性等。类的实例成员随着实例创建而存在,随着类实例的消亡就消亡了。但是,类的静态成员不一样。即使没有类实例,静态成员也可存在,并且可以被访问。
这说明类的静态成员是跟类相关的,而与类的实例无关。静态字段分配内存的优先级是比类实例成员要高的,算是有点小特权吧。
class Program
{
static void Main(string[] args)
{
Home home1 = new Home(), home2 = new Home();
home1.SetLockers("风衣", "枕头");
home1.Display("home1");
home2.SetVars("被罩", "床单");//也可以通过实例进行访问
home2.Display("home2");
home1.Display("home1");
Home.Lockers="羽绒服";//可以从类的外部直接通过类名.静态字段名的方式直接访问
Console.ReadLine();
}
}
class Home
{
string Lockers1;
static string Lockers2;
public void SetLockers(string var1, string var2)
{
Lockers1 = var1;
Lockers2 = var2;
}
public void Display(string str)
{
Console.WriteLine($"str={str},Lockers1={Lockers1},Mem2={Lockers2}");
}
}
6、静态函数:
如同静态字段,静态函数成员独立于任何类实例。即使没有类的实例,仍然可以调用静态方法。静态函数成员不能访问实例成员,但能访问其他静态成员。
静态函数代码示例如下:
class Program
{
static void Main(string[] args)
{
CommonFunction.var = 10;
CommonFunction.PrintVarValue();
}
}
class CommonFunction
{
static public int var;
static public void PrintVarValue()
{
Console.WriteLine("Value of var: {0}", var);
}
}
:::tips
作者:软件开发/技术写作者,欢迎微信关注个人公号"昆腾码头羊"(ID: KTMTY101),我们一起探讨有趣的编程历程。
:::