c#学习相关系列之构造函数

news2024/7/4 4:51:55

目录

一、构造函数的作用

二、构造函数的特征

三、三种构造函数介绍

1、实例构造函数

2、静态构造函数

3、私有构造函数


一、构造函数的作用

       构造函数用来创建对象,并且可以在构造函数中对此对象进行初始化。构造函数具有与类相同的名称,它通常用来初始化对象的数据成员。

        C#中构造函是在创建给定类型的对象时执行的类方法。构造函数是一个特殊的方法,无论什么时候,只要使用new运算符实例化对象,并且不为 new 提供任何参数,就会调用默认构造函数。除非类是静态的,否则C#编译器将为无构造函数的类提供一个公共的默认构造函数,以便该类可以实例化。在new实例化类的过程中,会执行类内对应的构造函数进行初始化,若无构造函数的,则会自动调用无参默认构造函数,静态构造函数会在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数以初始化类。

构造函数的分类可以为:实例构造函数、静态构造函数、私有构造函数

二、构造函数的特征

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            student st = new student(10, "lihua") { ID = 10, number = 5 };
            //构造函数可以在实例化过程中初始化私有的属性,{ }大括号可以初始化公有属性的数据
            st.ccn();
            st.Info();
            Console.Read();
        }
    }
    public class student
    {
        private string name;
        private int age;
        public int ID;
        public int number;
        public student()
        { 
        
        }
        public student(int age,string name)
        {
            this.age = age;
            this.name = name;
        }
        public void ccn()
        {
            Console.WriteLine("该学生的名字为:"+name+"   "+"年龄为:"+age);
        }
        public void Info()
        {
            Console.WriteLine("该学生的学号为:" + ID + "   " + "名次为:" + number);
        }
    }
}
  1. 构造函数可以有重载!
  2. 构造函数没有返回值,连void也不能写。
  3.  构造函数的名称必须跟类名一样。
  4. 构造函数的访问修饰符一般情况下访问修饰符为public(当然也有private)。
  5. 构造函数不能直接被调用,必须通过关键字new在创建对象时自动调用。
  6. 不带参数的构造函数称为“默认构造函数”。无论何时,只要使用new运算符实例化对象,并且不为new提供任何参数,就会调用默认构造函数。(即创建构造方法(函数)后,在类当中会生成一个一默认的无参数的构造函数,但是当你写个新的构造函数之后,不管是有参数的还是无参数的,那个默认的无参数的构造函数都被干掉了)。
  7. 如果一个类中定义了有参构造函数,实例化时需要调用无参构造函数,这时我们就必须定义一个显式无参数构造函数,否则运行会报错。

三、三种构造函数介绍

1、实例构造函数


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace _2022_07_19
{
    class Student
    {
        public Student(string name, int age, char gender, int id)
        {
            this.Name = name;
            this.Age = age;
            this.Gender = gender;
            this.Id = id;
        }
        public string Name;
        public int Age;
        public char Gender;
        public int Id;
 
        public Student(string name, int age, char gender)
        {
            this.Name = name;
            this.Age = age;
            this.Gender = gender;
        }
        public void SayHello1()
        {
            Console.WriteLine("我叫{0},我今年{1},我是{2}生,我的学号是{3}。",Name,Age,Gender,Id);
 
        }
        public void SayHello2()
        {
            Console.WriteLine("我叫{0},我今年{1},我是{2}生。", Name, Age, Gender);
        }
    }
}

 注意:1、定义了有参构造函数,则不能再使用无参默认构造函数,也就是在new实例化的时候必须在构造函数内传入参数。

2、构造函数可以重载,在定义了有参构造函数后可以重写一个无参构造函数,就可以使用无参构造函数了,否则将报错。

