C#关于类(1)

    xiaoxiao2021-03-26  36

    类的定义与使用

    当类编写时与C++相似class Cat(){}

    当类定义时:cat Kitty = new Cat();

    属性

    在Java中如果定义一个私有private成员变量,在修改该成员变量时一般会定义Set()和Get()两个函数访问器来进行修改和获取

    在C#中可以用属性:假如定义了一个Cat类

    class Cat

    {         private string name; //此处名字暂时不管         private int age; public int Age//这个变量下的属性类似于一个函数

    {

    get

    {

    return age;

    }

    set

    {

    if(value < 0) age = 0;//年龄不能为负,可以在属性中进行合法性的检查

    else age = vlaue; //vlaue是一个关键字,这个关键字相当于函数的参数,值就是Age的值

    }

    }

    在使用属性赋值时方法如下:

    Cat Kitty = new Cat();

    Kitty.Age = 3;

    Console.writeLine("我今年{0}岁了",Kitty.Age);

    属性中兼顾了封装性、合法性的检查、符合变量使用的习惯

    构造函数

    当定义一个类的变量时,使用Cat Kitty = new Cat(); //其中Cat()就是类函数,也就是构造函数

    在创建对象时,系统先为对象的成员变量分配内存,然后通过构造函数初始化对象的成员变量

    每一个类中都有一个默认的构造函数,如Cat类中的默认构造函数就是Cat(),默认的构造函数不用声明。

    (默认的构造函数会把整数初始化为0,字符串初始化为空。。。)

    当创建对象时,系统会调用默认的构造函数,如果你不自定义(显式地写出)构造函数,系统同样会调用默认的构造函数

    自定义构造函数可以带参数,也可以不带参数

    如:

    class Cat

    {

    private string name;

    private int age;

    public Cat(string nameTmp, int ageTmp)//有两个参数的构造函数

    {

    name = nameTmp;

    age = ageTmp;

    }

    }

    定义时:

    Cat Kitty = new Cat("Kitty", 3);

    若自定义了有参数的构造函数,还想使用默认的无参的构造函数,则要显式地定义出来:

    class Cat

    {

    private string name;

    private int age;

    public Cat()//显式地定义出无参的构造函数

    {

    name = "";

    age = 0;

    }

    public Cat(string nameTmp, int ageTmp)

    {

    name = nameTmp;

    age = ageTmp;

    }

    }

    析构函数

    不用的对象要及时删除释放内存空间,在传统的面向对象设计中用类的析构函数删除对象

    ~Cat()

    {}

    类在定义的时候会生成一个默认的析构函数,因为C#是.NET程序,有非常完善的垃圾回收机制,所以一般情况下析构函数是没必要编写的

    需要手动编写析构函数的地方一般是一些不需要.NET的非托管的代码

    (垃圾回收器一般何时运行具有不确定性,可以调用System.Gc.Collect()进行强制运行)

    静态变量(静态字段)

    当类中的一个变量在类型前加上关键字static,则该成员变量为静态变量,必须由类直接调用

    class Cat

    {

    private static int catCount = 0;

    public Cat()

    {

    catCount++;//每次在定义一个Cat类型时都会在原有的catCount上加一

    }

    ~Cat()

    {

    catCount--;//每次销毁一个Cat类型变量都会减一,其实此处析构函数并不用编写,C#有很好的回收机制

    }

    }

    在调用时,必须要通过类来使用,如定义6个Cat类型后调用catCount:

    Cat[] cats = new Cat[6];

    for(int i=0; i<cats.Length; i++)

    {

    cats[i] = new Cat();

    }

    Console.WriteLine("一共有{0}只猫",Cat.catCount;); //此处直接由Cat类调用了catCount这个变量

    静态函数(静态方法)

    静态函数必须由类直接调用,如Math类中的Sin()函数:

    static这个关键字可以写在public和private之前或之后(如:public static void Meow() 或 static public void Meow())

    double sinVlaue = Math.Sin(12);

    而非静态的方法就要用对象来调用。

    自定义的静态方法:

    class Calculate

    {

    public static double Add(double x, double y){return x+y;}

    public static double Sub(double x, double y){return x-y;}

    }

    调用的时候:

    double x= 2 ;

    double y = 1;

    double z = Calculate.Add(x, y);

    const常量

    const常量在定义时就需要进行赋值,且不能修改:

    class Circle

    {

    private const double PI = 3.1415926;//此处PI其实是隐示静态的const常量,

    //完整的形式是private static const double PI = 3.1415926;只是为了方便省略了,所以此处要被类使用

    private double banjing;

    }

    在使用时:

    Circle circleOne = new Circle();

    Console.WriteLine("圆周率{0}",Circle.PI); //此处由const是隐示的静态字段,所有要用类来调用

    Console.WriteLine("半径{0}",circleOne.banjing); //banjing字段是显示的,要用对象来调用

    readonly

    只读,readonly是非静态的,其在定义时可以不赋值,可以在其他任意地方赋值,但一旦赋值就不可再更改

    class Hotel

    {

    public readonly int roomNumber;

    public Hotel(int roomNumberValue)

    {

    roomNumber = roomNumberValue;

    }

    }

    readonly与const不同的地方除了赋值的地方,还有使用时的方式,const必须用类调用,如Cat.PI,而readonly要用对象调用,如:

    Hotel asHome = new Hotel();  

    Console.WriteLine("{0}",asHome.roomNumber);

    PS:

    在类中,可以用该类自身定义成员变量,如在Cat类中定义一个Cat的成员变量:

    class Cat

    {

    private int age;

    private Cat Kitty;

    }

    (在定义类的变量时一般都是Cat Kitty = new Cat();其实在定义其他变量时也是如此,如:int count = new int();通常为了方便不写,但是类的定义必须写)

    转载请注明原文地址: https://ju.6miu.com/read-650313.html

    最新回复(0)