类的定义
当你定义一个类,相当于定义一个数据类型的蓝图,这实际上没有定义任何数据,但它定义了类的名称意味着什么。 也就是说类的对象由什么组成以及在这个对象上执行什么行为。对象是类的实例 ,构成类的方法和变量被称为类的成员
类是由关键字class 后面跟 类名 。类的主体包含在花括号内
csharp
namespace Learn3
{
internal class Program
{
//类的默认级别为internal Person为类的名称
class Person
{
//类的主体
//类的成员默认级别为private
//string Name = "";
//int Age;
public string Name = "";
public int Age;
}
static void Main(string[] args)
{
}
}
}
我们可以通过new来实例化出类的对象,进行操作
csharp
namespace Learn3
{
internal class Program
{
//类的默认级别为internal Person为类的名称
class Person
{
//类的主体
//类的成员默认级别为private
string Name = "";
int age;
}
static void Main(string[] args)
{
//这一步通过new 来实例化类的对象 此时的per是类的对象
Person per = new Person();
}
}
}
使用对象
由于类中的成员默认级别是private因此我们无法在类外部访问,因此我们需要使用public或internal修饰符让我们得到对象成员可以访问
csharp
namespace Learn3
{
internal class Program
{
class Person
{
//使用public或internal访问修饰符 可以使我们在类外部进行访问
public string Name="";
public int Age;
}
static void Main(string[] args)
{
//实例化对象
Person per = new Person();
//通过 . 的方式来进行调用
per.Name = "张三";
per.Age = 10;
Console.WriteLine($"这个人叫{per.Name},他今年{per.Age}了");
}
}
}
类中的成员函数
类的成员函数是一个在类定义中有它的定义或原型函数。作为类的成员,它可以在类的任何对象上操作。并且能访问该对象的类的所有成员(static成员除外,如果想访问static成员需要使用静态函数)
csharp
namespace Learn3
{
internal class Program
{
class Person
{
public string Name="";
public int Age;
public void GetInfo()
{
Console.WriteLine($"这个人叫{Name},他今年{Age}了");
}
}
static void Main(string[] args)
{
Person per = new Person();
per.Name = "张三";
per.Age = 10;
per.GetInfo();
}
}
}
类的静态成员
类的静态成员需要使用static声明。static修饰过的成员它属于类本身而不是实例化对象的本身。
csharp
namespace Learn3
{
internal class Program
{
class Person
{
public string Name="";
public int Age;
//static 静态修饰后 Num为静态成员变量只属于类本身
public static int Num;
public void GetInfo()
{
Console.WriteLine($"这个人叫{Name},他今年{Age}了");
}
}
static void Main(string[] args)
{
Person per = new Person();
Person.Num = 1;//Num成员属于类本身而不属于类的对象
}
}
}
而如果希望类中的函数只能访问静态成员就需要使用static进行修饰函数
csharp
namespace Learn3
{
internal class Program
{
class Person
{
public string Name="";
public int Age;
//静态变量成员
public static int Num;
public void GetInfo()
{
Console.WriteLine($"这个人叫{Name},他今年{Age}了");
}
//属于类本身只能访问静态字段
public static void GetNum()
{
//Console.WriteLine(Name);//报错 无法访问非静态字段
Console.WriteLine(Num);//访问静态字段
}
}
static void Main(string[] args)
{
Person per = new Person();
Person.Num = 1;//Num成员属于类本身而不属于类的对象
Person.GetNum();//同理GetNum函数成员属于类本身而不属于类的对象
}
}
}
构造函数
类的构造函数是类的一个特殊的成员函数,当创建类时运行。构造函数的名字与类名完全相同,且无任何返回值 并且在类中允许你创建多个构造函数,它通过重载来找到对应的构造函数
csharp
namespace Learn3
{
internal class Program
{
class Person
{
public string Name="";
public int Age;
//构造函数名与类名一致且无返回值 无参
public Person()
{
Console.WriteLine("实例化对象已创建");
}
}
static void Main(string[] args)
{
Person per = new Person();
per.Name = "张三";
Console.WriteLine("名字:"+per.Name);
}
}
}
有参构造函数
同时它允许你对构造函数传递参数,也叫有参构造函数,一般用于初始化赋值
csharp
namespace Learn3
{
internal class Program
{
class Person
{
public string Name="";
public int Age;
public void GetInfo()
{
Console.WriteLine($"这个人叫{Name},他今年{Age}了");
}
//有参构造函数 初始化对象
public Person(string name,int age)
{
Name = name;
Age = age;
Console.WriteLine("实例化对象已创建");
}
}
static void Main(string[] args)
{
// 传递参数
Person per = new Person("张三",18);
per.GetInfo();
}
}
}
析构函数
析构函数时类的一个特殊函数成员,当类超出范围时运行 析构函数的名称是在类的名称前加上一个波浪形(~)作为前缀,它不返回值,也不带任何参数。
析构函数用于在结束程序(比如关闭文件、释放内存等)之前释放资源。析构函数不能继承或重载。
csharp
namespace Learn3
{
internal class Program
{
class Person
{
public string Name="";
public int Age;
public void GetInfo()
{
Console.WriteLine($"这个人叫{Name},他今年{Age}了");
}
//有参构造函数 初始化对象
public Person(string name,int age)
{
Name = name;
Age = age;
Console.WriteLine("实例化对象已创建");
}
//结束程序之前运行
~Person()
{
Console.WriteLine("对象被销毁");
}
}
static void Main(string[] args)
{
// 传递参数
Person per = new Person("张三",18);
per.GetInfo();
}
}
}
类中构造函数的this关键字
this关键字在构造函数中有两种用法
- 引用当前实例,构造函数中this指向你实例化的对象
- 链式调用构造函数 使用:this语法,一个构造函数可以调用同一个类中的另一个构造函数,避免代码重复,通常较少的调用较多的。它与重载相结合
引用当前实例 如下,构造函数中的this指向实例化对象
csharp
namespace Learn3
{
internal class Program
{
class Person
{
public string Name="";
public int Age;
public Person(string name,int age)
{
//此时this指向类的实例化对象,上下文中的per对象
this.Name = name;
Console.WriteLine("实例化对象已创建");
}
}
static void Main(string[] args)
{
Person per = new Person("张三",18);
}
}
}
链式调用构造函数
csharp
namespace Learn3
{
internal class Program
{
class Person
{
public string Name="";
public int Age;
public void GetInfo()
{
Console.WriteLine($"这个人叫{Name},他今年{Age}了");
}
public Person(string name,int age)
{
this.Name = name;
this.Age = age;
Console.WriteLine("实例化对象已创建");
}
//实例化出Person的对象如果传参是一个单一的string类型根据重载编译器会先走这个构造函数,而我们通过:this又指向了上方的构造函数并且传递a参数和11参数 对对象进行初始化赋值
public Person(string a):this (a,11)
{
//此处可以是空的或者包含初始化逻辑
}
}
static void Main(string[] args)
{
Person per = new Person("张三");
per.GetInfo();
}
}
}