文章目录
- 对象的概念
- 对象的创建和使用
- 匿名类型和初始化器
- 构造函数和析构函数
- 构造函数
- 析构函数
- 范例
- 参数传递
|
对象的概念
类是具有相同特征一类事物的抽象,而对象是类的实例。
类和对象有本质的区别,类是从对象中抽取出来的一类对象的描述,对象是类中的个体,是一个具体的事物,创建对象就是从抽象到具体的过程,是将类的属性和行为实例化的过程。类与对象的关系可以比喻为设计手机和具体手机的关系,类就像手机机型设计一样说明了手机所应该具备的所有属性和功能,但是手机设计并不是手机;对象就是跟据手机设计而制造出来的手机,它具有手机的所有功能,能打电话发短信。
对象的创建和使用
类是抽象的,要使用类中非静态的成员,就必须创建类的对象,创建对象就是类的实例化过程。
C#使用new运算符创建对象。
- 语法格式如下:
类名 对象名 = new 类名(参数列表);
其中,参数列表是可选的。
如创建Phone类的一个对象如下:class PhoneClass{public string brand;public string type;}class Program{static void Main(string[] args){PhoneClass Phone = new PhoneClass();//创建Phone类的一个对象Phone.brand = "huawei";Phone.type = "5G";Console.WriteLine("手机品牌是:" + Phone.brand);Console.WriteLine("手机种类是:" + Phone.type);Console.ReadKey();}}
对象的使用是通过访问对象中的非静态成员来实现的。
- 访问对象中的非静态成员语法如下:
对象名.成员名
如Phone类的一个对象的使用如下:
class PhoneClass{public string brand;public string type;}class Program{static void Main(string[] args){PhoneClass Phone = new PhoneClass();//创建Phone类的一个对象Phone.brand = "huawei";Phone.type = "5G";Console.WriteLine("手机品牌是:" + Phone.brand);//Phone对象的使用Console.WriteLine("手机种类是:" + Phone.type);//Phone对象的使用Console.ReadKey();}}
匿名类型和初始化器
匿名类型是C#3.0新增功能,能简化对象的初始值设置。使用对象初始化,创建类的对象并对其属性成员赋值。
举例如下:PhoneClass Phone = new PhoneClass(){Phone.brand = "huawei"};
例如定义类Point,有两个属性X,Y表示点的坐标
public class Point //定义Point类{ // 类的属性定义中set,get可以简写为以下形式 public double X { get; set; }//定义属性X,点的横坐标public double Y { get; set; }//定义属性Y,点的纵坐标}
使用对象初始化,可以这样创建对象并对属性赋值
Point P = new Point() { X = 0.0, Y = 0.0 }; //创建对象P并对XY赋值
使用匿名类型可以定义内嵌的类型,不需要显示的定义一个类型。假设没有定义Point类,却要使用一个Point的对象,可以使用对象初始化器,不用指定类名。
例如:var p = new { X = 0.0, Y = 0.0 }; //创建匿名类型p,并使用对象初始化器赋值。
构造函数和析构函数
对象和客观世界的事物一样,从创建到消亡都有一个生命周期,对象的创建和销毁是通过类的构造函数和析构函数来完成的。
构造函数
构造函数是类的特殊方法成员,其名称和类名相同,主要用来完成对象的初始化。
C#通过new创建对象的过程实际上就是调用类的构造函数的过程,创建对象时调用构造函数对对象进行初始化。每个类都有构造函数,如果没有定义,系统也会提供一个默认的构造函数,默认的构造函数一般不进行什么操作。在访问一个类的时候,系统最先执行构造函数中的语句。析构函数
析构函数是对象销毁前释放所占用的系统资源的类的成员。析构函数的名字是在类名前加一个“~”符号。析构函数不接受任何参数,也不返回任何值。
例如:public class Point //定义Point类{ // 类的属性定义中set,get可以简写为以下形式 Point(){//构造函数 //构造函数内容}~Point() //析构函数名{//析构函数 //析构函数内容}public double X { get; set; }//定义属性X,点的横坐标public double Y { get; set; }//定义属性Y,点的纵坐标}
范例
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace test {class Program{static void Main(string[] args){Point p1 = new Point();Console.WriteLine("无参数构造函数演示");Console.WriteLine("X:" + p1.X);Console.WriteLine("Y:" + p1.Y);Point p2 = new Point(2.0,3.0);Console.WriteLine("有参数构造函数演示");Console.WriteLine("X:" + p2.X);Console.WriteLine("Y:" + p2.Y);Console.ReadKey();}}public class Point //定义Point类{ // 类的属性定义中set,get可以简写为以下形式 public Point(){X = 0.0; Y = 2.0;//构造函数 //构造函数内容}public Point(double x,double y){X = x; Y = y;//构造函数 //构造函数内容}~Point() //析构函数名{Console.WriteLine("清理资源");//析构函数 //析构函数内容}public double X { get; set; }//定义属性X,点的横坐标public double Y { get; set; }//定义属性Y,点的纵坐标} }
运行结果:
参数传递
C#的许多方法成员是有参数的,定义方法时声明的参数是形式参数,调用方法时要给形式参数传值,传递方法的值是实参。C#有“值传递”和“引用传递”两种传递参数类型。值传递是C#默认的传递方式,使用值传递方式时,向形式参数传递实在参数的副本,方法内发生的对形式参数的更改对实在参数本身没有影响,就像文件的复印件一样,无论如何修改复印件,原件没有任何改变。如果希望所调用的方法能更改实在参数的值,则必须使用ref或out关键字声明通过引用传递方式传递参数,引用传递是把实在参数的地址传给形式参数,形式参数和实在参数指向同一个存储单元,对形式参数的改变就是对实在参数的改变。out与ref类似,二者的区别是,ref要求参数在传递之间必须初始化,out则不要求初始化。
可参考文章:
C#的两种类据类型:值类型和引用类型- 博主简介:
- 工业自动化上位机软件工程师、机器视觉算法工程师、运动控制算法工程师。目前从业于智能制造自动化行业。 博主邮箱:2296776525@qq.com
- 帮忙点个赞吧。哈哈。