C#构造函数 析构函数 静态成员(类) 密封类 字段以及属性

每当创建类或结构的实例时,将会调用其构造函数。 类或结构可能具有采用不同参数的多个构造函数。 使用构造函数,程序员能够设置默认值、限制实例化,并编写灵活易读的代码

如果静态构造函数尚未运行,静态构造函数会在任何实例构造函数操作执行之前运行

构造函数 函数名和类名一样,构造对象并且初始化的作用

构造函数语法

构造函数是一种方法,其名称与其类型的名称相同。 其方法签名仅包含可选访问修饰符、方法名称和其参数列表;它不包含返回类型。 以下示例演示一个名为 Person 的类的构造函数。

public class Person
{
   private string last;
   private string first;

   public Person(string lastName, string firstName)
   {
      last = lastName;
      first = firstName;
   }

   // Remaining implementation of Person class.
}

如果某个构造函数可以作为单个语句实现,则可以使用表达式主体定义。 以下示例定义 Location 类,其构造函数具有一个名为“name”的字符串参数。 表达式主体定义给 locationName 字段分配参数。

public class Location
{
   private string locationName;

   public Location(string name) => Name = name;

   public string Name
   {
      get => locationName;
      set => locationName = value;
   }
}

静态构造函数

前面的示例具有所有已展示的实例构造函数,这些构造函数创建一个新对象。 类或结构也可以具有静态构造函数,该静态构造函数初始化类型的静态成员。 静态构造函数是无参数构造函数。 如果未提供静态构造函数来初始化静态字段,C# 编译器会将静态字段初始化为其默认值,如 C# 类型的默认值中所列。

以下示例使用静态构造函数来初始化静态字段。

public class Adult : Person
{
   private static int minimumAge;

   public Adult(string lastName, string firstName) : base(lastName, firstName)
   { }

   static Adult()
   {
      minimumAge = 18;
   }

   // Remaining implementation of Adult class.
}

也可以通过表达式主体定义来定义静态构造函数

public class Child : Person
{
   private static int maximumAge;

   public Child(string lastName, string firstName) : base(lastName, firstName)
   { }

   static Child() => maximumAge = 18;

   // Remaining implementation of Child class.
}

析构函数 ~

主要作用:在于对象销毁前系统会自动调用,进行一些清理工作 收回创建对象时申请的空间

类的析构函数是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行。

析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数。析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源。

注:  先置为空

  p1=null;//先置为空在 collec
  GC.Collect();//只有设置为空之后 cg垃圾回收机制才会检测为空的字段 并且对空字段进行释放所占的内存

静态属性和非静态属性

 静态属性(static) 类名 属性名调用
 非静态属性(没static);对象属性 1先创建对象 属性

  class Sb
  {
      public static int num { get; set; }
      public int count { get; set; }
      //静态的只能访问静态的
      public static void F1()
      {
          num++;
      }
      //非静态可以访问所有的类生成
      public void F2()
      {
          count++;
          num++;
      }
      public int F3()
      {
          return num;
      }
  }
             Sb.num ++;
             Sb.num++;
             Sb.num++;
             Console.WriteLine(Sb.num);



            Sb s1 = new Sb();
            s1.count++;
            Console.WriteLine(s1.F3()); //3 所有的对象都会共享静态属性
            Console.WriteLine(s1.count+"---"); //0非静态的属性每个对象都是互不相关的 没有任何练习


            Sb s2 = new Sb();
            Console.WriteLine(s2.F3()); //3

  静态方法和非静态方法
 静态方法(static):类名 方法名();静态方法里面只能访问静态成员
 非静态方法(没static)对象方法名 非静态方法中可以访问所有的成员

  class People
  {
      //类包含静态成员和非静态成员
      //属性和方法 不叫static 属于 属于非静态属性和非静态方法  每一个对象都有一份 对象 属性使用方式去使用
      //属性和方法 添加了static属于静态属性和静态方法 存储类上的 所有的对象共享一个成员

      public int Age { get; set; } //非静态属性 对象 属性 使用方式使用
      public static int Num { get; set; } //静态属性 类名 属性进行使用

      //非静态方法 对象 类名()  可以访问所有的类成员 包括静态属性和非静态属性 静态方法和非静态方法
      public void Test()
      {
          Console.WriteLine("年龄是" + Age + "数量" + Num);
          Test2();//可以调用静态方法
      }
      //静态方法使用方式 类名 方法名() 只能访问静态成员 访问静态属性和静态方法
      public static void Test2()
      {
          Console.WriteLine("我是静态方法");
          // Test() 不能调用非静态属性和方法
      }
  }

  类包含静态成员和非静态成员
  属性和方法 不叫static 属于 属于非静态属性和非静态方法  每一个对象都有一份 对象 属性使用方式去使用
  属性和方法 添加了static属于静态属性和静态方法 存储类上的 所有的对象共享一个成员

   People.Num = 10;

   People p1 = new People();
   p1.Age = 10;

   People p2 = new People();
   p2.Age = 10;
   p1.Age += 1;

   Console.WriteLine(p1.Age);
   p1.Test();

   People.Test2();