2、静态构造函数

     在C#中,可以为类定义静态构造函数,这种构造函数只执行一次。编写静态构造函数的主要原因是类有一些静态字段或属性,需要在第一次使用类之前,从外部源中初始化这些静态字段或属性。在定义静态构造函数时,不能设置访问修饰符,因为其他C#代码从来不会调用它,它只在引用类之前执行一次;另外,静态构造函数不能带任何参数,而且一个类中只能有一个静态构造函数,它只能访问静态成员,不能访问实例成员。  在类中,静态构造函数和无参数的实例构造函数是可以共存的,因为静态构造函数是在加载类时执行的,而无参数的实例构造函数是在创建类的对象时执行的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            student st = new student(10, "lihua") { ID = 10, number = 5 };
            st.ccn();
            st.Info();
            Console.Read();
        }
    }
    public class student
    {
        private string name;
        private int age;
        public int ID;
        public int number;
        public student()
        { 
        
        }
        static student()
        {
            Console.WriteLine("这里是静态构造函数");
        }
        public student(int age,string name)
        {
            this.age = age;
            this.name = name;
        }
        public void ccn()
        {
            Console.WriteLine("该学生的名字为:"+name+"   "+"年龄为:"+age);
        }
        public void Info()
        {
            Console.WriteLine("该学生的学号为:" + ID + "   " + "名次为:" + number);
        }
    }
}

  1. 静态构造函数不使用访问修饰符或不具有参数。
  2. 在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数以初始化类。
  3. 不能直接调用静态构造函数。
  4. 无法控制在程序中执行静态构造函数的时间。
  5. 静态构造函数的一种典型用法是在类使用日志文件且将构造函数用于将条目写入到此文件中时使用。
  6. 静态构造函数对于创建非托管代码的包装类也非常有用,这种情况下构造函数可调用 LoadLibrary 方法。
  7. 如果静态构造函数引发异常,运行时将不会再次调用该函数,并且类型在程序运行所在的应用程序域的生存期内将保持未初始化。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApp2
{
    class Program
    {
        public static int X = 0;//静态变量
                                //实例构造函数
        public Program()
        {
            X = 1;
        }
        //静态构造函数
        static Program()
        {
            X = 2;//第二步,执行静态构造函数
        }
        //第一步,程序入口Main最先执行,然后执行静态变量public static int X = 0
        static void Main(string[] args)
        {
            Console.WriteLine(X);//结果为2
            Program dd = new Program();//第三步,执行构造函数
            Console.WriteLine(X);//结果为1
            Console.ReadLine();
        }
    }
}

      调用类的静态函数时的执行顺序:

  • 静态变量==>静态构造函数==>实例构造函数
  • 静态变量==>静态构造函数==>静态函数

        那么调用类的实例函数时的执行顺序则是:

  • 非静态变量==>实例构造函数==>实例函数

