参考书:《 visual C# 从入门到精通》
第二部分 理解C#对象模型
第7章 创建并管理类和对象
文章目录
7.1 理解分类
设计类的过程就是对信息进行分类,将相关信息放到有意义的实体中。
7.2 封装的目的
封装时定义类时的重要原则,中心思想是:使用类的程序不应关心类内部如何工作。封装有时称为信息隐藏,实际有两个目的:
- 将方法和数据合并到类中
- 控制对方法和数据的访问
7.3 定义并使用类
如下:
class Circle{
int radius;
double Area(){
return Math.PI*radius*radius;
}
}
类的主体包含一般的方法和字段(变量)。
创建Circle
变量:Circle c;
初始化:c=new Circle();
注意要用关键字new
。new
将新建类的实例,即对象。
7.4 控制可访问性
- 只能从类内部访问的方法或字段是私有的,可以通过关键字
private
来声明,该关键字是默认的。但通常建议不要省略关键字。 - 既能从内部访问也能从外部访问的方法和字段是公共的,用
public
来声明。
7.4.1 使用构造器
与C++类似。
class Circle{
private int radius;
public Circle(){
radius=0;
}
public double Area(){
return Math.PI*radius*radius;
}
}
7.4.2 重载构造器
class Circle{
private int radius;
public Circle(){
radius=0;
}
public Circle(int initialRadius){
radius=initialRadius;
}
public double Area(){
return Math.PI*radius*radius;
}
}
分部类:
C#允许将类的源代码拆分到单独的文件中。这时要在每个文件中使用关键字partial
定义类的不同部分。如假定Circle类被拆分到两个文件中:circ1.cs
和circ2.cs
:
//circ1.cs
partial class Circle{
public Circle(){
this.radius=0;
}
public Circle(int initialRadius){
this.radius=initialRadius;
}
}
//circ2.cs
partial class Circle{
private int radius;
public double Area(){
return Math.PI*this.radius*this.radius;
}
}
小知识:TODO
注释:常用于标注以后要进行加工的代码,用它指出此处要完成的工作,如TODO:实现dowork方法
,在VS中视窗
->任务列表
中就会出现相关的标注,双击可以快速定位到相关位置。
–
下面是一个例子,我们新建一个控制台应用。右键项目添加新建项,选择C#类,命名为Point.cs
,代码如下
using System;
using System.Collections.Generic;
using System.Text;
namespace c_7_4_2
{
class Point
{
private int x, y;
public Point()
{
this.x = -1;
this.y = -1;
}
public Point(int x,int y)
{
this.x = x;
this.y = y;
}
public double DistanceTo(Point other)
{
int xDiff = this.x - other.x;
int yDiff = this.y - other.y;
double distance = Math.Sqrt((xDiff * xDiff) + (yDiff * yDiff));
return distance;
}
}
}
然后Program.cs
中的代码如下:
using System;
namespace c_7_4_2
{
class Program
{
static void dowork()
{
//TODO:实现dowork方法
Point origin = new Point();
Point bottomRight = new Point(1366, 768);
double distance = origin.DistanceTo(bottomRight);
Console.WriteLine($"Distance is :{distance}");
}
static void Main(string[] args)
{
dowork();
}
}
}
7.5 理解静态方法和数据
静态方法不依赖类的实例,不能访问类的任何实例字段或实例方法。只能访问标记为static的其他方法和字段。
7.5.1 创建共享字段
如下面代码:
class Circle{
private int radius;
public static int NumCircles=0;
public Circle{
radius=0;
NumCircles++;
}
public Circle(int initialRadius){
radius=initialRadius;
NumCircles++;
}
}
NumCircles
字段由所有Circle
对象共享。从外部访问字段NumCircles
要以Circle
为前缀,如Console.WriteLine($"Number of Circle object:{Circle.NumCircles}");
。
7.5.2 使用const
关键字创建静态字段
用const
声明的字段称为常量字段。
7.5.3 理解静态类
C#允许声明静态类,静态类只能包含静态成员。静态类纯粹作为工具方法和字段的容器使用。静态类不能包含任何实例数据或方法。所以用new
创建静态类的对象是没意义的,编译器会报错。为了执行初始化,静态类允许一个默认构造器,该构造器必须声明为静态。
7.5.4 静态using
语句
任何时候调用静态方法或引用静态字段都必须指定方法或字段所属的类。静态using
语句允许将类引入作用域,这样在访问时可以省略类名。如:
using static System.Math;
using static System.Console;
var root=Sqrt(99.9);
WriteLine($"The squre root of 99.9 is {root}");
由于静态using
语句会使代码的可读性降低,所以还是不建议使用。
7.5.5 匿名类
匿名类是没有名字的类。创建匿名类要以new
开头,然后花括号。
myAnonymousObject=new{Name="Johb",Age=47};
该类包含两个公共字段,编译器根据初始化字段的数据类型推断字段的类型。
可以用var
将变量声明为隐式类型。
var myAnonymousObject=new{Name="Johb",Age=47};