PS:注释和讲解全在代码中
1. 类的定义
类与对象关系图:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; //↑↑↑引入了5个系统自带的命名空间
//using C4_程序设计; 引入一个命名空间,例如“C4_程序设计(自身)”就是一个命名空间,只有引用了对应的命名空间,才能使用该空间中的类
namespace C4_程序设计 //最外层的这个namespace就是命名空间了
{
class Point
{
public int x, y; //字段:变量
private double val;
public Point(int x=0, int y=0, double val=0) //方法:函数(这里是构造函数)
{
this.x = x; //构造函数/方法/规则和C++一样,当然也可以重载
this.y = y; //如果没有定义构造函数,则会有默认构造函数,但是定义了的话默认构造函数就不再生效
this.val = val;
}
public double Val //属性:保护赋值,为了防止恶意赋值,例如一个人的年龄不可能超过1000岁,也不可能为负数
{
get //当通过属性名取值的时候,会自动调用get中的代码,获得val的值
{
return val;
}
set //当通过属性名给字段赋值的时候,会自动调用set中的代码,给val赋值
{
if (value >= 100) //当输入的值超过100,那么默认为100
val = 100;
else if (value <= 0) //输入为负数时默认为0
val = 0;
else
val = value;
}
}
public void Print()
{
Console.Write("{0},{1}:{2}\n", x, y, val);
}
~Point() //析构函数,也和C++规则一样
{
//当然这个类完全没必要写个析构函数就是了,直接默认析构就好
}
}
class 对象定义
{
static void Main()
{
Point me = new Point(0,0,0); //对象的实例化
/*
new实例化关键字到底做了什么??
①在内存(堆空间)中开辟了一块空间
②在开辟出来的这个空间中创建对象数据
③调用对象的构造方法进行对象的初始化
*/
me.x = me.y = 5; //如果不定义默认为0
me.Val = 1500;
//me.val = 15; //错误,因为是私有的,所以不能直接赋值
Console.Write("{0},{1}:{2}\n", me.x, me.y, me.Val); //输出结果为5,5:100
Point you;
you = me; //赋值的过程为传递堆空间中的引用地址,you和me指向了同一个堆空间地址
me.x = me.y = -1000; //因此当你修改了me的内容,you也会被改变,毕竟两者指向的是同一个对象
you.Print(); //输出结果为-1000,-1000:100
/*是的,在这里C#和C++的机制就完全不一样,C#在执行“Point you”这一语句时,只是在栈中生成一个长度位4字节的引用变量you,并且缺省为null,即该引用不指向任何实例
C#也没有复制构造函数
C#和C++还不一样的地方就是:C#只有值和引用两种类型,而不支持指针(只有在unsafe模式下才可对指针进行操作)
值类型通常是基本数据类型,如int,double,还有struct等;而所有的自定义的类,还有数组、代表、接口等都是引用类型
这也很明显能看的出来,C++的引用和C#的引用基本上不是一个东西,对于C#的引用,它更像是个“指针”
*/
}
}
}