3、私有构造函数

       私有构造函数是一种特殊的实例构造函数。 它通常只在包含静态成员的类中。 如果类具有一个或多个私有构造函数而没有公共构造函数,则在其他类(除嵌套类外)中无法进行实例化。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApp2
{
    class Program
    {
        int i = 0;
        private Program()
        {
            i = 9;
        }
        static void Main(string[] args)
        {
            Program ss = new Program();
            Console.WriteLine($"i={ss.i}");//运行结果:i=9
            Console.ReadLine();
        }
    }
    class person
    {
        //Program ddd = new Program();//注释打开会报错,错误信息:不可访问,因为它受保护级别限制。因为私有构造函数无法在类的外面实例化。
    }

参考文献:

【精选】C# 第五章『面向对象』◆第3节:构造函数(方法)_c#构造方法-CSDN博客 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1137015.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每日一练 | 网络工程师软考真题Day45

阅读以下说明,答复以下【问题1】至【问题4】 【说明】 某公司有1个总部和2个分部,各个部门都有自己的局域网。该公司申请了4个C类IP地址块 202.114.10.0/24~202.114.13.0/24。公司各部门通过帧中继网络进行互联,网络拓扑结构如图1-1所示。 【…

如何在线去除图片上的水印?一分钟教你一键去除

想要去除图片上的水印?不妨试试在线图片水印去除工具!在个人生活或工作中,我们常常需要使用他人的图片,然而图片上的水印却常常成为阻碍,若你正为此烦恼,那么在线图片去水印工具将成为你的救星,…

禁止使用U盘的方法

禁止使用U盘的方法 说到保护电脑数据安全,无论是个人还是企业,这都是一个很重要的问题,大家都会想到设置电脑开机密码,但这还远远达不到我们的要求,有很多种方法可以跳过开机验证,直接进入电脑。所以我们还…

代码随想录Day29 贪心04 LeetCode T860 柠檬水找零 T406 根据身高重建队列 T452 用最少得箭引爆气球

LeetCode T860 柠檬水找零 题目链接:860. 柠檬水找零 - 力扣(LeetCode) 题目思路: 这道题我们只要顺序按照数组判断是否能有钱找零即可,我们定义三个变量来记录每张钞票目前的数量,其中我们知道给10元得找5元,给二十元得找515元,而15元的组合有10元5元和…

算法通过村第十七关-贪心|青铜笔记|贪心也很简单呕

文章目录 前言难以解释的贪心算法贪心问题发放饼干柠檬水找零分发糖果 总结 前言 提示:我像接纳变甜的果实一般迎接此时。 --朱塞培翁加雷蒂《享受》 贪心的思想很难用理论去解释,这里我们通过案例感受下,怎么思考贪心的问题。 难以解释的贪心…

threejs(5)-详解灯光与阴影

一、Gsap动画库基本使用与原理 npm 地址:https://snyk.io/advisor/npm-package/gsap import * as THREE from "three"; // 导入轨道控制器 import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"; // 导入动画库 import…

设备巡检怎么规范流程?如何做好后勤管理工作?

后勤巡检对于企业和高校来说,就像一台电脑上的安全防护软件,它会定期或不定期地扫描和检查系统,找出存在的问题,例如垃圾文件和病毒风险。巡检的目的是为了检查公司和高校的各项设施、设备和环境等,以发现潜在的环境安…

React之服务端渲染

一、是什么 在SSR中 (opens new window),我们了解到Server-Side Rendering ,简称SSR,意为服务端渲染 指由服务侧完成页面的 HTML 结构拼接的页面处理技术,发送到浏览器,然后为其绑定状态与事件,成为完全可…

【C++】类与对象 第一篇(class,this)

目录 什么是类? 类的引入 class 类的两种定义方式: 声明与定义分离 类的访问限定符号 访问限定符​编辑 C中struct和class的区别是什么? 封装 类的作用域 类的实例化 类对象模型 如何计算类对象的大小 this指针 C语言和C实现Stack的对比 C语言实现…

程序员新手村常见问题

到今年已经工作十一个年头了,把这些年自己出现在自己身上或者同事身上的问题记录下来。 手里有锤子,看神马都是钉子 新人程序员很容易手段目的化,战术战略化。学了一门新技术后,不管具体的技术场景,哪里都想拿出来比…

2023年【广东省安全员A证第四批(主要负责人)】考试题及广东省安全员A证第四批(主要负责人)考试内容

题库来源:安全生产模拟考试一点通公众号小程序 广东省安全员A证第四批(主要负责人)考试题是安全生产模拟考试一点通总题库中生成的一套广东省安全员A证第四批(主要负责人)考试内容,安全生产模拟考试一点通…

CNN 网络结构简介

本文通过整理李宏毅老师的机器学习教程的内容,介绍 CNN(卷积神经网络)的网络结构。 CNN 网络结构, 李宏毅 CNN 主要应用在图像识别(image classification, 图像分类)领域。 通常,输入的图片大小相同&am…

【Oracle】[INS-30131]执行安装程序验证所需的初始设置失败。

这里写目录标题 一、问题描述1 报错内容1.1 无法从节点“kotin”检索 exectask 的版本1.2 工作目录"xxx"无法在节点"kotin"上使用 2 相关环境2.1 安装软件2.2 安装系统 3 解决思路分析 二、解决方案1 方案一、 满足验证条件 - 不换系统1.1 第一步、检查文件…

uniapp开发微信小程序的巨坑

1、不能使用v-show 2、关于插槽的巨坑 这里我真的是摸索了好久。 小程序版本: hbuilderx版本: 其他版本不知道会不会出现以下情况。 如果组件中带有插槽,那么使用插槽时有以下要注意: 1、如果子组件通过slot,向外…

MySQL数据xtrabackup物理备份方法

目录 一、物理备份的方式二、xtrabackup物理备份1.安装xtrabackup2.完整备份/恢复流程3.增量备份流程4.差异备份流程5.物理备份总结 一、物理备份的方式 1.完整备份 每次对数据进行完整的备份,即对整个数据库的备份、数据库结构和文件结构的备份,保存的…

ADC读取数据进入死循环

结论优先:程序并发处理不当引起寄存器标志位被非预期清除,引起进入死循环。 现象:在进行AD读取数据时,有一个等待ADC转换完成的标志位,概率性卡死在while等待ADC数据转换完成。 static err_t gd32_adc_read(struct d…

Pytorch入门实例的分解写法

数据集是受教育年限和收入,如下图 代码如下 import torch import numpy as np import matplotlib.pyplot as plt import pandas as pddata pd.read_csv(./Income.csv)X torch.from_numpy(data.Education.values.reshape(-1,1).astype(np.float32)) Y torch.from_numpy(data…

python 查找波峰和波谷

import numpy as np import matplotlib.pyplot as plt from scipy.signal import find_peaks# 生成示例信号 x np.array([1, 3, 7, 1, 2, 6, 0, 4, 3, 2, 5, 1])# 寻找波峰 peaks, _ find_peaks(x)# 寻找波谷(使用信号的负数形式) valleys, _ find_pe…

炒冷饭、语雀崩、领会员-我最主观的一段文字

目录 什么是语雀 语雀,为每一个人提供优秀的文档和知识库工具。 作为一个程序员来说,我们需要一块位置去存储我们正在学习的技术、过往踩过的坑以及正在做的事情,如果我们需要记录每天的TO-DO List,或者需要按照四象限工作法亦或…

瑞虎9:外观够虎,内饰够豪,起售价15.29万

随着更多家庭习惯了全家自驾出行,国内消费者对SUV车型越来越感兴趣。随着生活水平的提高和旅游观念的普及,家庭出行已成为人们生活中的常态。每个家庭成员都希望在出行时能够享受到舒适的感觉,这成为购车时的重要考虑因素。因此,车…