c#封装、类的定义和使用、访问性、构造器、重载构造器、解构器、静态方法、共享字段、静态类、静态using语句、匿名类

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_44800780/article/details/102683005

英语里面的类Class是分类classification的词根,设计类的过程就是对信息进行分类。

封装

封装是定义类的重要原则,使用类的程序不必关系类内部如何工作。程序只需要创建类的实例并调用类的方法。
比如Console.WriteLine,我们不需要去了解Console类将数据如何输出到屏幕的复杂细节.这就是封装的意义.
这些复杂的细节是隐藏的,因此,封装有时也叫信息隐藏.
它实际有两个目的:
1.将方法和数据合并到类中,为了支持分类;
2.控制对方法和数据的访问,也就是控制类的使用.

定义并使用类

C#用class 关键字定义新类.
比如:
在这里插入图片描述
上面定义了一个Circle类,包含数据(圆的半径)和方法(Area计算圆的面积).
C#将类中的变量称为字段.

使用类

Circle c;//创建Circle变量
c = new Circle();//初始化

注意这里使用了new关键字,以前在初始化int或float时是直接赋值的:

int i;
i = 1;

但是类不能像以前那样赋值,涉及到"运行时"对类类型的变量的内存进行分配与管理的方式,这方面会在后面讲到,我们目前只需要知道使用new关键字将新建一个类的实例。
类的实例更通俗的说法就是对象

控制可访问性

Circle类目前没有任何实际用处,默认情况下,方法和数据封装到类中,它们是私有的,虽然能创建Circle对象,但是外界无法访问radius字段,也调用不了Area方法
比如:
在这里插入图片描述
但是我们可以用publicprivate关键字修改字段或方法的定义,决定它们是否能从外部访问.
下面对刚才的类进行修改

    class Circle
    {
        private int radius;
        public double Area()
        {
            return Math.PI * radius * radius;
        }
    }

在这里插入图片描述
由于Area被声明为共有的,所以我们可以在外面调用。
但是目前我们还是无法初始化radius字段,因为它是私有的,这种情况下应该使用构造器.

构造器

构造器是在创建类的实例时自动运行的方法.
使用new创建对象时,"运行时"必须根据类的定义构造对象.必须从操作系统申请内存区域,在其中填充类定义的字段,然后调用构造器执行初始化.

每一个类都必须要有一个构造器,不提供构造器,编译器会自动生成一个默认的构造器。下面我们来写一个自己的构造器:

    class Circle
    {
        private int radius;
        public Circle()
        {
            radius = 1;
        }
        public double Area()
        {
            return Math.PI * radius * radius;
        }
    }

这个自己写的构造器能够将radius字段初始化为1:
注意:本例的构造器标识为public,如果省略的话,构造器默认为私有的,私有构造器不能在类的外部使用。造成无法从Circle类的外部创建Circle对象.
在这里插入图片描述

重载构造器

构造器可以有多个版本,比如下面:
在这里插入图片描述
然后可以在新建Circle对象时调用该构造器,
在这里插入图片描述
生成应用程序时,编译器根据new操作符指定的参数来判断使用哪一个构造器。

此外使用partial 可以让类被拆分到多个文件中.
比如上面的Circle类,我们可以在circl.cs中提供构造器

//circl.cs
    partial class Circle
    {
        public Circle()
        {
            this.radius = 1;
        }
        public Circle(int a)
        {
            this.radius = a;
        }
    }

然后在circ2.cs中提供字段和方法

    partial class Circle
    {
        private int radius;
        public double Area()
        {
            return Math.PI * radius * radius;
        }
    }



解构对象

构造器创建并初始化对象。
解构器则检查对象并提取它的字段的值,注意解构器是C#7新增的语法糖,不要和析构器混淆.
使用方法如下:
在这里插入图片描述
在这里插入图片描述
解构器的使用方法:
1.必须命名为Deconstruct
2.必须是void方法
3.必须获取一个或多个参数。这些参数用对象中的字段的值填充
4.参数用out修饰符加以标记.
5.方法主体代码向参数赋值
调用解构器的方式和调用返回一个元组的方法一样.

(int x, int y) = c;



静态方法和数据

之前使用Circle类的时候,在计算圆的面积的时候,我们使用了Math.PI字段,这是直接在类的上面调用方法.为什么可以不创建实例而直接调用类的方法呢?
事实上,并非所有的方法都天生从属于类的某个实例。
这些方法称为工具方法实用方法
比如Math.Sqrt用来开平方,如果把sqrt设计成Math类的实例方法,就必须先创建Math对象,然后才能在那个对象上调用sqrt:

Math m = new Math();
double d = m.Sqrt(42.24);

这样就比较麻烦,我们只需要调用Sqrt这个方法,而m这个对象对我们来说没有任何作用,是不需要的。
但是如果我们把方法或字段声明为static,就可以使用类名调用 方法:

class Math
{
	public static double Sqrt(double d)
	{
		...
	}
}

可以像下面这样调用Sqrt方法:

double d = Math.Sqrt(42.24);

注意,由于静态方法不依赖类的实例,所以不能在静态方法中访问类的任何实例字段或实例方法。,只能访问标记为static的其他方法和字段.


创建共享字段

静态字段能在类的所有对象之间共享。
在这里插入图片描述
NumCircles字段由所有Circles对象共享,所以每次新建实例,NumCircles++递增的都是同一个数据。

使用const关键字创建静态变量

constconstant(常量的)简称.
是一种特殊的静态字段,值永远不变.声明时不需要static关键字.

public const double PI = 3.14159265358979;

静态类

C#允许声明静态类,静态类只能包含静态成员.
静态类纯粹作为工具方法和字段的容器使用.静态类不能包含 任何实例数据或方法。静态类允许包含一个默认构造器,但是这个构造器也必须是静态的.

静态using语句

任何时候调用静态方法或引用静态字段,都必须指定方法或字段所属的类,比如Math.Sqrt或Console.WriteLine.使用静态using语句允许将类引入作用域:

using static System.Console;

在这里插入图片描述
在这里插入图片描述

匿名类

匿名类是没有名字的类。
创建匿名类的办法是以new关键字开头,后跟一对{}
比如:
在这里插入图片描述
定义匿名类时,编译器为该类生成只有它自己知道的名称。然后使用var关键字将temp声明为隐式类型的变量,创建正确类型的变量.

猜你喜欢

转载自blog.csdn.net/qq_44800780/article/details/102683005
今日推荐