密封类

密封类是一种特殊的类,它使用 sealed 关键字进行标记,以防止其他类从它继承。密封类的主要目的是限制类的继承链,确保类的设计和实现不被进一步扩展或修改

密封类的定义和特性

public sealed class MyClass
{

}

一旦类被声明为密封的,它就不能被其他任何类继承。这意味着密封类不能作为基类,也不能是抽象类。密封类中的所有成员都是最终的,不能被派生类重写或修改

密封类的使用场景

密封类在 C# 中的一个常见用途是提供一种确保类的稳定性和安全性的方法。例如,当开发者希望创建一个具有特定功能的类,并且不希望其他开发者通过继承来改变或扩展这些功能时,可以使用密封类。此外,密封类可以提供一些性能优化,因为编译器知道这些类不会有任何派生类,因此可以进行一些特定的优化处理。

密封类与密封方法的区别

密封类与密封方法是两个不同的概念。密封方法是指在派生类中重写的基类虚方法,使用 sealed 关键字标记,以防止进一步的重写。而密封类则是指整个类都被密封,不允许任何形式的继承

// 声明一个密封类
public sealed class SealedClass
{
public int Add(int a, int b)
{
return a + b;
}
}

// 尝试从密封类继承将导致编译错误
// public class DerivedClass : SealedClass
// {
// // 错误:无法从密封类型继承
// }

密封类是 C# 中一个重要的概念,它提供了一种机制来防止类的继承,确保类的设计意图得到保护。通过使用密封类,开发者可以创建稳定且不可变的类结构,同时可能获得一些性能上的优势。密封类的使用应当谨慎,确保它符合设计目标和需求

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

公立医院高质量发展——急慢性气道疾病药学服务科普宣传培训成功开展

2023年,为积极响应国家关于推动公立医院高质量发展的号召,中国健康促进基金会开展了公立医院高质量发展——急慢性气道疾病药学服务科普宣传培训。该项目旨在通过科普宣传和培训,提升咳喘药学规范化服务水平,促进临床专业知识与咳…

product/admin/list?page=0size=10field=jancodevalue=4562249292272

文章目录 1、ProductController2、AdminCommonService3、ProductApiService4、ProductCommonService5、ProductSqlService https://api.crossbiog.com/product/admin/list?page0&size10&fieldjancode&value45622492922721、ProductController GetMapping("ad…

linux介绍------VMWare的卸载,下载,安装------及基础命令使用

文章目录 Linux第一天1、为什么要学习linux?2、怎么去学linux?(什么是大数据)3、VMWare的卸载,下载,安装4、检查网卡5、创建新的虚拟机(安装步骤:看视频)6、几个名字的理…

游戏引擎学习第38天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾上次的内容。 我们之前讨论了将精灵放在屏幕上,但颜色错误的问题。问题最终查明是因为使用了一个调整工具,导致文件的字节顺序发生了变化。重新运行“image magic”工具对一些大图像进行重新处理后&am…

leetcode 二进制数转字符串

