构造器(C#) ╰半橙微兮° 2022-08-21 00:12 180阅读 0赞 一个东西的出现自然是有原因的,就像构造器一样。那为什么会有构造器呢? 首先,类都有默认的构造器,不管你是否显示定义。当我们要读取或赋值类中的属性时,需要先用new操作符实例化一 个类的对象,然后再进行操作。 假如这么一个情况:你实例化类的对象之后,忘了给字段赋值了,而字段恰好没在声明时进行赋值,那么实例化的对 象并没有了实质的意义,因为里面是无效的字段,字段并没有值。一旦这种情况发生的多了,编译器也不警告,那么 会无缘无故占用内存空间,而且让代码很难读懂。 针对以上问题,往往我们没必要依赖默认构造器,我们大可显式定义默认构造器,提供在创建对象时指定必需的数 据。定义构造器就是创建一个方法名与类名完全相同的方法,且方法没有返回类型。 那么有这样一个情形,一个字段在声明时进行了赋值,在构造器内部也进行了赋值。那么最终字段的值以哪个为准 呢?代码执行的顺序是,声明时赋值之后,构造器内部赋值再发生;也就是说构造器赋值会覆盖字段声明时的赋值, 最终生效的是构造器赋值。 与构造器相关的还有对象初始化器(对象初始化列表)和集合初始化器。另外构造器还可以重载,而比构造器重载好一 些的是使用带有附加参数的构造器,可以使用可选参数来替代重载,这样也可以清除地看出"默认"属性的默认值。 有时候在构造器重载时,发现大量的代码都是重复的,所以维护起来也不方便。而完全可以在一个构造器中调用另一 个构造器,避免重复的代码。这样的想法可以用构造器初始化器来实现,成为构造器链。初始化器会在执行当前构造 器实现之前,判断调用另外的哪一个构造器。 请看下面一个例子: public ConstructorExample() { this.InitializeComponent(); Phone phone1 = new Phone("Microsoft",3499); txtblk1.Text = string.Format("手机1的品牌和价格分别是:{0},{1}元",phone1.Brand,phone1.Price); //对象初始化器,格式是在构造器后添加一对{},大括号里添加构造器里的属性之外的成员属性,进行初始化 Phone phone2 = new Phone("Nokia", 1799) { MemorySize = "8G",ScreenSize = 5}; txtblk2.Text = string.Format("手机2的品牌和价格分别是:{0},{1}元", phone2.Brand, phone2.Price); txtblk3.Text = string.Format("手机2的容量和屏幕分别是:{0},{1}寸", phone2.MemorySize, phone2.ScreenSize); //利用构造器链定义的构造函数 Phone phone3 = new Phone("HTC", 6, "32G", 2399); txtblk4.Text = string.Format("手机3的品牌和价格分别是:{0},{1}元", phone3.Brand, phone3.Price); txtblk5.Text = string.Format("手机3的容量和屏幕分别是:{0},{1}寸", phone3.MemorySize, phone3.ScreenSize); //在下面的构造函数中并没有显式定义phone4对象的MemorySize值,但依旧能输出MemorySize值为16G Phone phone4 = new Phone("BlackBerry", 4.0); txtblk6.Text = string.Format("手机3的品牌,屏幕和容量分别是:{0},{1}寸,{2}", phone4.Brand, phone4.ScreenSize,phone4.MemorySize); Phone phone5 = new Phone("BlackBerry", 4, "4G"); txtblk7.Text = string.Format("手机3的品牌,屏幕和容量分别是:{0},{1}寸,{2}", phone5.Brand, phone5.ScreenSize, phone5.MemorySize); //集合初始化器 List<Phone> phones = new List<Phone>() { new Phone("Microsoft",3499), new Phone("Nokia",1799), new Phone("HTC",6,"32G",2399), new Phone("BlackBerry",4.0), new Phone("BlackBerry", 4, "4G") }; } class Phone { public string Brand { get; set; } public double ScreenSize { get; set; } public string MemorySize { get; set; } public int Price { get; set; } public Phone(string brand,int price) { Brand = brand; Price = price; } //构造函数链格式-this:(参数1,参数2...) public Phone(string brand,double screenSize,string memorySize,int price):this(brand,price) { ScreenSize = screenSize; MemorySize = memorySize; } //在一些情况下利用可选参数来代替函数重载更为简洁有效 public Phone(string brand,double screenSize,string memorySize="16G") { Brand = brand; ScreenSize = screenSize; MemorySize = memorySize; } } 结果截图: ![20160307162612895][] [20160307162612895]: /images/20220731/88830555c5bd49a484faeb75d0fcf915.png
相关 Java构造方法(构造器) 目录 1.什么是构造方法? 2.构造方法的使用 -------------------- 1.什么是构造方法? 构造方法(也称构造器 constructor):是 电玩女神/ 2023年10月14日 11:19/ 0 赞/ 21 阅读
相关 Scala主构造器和辅助构造器 类比下 Java构造器 Java构造器 基本语法 [修饰符] 方法名(参数列表) { 构造方法体 } 细节说明 1)在 Java 中一个 忘是亡心i/ 2023年01月13日 14:59/ 0 赞/ 213 阅读
相关 C/C++编程:初始化器列表构造函数 > 以前,C++可以使用小括号、大括号、复制操作符等来初始化一个变量, 现在(从C++11开始算起),在C++初始化一个变量时,建议都使用`{}`来初始化 一致性初始化 电玩女神/ 2023年01月03日 04:20/ 0 赞/ 206 阅读
相关 【基础】构造器 一 构造器介绍 对于方法的创建,可将其想象成为自己写的每个类都调用一次 initialize()。 这个名字提醒我们在使用对象之前,应首先进行这样的调用。但不幸的是 红太狼/ 2022年08月23日 08:56/ 0 赞/ 182 阅读
相关 构造器(C#) 一个东西的出现自然是有原因的,就像构造器一样。那为什么会有构造器呢? 首先,类都有默认的构造器,不管你是否显示定义。当我们要读取或赋值类中的属性时,需要先用new操作符实例化 ╰半橙微兮°/ 2022年08月21日 00:12/ 0 赞/ 181 阅读
相关 构造器 构造器的作用:创建对象 构造器格式:访问修饰符 类名(参数列表) \{ \} 为什么不写返回类型呢?因为本身构造器的作用就是返回一个对象,不允许更改其返 小灰灰/ 2022年06月04日 04:47/ 0 赞/ 236 阅读
相关 构造器注入 【例】通过构造器为User注入属性 在User类中创建有参构造方法 package com.shw; public class User { 深碍√TFBOYSˉ_/ 2022年05月21日 23:30/ 0 赞/ 229 阅读
相关 scala构造器 [2019独角兽企业重金招聘Python工程师标准>>> ][2019_Python_] ![hot3.png][] object ConstructorTest \{ 墨蓝/ 2022年01月14日 01:21/ 0 赞/ 303 阅读
相关 C#构造器(也叫作构造函数) 定义和作用:构造器是在构建类的 引用时 自动运行的方法。所以,每个类都必须至少要有一个构造器。 在访问一个类的时候,编译器最先执行构造器中的代码。 它与类同名,带参数 怼烎@/ 2021年09月27日 00:50/ 0 赞/ 462 阅读
还没有评论,来说两句吧...