热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入解析C#中的构造函数及其应用

在本文中,我们将深入探讨C#中的构造函数及其应用场景。通过引入构造函数,可以有效解决在访问类属性时反复赋值导致的代码冗余问题,提高代码的可读性和维护性。此外,还将介绍构造函数的不同类型及其在实际开发中的最佳实践。

【前言】


结合上一篇博客,针对当我们访问类的属性时,反复赋值,出现代码冗余的问题,这次我们引进一个新的解决办法,就是构造函数,直接传递参数就可以实现属性值的初始化。


【内容】


普通办法访问属性缺点:

当我们访问类的属性的时候,需要多次赋值,出现了冗余的代码;当我们对zsStu.Age=-88,当对写入操作没有限制的时候,就破坏了数据的完整性,并且不安全。

static void Main(string[] args){student zsStu = new student();zsStu.Name = "张三";zsStu.Age = 18;zsStu .Gender ='男';zsStu .Chinese =90;zsStu .Math =95;zsStu .English =80;zsStu .sayhello ();zsStu .score ();//冗余Console.WriteLine("==============================");student xlStu = new student();xlStu.Name = "小兰";xlStu.Age = 16;xlStu.Gender = '女';xlStu.Chinese = 95;xlStu.Math = 85;xlStu.English = 60;xlStu.sayhello();xlStu.score();Console.ReadKey();}




解决:构造函数

这时我们就要定义构造函数:构造函数就是一个方法,但方法名是类名。




作用:

通过构造函数可以避免繁琐的赋值操作,属性为只有读操作,这样保证了属性的安全很完整性,但是属性不能赋值,如何对属性操作呢?这时可以通过构造函数对属性的值进行初始化。 




如何定义?

下面就是定义了一个Person类的构造函数,括号里面的是参数,把参数的值赋给字段。

namespace _03_类的构造函数
{public class Person{//Person类的构造函数public Person(string name,char gender,int age){this.name = name;//当前字段=参数.把变量的值赋值给字段this.age = age;this.gender = gender;}private string name;public string Name{get { return name; } }private char gender;public char Gender{get { return gender; } }private int age;public int Age{get { return age; } }

怎么实现属性的初始化操作?
当我们在主函数中实例化并调用这个方法的时候,会把值传递给上面的在Person类中定义的构造函数,也就是传参,然后把传递过来的值赋值给字段。

class Program{static void Main(string[] args){Person per = new Person("张三",'男',18);//利用构造函数给里面的字段赋值。per.Show();Console.ReadKey();//第一 之前那么赋值麻烦,繁琐//第二 变成只读,安全//per.Name = "张三";//只读,没那么容易赋值;该怎么赋值?//构造函数的出现,解决了赋值麻烦的问题}}

优点:
1.不会像之前那样繁锁地赋值
2.当为某个类定义了构造函数之后,这个类的属性为只读属性,通过构造函数就可以初始化该属性,这样保证了属性值得安全和完整性。

构造函数的重载:
在一个类中可以定义多个构造函数,以便提供多个不同的初始化方法,这些构造函数有相同的名字,只是参数的数目和类型不同。

下面定义了三个构造函数,只是参数不同。

public Person(string name, char gender, int age)//有参的构造函数,原来默认无参数的被覆盖了{this.name = name;//当前字段=参数.把变量的值赋值给字段this.age = age;this.gender = gender;}//想用到无参数的怎么办,构造函数的重载public Person() //无参数的构造函数{ }public Person(string name){this.name = name;}

构造函数如何使用?
在主函数中使用重载的构造函数,需要注意:对于对象来说,每个对象只执行其中一个构造函数。

class Program{static void Main(string[] args){//写一个类,如果没有写任何的构造函数,那么这个类有个默认无参数的构造函数;Person per = new Person();Person per1=new Person("张三",'男',18);Person per2 = new Person("小兰");}}


【总结】

构造函数是一种特殊的方法,没有返回值,没有void声明。直接传递参数就可以实现赋值操作,默认的是一个无参的构造函数,如果定义了一个有参的构造函数,则无参的就不在存在。如果想使用,则需要重新声明。









推荐阅读
  • Java学习第10天:深入理解Map接口及其应用 ... [详细]
  • 本文深入解析了Java面向对象编程的核心概念及其应用,重点探讨了面向对象的三大特性:封装、继承和多态。封装确保了数据的安全性和代码的可维护性;继承支持代码的重用和扩展;多态则增强了程序的灵活性和可扩展性。通过具体示例,文章详细阐述了这些特性在实际开发中的应用和优势。 ... [详细]
  • QT框架中事件循环机制及事件分发类详解
    在QT框架中,QCoreApplication类作为事件循环的核心组件,为应用程序提供了基础的事件处理机制。该类继承自QObject,负责管理和调度各种事件,确保程序能够响应用户操作和其他系统事件。通过事件循环,QCoreApplication实现了高效的事件分发和处理,使得应用程序能够保持流畅的运行状态。此外,QCoreApplication还提供了多种方法和信号槽机制,方便开发者进行事件的定制和扩展。 ... [详细]
  • 在Java项目中,当两个文件进行互相调用时出现了函数错误。具体问题出现在 `MainFrame.java` 文件中,该文件位于 `cn.javass.bookmgr` 包下,并且导入了 `java.awt.BorderLayout` 和 `java.awt.Event` 等相关类。为了确保项目的正常运行,请求提供专业的解决方案,以解决函数调用中的错误。建议从类路径、依赖关系和方法签名等方面入手,进行全面排查和调试。 ... [详细]
  • 本文深入探讨了Java多线程环境下的同步机制及其应用,重点介绍了`synchronized`关键字的使用方法和原理。`synchronized`关键字主要用于确保多个线程在访问共享资源时的互斥性和原子性。通过具体示例,如在一个类中使用`synchronized`修饰方法,展示了如何实现线程安全的代码块。此外,文章还讨论了`ReentrantLock`等其他同步工具的优缺点,并提供了实际应用场景中的最佳实践。 ... [详细]
  • NOIP2000的单词接龙问题与常见的成语接龙游戏有异曲同工之妙。题目要求在给定的一组单词中,从指定的起始字母开始,构建最长的“单词链”。每个单词在链中最多可出现两次。本文将详细解析该题目的解法,并分享学习过程中的心得体会。 ... [详细]
  • 开发日志:201521044091 《Java编程基础》第11周学习心得与总结
    开发日志:201521044091 《Java编程基础》第11周学习心得与总结 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • 枚举类中enum关键字的常见应用与实践
    在枚举类中,`enum`关键字具有重要的作用,本文探讨了其常见的应用场景与实践。特别指出,枚举对象必须置于枚举类的首行,否则将导致编译错误。通过具体的代码示例,详细解析了这一规则及其背后的原理,帮助开发者更好地理解和使用枚举类。 ... [详细]
  • 在Android应用开发中,实现与MySQL数据库的连接是一项重要的技术任务。本文详细介绍了Android连接MySQL数据库的操作流程和技术要点。首先,Android平台提供了SQLiteOpenHelper类作为数据库辅助工具,用于创建或打开数据库。开发者可以通过继承并扩展该类,实现对数据库的初始化和版本管理。此外,文章还探讨了使用第三方库如Retrofit或Volley进行网络请求,以及如何通过JSON格式交换数据,确保与MySQL服务器的高效通信。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • Objective-C 中的委托模式详解与应用 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • 在Java编程中,`AbstractClassTest.java` 文件详细解析了抽象类的使用方法。该文件通过导入 `java.util.*` 包中的 `Date` 和 `GregorianCalendar` 类,展示了如何在主方法 `main` 中实例化和操作抽象类。此外,还介绍了抽象类的基本概念及其在实际开发中的应用场景,帮助开发者更好地理解和运用抽象类的特性。 ... [详细]
  • 单链表的高效遍历及性能优化策略
    本文探讨了单链表的高效遍历方法及其性能优化策略。在单链表的数据结构中,插入操作的时间复杂度为O(n),而遍历操作的时间复杂度为O(n^2)。通过在 `LinkList.h` 和 `main.cpp` 文件中对单链表进行封装,我们实现了创建和销毁功能的优化,提高了单链表的使用效率。此外,文章还介绍了几种常见的优化技术,如缓存节点指针和批量处理,以进一步提升遍历性能。 ... [详细]
author-avatar
muc4093631
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有