类、构造函数、属性、堆和栈

一、类

1、类的定义
   类中的成员:数据成员和函数成员
   数据成员:字段、常量和事件的成员
   函数成员:方法、属性、构造方法和终结器(析构方法),运算符和索引器
   
(1)、类的字段和方法
   字段的声明
       访问修饰符    类型    字段名称;
    方法的声明
   访问修饰符    返回值类型    方法名称(参数)
   {
   方法体;
   }
   
(2)、使用这个类
    要在主函数中使用这个类,首先要先定义这个类的一个变量!
    Person p1;
    要是用这个p1需要初始化!
    p1 = new Person();
    然后才能给类中的字段赋值或使用类中的方法

(3)、set方法
    在类中定义一个 public 的字段可能会被恶意赋值,所以一般都用 private;
class Vector3
{
private float x;

    public void SetX(float x)
{
this.x = x;
}
}
要在主函数中给x赋值,就需要定义一个 public 的方法,this.x表示 private中的x

static void Main(string[] args)
{
Vector3 v1 = new Vector3;
v1.SetX(1);
}
在主函数中调用方法,在括号中赋值


二、构造函数

    构造函数是用于初始化数据的函数!
1、声明
   声明基本的构造函数就是声明一个和所在类同名的方法,但没有返回值
    public class MyClass{
   public MyClass()
   {
   这个构造函数的函数体;
   }
   }
   注意:当使用 new 创建类的时候,就会调用构造方法
         一般使用构造方法进行初始化数据的一些操作
构造函数可以重载
不写构造函数时,编译器会提供一个默认的无参的构造函数,定义了就不提供
class Vector3
{
private float x;
private float y;
    private float z;

public Vector3()
{
this.x = x;
this.y = y;
this.z = z;
}
}
定义一个构造函数为私有变量x,y,z初始化

static void Main(string[] args)
{
Vector3 v1 = new Vector3(1,1,1);
定义构造函数后就能直接在用 new 创建类的时候赋值;


三、属性

1、声明
    class Vector3
    {
        public int MyIntProp
    {
    get{return 100;}
    set{Console.WriteLine(value);}
    }
    }
当取得属性的值时,就会调用属性中的get块,所以get块需要一个返回值
当给属性设置值时,就会调用属性中的set块,可以在set块中通过value访问设置的值
Vector3 v1 = new Vector3
v1.MyIntProp = 600;
int temp = v1.MyIntProp;
Console.WriteLine(temp);
输出结果:value = 600;     temp = 100;
设置值调用set,设置多少,value就是多少。调用时返回get中的返回值
set 和  get 可以只存在一个
没有get块就不能取值 int temp = v1.MyIntProp; 就会报错
没有set块就不能给它赋值,v1.MyIntProp = 600; 会报它是只读的


2、用法
(1)、 可以通过属性访问会修改私有字段的值
    private double x; 
public double X            也可以叫做get set方法
    {
        get { return x; }
        set { x = value; }
    }

v1.X = 100;
Console.WriteLine(v1.X);

(2)、通过 set 在设置值前做一些校验的工作
    private int age;
    public int Age
{
set{
if(value >= 0)
{
age = value;
}
}
}

(3)、设置属性的只读和只写
    private double x; 
public double X           
    {
        get { return x; }
        private set { x = value; }
    }
在 get 或 set 前单独加 private , private set 不能赋值,只读
                                  private get 不返回值,只写

3、自动实现属性
   private string name;
   public string Name{get;set;}
   编译器会自动给我们提供一个字段,来存储name
   
   

四、匿名类型

不指定对象的类型叫匿名类型
关键字: var
使用 var 声明的变量,当初始化时,这个变量的类型就被创建下来,以后都不能改变!
var i = 1000;        i现在就是 int 类型的,无法改变


五、程序运行时的内存区域:堆和栈

    内存:堆空间 和 栈空间
栈空间比较小,但是读取速度快
堆空间比较大,但是读取速度慢
1、栈(先进去的最后一个出!)
    数据只能从栈的顶端插入和删除
    把数据放入栈叫入栈 (push)
    从栈顶删除数据叫出栈 (pop)

2、堆
    堆是一块内存区域,堆里的数据能以任意顺序存入和移除

3、GC Garbage Collector 垃圾回收器
   CLR的GC就是内存管理机制
   
4、值类型和引用类型
   值类型(整数、bool、struct、char、小数)
   引用类型(string 数组、自定义的类、内置的类)
   值类型只需要一段单纯的内存,用于存储实际的数据(单独定义时放在栈中)
   引用类型需要两端内存:(1)存储实际的数据,放在堆中
                         (2)是一个引用(地址),指向数据在堆中存放的位置
 
例子1:  
string num1 = "siki";
string num2 = "monkey";
num1 = num2;
num1 = "add";
描述:
当两个引用类型的变量相互赋值时,其实改变的是它的引用地址!
把num2赋值给num1时,其实给的是一个地址,num1不在指向siki,指向monkey
给num1重新赋值add时,num1不指向monkey指向add

例子2:
    Vector3 v = new Vector3();
v.x = 100;
v.y = 100;
v.z = 100;
vector3 v2 = new vector3();
v2.x = 200;
v2.y = 200;
v2.z = 200;
v2 = v;
v2.x = 300;
描述:
    把v赋值给v2时,传递的是一个引用地址,v和v2都指向v中的堆空间中的数据
所以无论哪个对象修改值,都是同一个  ,所以v.x也等于300
展开阅读全文

没有更多推荐了,返回首页