从一般到特殊-C#中的对象
文章目录
- 对象的概念
- 对象的创建和使用
- 匿名类型和初始化器
- 构造函数和析构函数
- 构造函数
- 析构函数
- 范例
- 参数传递
|
对象的概念
类是具有相同特征一类事物的抽象,而对象是类的实例。
类和对象有本质的区别,类是从对象中抽取出来的一类对象的描述,对象是类中的个体,是一个具体的事物,创建对象就是从抽象到具体的过程,是将类的属性和行为实例化的过程。类与对象的关系可以比喻为设计手机和具体手机的关系,类就像手机机型设计一样说明了手机所应该具备的所有属性和功能,但是手机设计并不是手机;对象就是跟据手机设计而制造出来的手机,它具有手机的所有功能,能打电话发短信。
对象的创建和使用
类是抽象的,要使用类中非静态的成员,就必须创建类的对象,创建对象就是类的实例化过程。
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
- 帮忙点个赞吧。哈哈。
从一般到特殊-C#中的对象相关推荐
- 使用Python,OpenCV的Meanshift 和 Camshift 算法来查找和跟踪视频中的对象
使用Python,OpenCV的Meanshift 和 Camshift 算法来查找和跟踪视频中的对象 1. 效果图 2. 源码 2.1 MeanShift 2.2 Camshift(Continuo ...
- Python OpenCV分水岭算法分割和提取重叠或有衔接的图像中的对象
本文将介绍如何使用分水岭算法对触摸和重叠的图像中的对象进行分割和提取. 参考:https://www.pyimagesearch.com/2015/11/02/watershed-opencv/ 分水 ...
- java判断一个对象是否为空_Java中判断对象是否为空的方法的详解
首先来看一下工具StringUtils的判断方法: 一种是org.apache.commons.lang3包下的: 另一种是org.springframework.util包下的.这两种StringU ...
- 【性能优化】面试官:Java中的对象和数组都是在堆上分配的吗?
写在前面 从开始学习Java的时候,我们就接触了这样一种观点:Java中的对象是在堆上创建的,对象的引用是放在栈里的,那这个观点就真的是正确的吗?如果是正确的,那么,面试官为啥会问:"Jav ...
- TensorFlow中的对象检测教程:实时对象检测
导言 创建能够在单个图像中识别和定位多个对象的精确机器学习模型仍然是计算机视觉中的核心挑战.但随着最近深度学习的进步,对象检测应用程序比以往更容易开发.TensorFlow的对象检测API是一个构建与 ...
- 11JavaScript中的对象
技术交流QQ群:1027579432,欢迎你的加入! 1.对象 对象是一个具体的事物,看得见摸得着的实物. 在JS中,对象是一组无序的相关属性和方法的集合.所有的事物都是对象,例如字符串.数值.数组. ...
- ICCV2021|一种用于解决点云场景中同类对象分割的网络
首次提出:一种用于解决点云场景中同类对象分割的端到端网络 融合协同对比学习和相互注意采样机制进行无监督点云对象的同类分割 Unsupervised Point Cloud Object Co-segm ...
- 创建健壮的isArray()函数(JavaScript中判断对象类型的种种方法)
我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...
- ORACLE Recyclebin管理及flashback recyclebin中的对象
Flashback用于恢复用户误删除的对象(包括表,索引等), 不支持sys用户. system表空间下的对象,也不能从回收站里拿到. 故使用SYS 或者SYSTEM用户登陆时, show recyc ...
- .net中的对象序列化(1): 序列化是什么, 以及一个简单的例子
1. 为什么需要序列化,什么是序列化 对于一个程序来说, 使用到的对象都是存在于内存中的.如果想保存这些对象的运行时状态, 或者需要在不同进程或者网络间传递对象,就需要序列化. 序列化就是讲运行中的对 ...
最新文章
- python类型转换-Python基本数据类型转换
- Spring-常见问题25问
- 应用篇——SSL/TLS
- 剑指offer面试题27:二叉搜索树与双向链表
- 正则表达式匹配多个字符串中的一个
- 简洁的架构还能高效和准确?清华华为提出新型残差循环超分模型:RRN!
- 配置CACTI监控MySQL数据库状态(2)安装cacti相关软件包
- 用tensorflow实现线性回归算法
- 电化学血糖传感器原理及发展
- 微信公众号模板消息的申请
- TI公司CC系列的各种芯片的区别 CC2430 CC1100
- xml文件中SQL语句的大于号、小于号、等于号的转义问题
- 卷积在深度学习中的作用
- 全国31个省份农产品进口出口额省级数据2001-2021
- 植物纳米探测器简介 | 综述(Nanobiotechnology approaches for engineering smart plant sensors)
- Word中㎡的上标²变成了2该如何处理
- 刻意学习:持续行动让你人生逆袭
- Ninja is required to load C++ extensions in Pycharm
- python中计时方法
- “终端有鸿蒙,云端有安超!” 鸿蒙落地,安超有什么新动作?