1.题目要求: 2.题目代码: class Solution { public:string printBin(double num) {string result;double compare_value 1.0;//先给把0和.赋值给result;result.push_back(0);result.push_back(.);while(result.size() < 33){//利用十进制转换成二进制的方法//1.先给num …

JS进阶DAY3|页面加载事件和页面滚动事件

目录 一、页面加载事件 1.1 DOMContentLoaded 事件 1.1.1 触发时机 1.1.2 用途 1.1.3 代码示例document.addEventListener(DOMContentLoaded, (event) > { 1.2 load 事件 1.2.1 触发时机 1.2.2 用途 1.2.3 代码示例 二、页面滚动事件 1.1 scroll事件 1.1.1 触…

overleaf 写论文 语法笔记

1.找参考的期刊/论文模板 注册账户后并登录后进入这个界面&#xff0c;创建的所有历史项目会在这个界面显示&#xff0c;后期可以继续修改。 创建新项目&#xff1a;点击绿色按钮“创建新项目”后&#xff0c;可以新建空白项目&#xff0c;可以选择模板直接往模板里添加内容,…

OpenCV-平滑图像

二维卷积(图像滤波) 与一维信号一样&#xff0c;图像也可以通过各种低通滤波器&#xff08;LPF&#xff09;、高通滤波器&#xff08;HPF&#xff09;等进行过滤。LPF 有助于消除噪音、模糊图像等。HPF 滤波器有助于在图像中找到边缘。 opencv 提供了函数 **cv.filter2D()**&…

Pandas | skill | 将groupby分组后的数据使用堆叠图像展示

groupby堆叠图 计算商品名称和销售数量计算商品名称和销售总额在每个颜色段上标注商品名称和平均销售金额 计算商品名称和销售数量 # 筛选出四个类别下的商品数据 categories_of_interest [Clothing, Accessories, Footwear, Outerwear] # data[Category]列中的元素是否在cat…

selenium常见接口函数使用

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;测试_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 1. 查找 查找方式 css_s…

vue-router查漏补缺

一、动态路由匹配 1.带参数的动态路由匹配 import User from ./User.vue// 这些都会传递给 createRouter const routes [// 动态字段以冒号开始{ path: /users/:efg, component: User }, ]这种方式的路由会匹配到/users/abc或者/users/123,路径参数用冒号:表示&#xff0c;并…

深度和法线纹理

屏幕后期处理效果的基本原理就是当游戏画面渲染完毕后通过获取到该画面的信息进行额外的效果处理 之前的边缘检测、高斯模糊、Bloom、运动模糊等效果都是基于获取当前屏幕图像中的像素信息进行后期处理的 如果仅仅根据像素信息来进行一些效果处理&#xff0c;存在以下问题&…

Vue3小兔鲜电商项目

创建项目 npm install 装包 创建文件夹 git工具管理项目 基于create-vue创建出来的项目默认没有初始化git仓库&#xff0c;需要我们手动初始化 执行命令并完成首次提交&#xff1a; git init git add . git commit -m "init"

短视频矩阵系统SEO优化排名技术的源码搭建与实施:

在开发短视频SEO优化排名技术时&#xff0c;虽然初步观察可能让人认为仅通过get和set这两个代理&#xff08;trap&#xff09;就能实现&#xff0c;但实际操作中远不止如此。为了更全面地控制私有属性的访问权限&#xff0c;还需要实现has、ownKeys以及getOwnPropertyDescripto…

Ubuntu中安装配置交叉编译工具并进行测试

01-下载获取交叉编译工具的源码 按照博文 https://blog.csdn.net/wenhao_ir/article/details/144325141的方法&#xff0c;把imx6ull的BSP下载好后&#xff0c;其中就有交叉编译工具。 当然&#xff0c;为了将来使用方便&#xff0c;我已经把它压缩并传到了百度网盘&#xff…

Fiddler 5.21.0 使用指南:过滤浏览器HTTP(S)流量下(四)

概述 在上一篇文章中&#xff0c;我们介绍了一部分简单的过滤功能&#xff0c;已经可以帮助我们较为准确的定位到感兴趣的请求&#xff1b;提升我们的工作效率&#xff0c;我们可以通过设置更为复杂的过滤规则&#xff0c;精准到定位的我们想要的请求和响应信息。专注于分析对…

错题:Linux C语言

题目&#xff1a;手写代码&#xff1a;判断一个数&#xff08;int类型的整数&#xff09;中有有多少1 题目&#xff1a;手写代码&#xff1a;判断一个数(转换成二进制表示时)有几个1 #include <stdio.h> int main(int argc, const char *argv[]) { //判断一个数&#xf…

MFC扩展库BCGControlBar Pro v36.0新版亮点:黑色主题中的自动反转图标

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v36.0已全新发布了&#xff0c;这个版本在黑暗主题中添加自动图标反转、新增一个全新的S…

【PlantUML系列】流程图(四)

目录 目录 一、基础用法 1.1 开始和结束 1.2 操作步骤 1.3 条件判断 1.4 并行处理 1.5 循环 1.6 分区 1.7 泳道 一、基础用法 1.1 开始和结束 开始一般使用start关键字&#xff1b;结束一般使用stop/end关键字。基础用法包括&#xff1a; start ... stopstart ...…

【Redis】深入解析Redis缓存机制:全面掌握缓存更新、穿透、雪崩与击穿的终极指南

文章目录 一、Redis缓存机制概述1.1 Redis缓存的基本原理1.2 常见的Redis缓存应用场景 二、缓存更新机制2.1 缓存更新的策略2.2 示例代码&#xff1a;主动更新缓存 三、缓存穿透3.1 缓存穿透的原因3.2 缓解缓存穿透的方法3.3 示例代码&#xff1a;使用布隆过滤器 四、缓存雪崩4…