微软.NET6开发的C#特性——接口和属性

news2024/9/24 21:19:50


我是荔园微风,作为一名在IT界整整25年的老兵,看到不少初学者在学习编程语言的过程中如此的痛苦,我决定做点什么,下面我就重点讲讲微软.NET6开发人员需要知道的C#特性。

C#经历了多年发展, 进行了多次重大创新, 大幅优化了开发者的编码体验。在.NET 平台移交给.NET基金会运营后, C#更新的越来越不像原来的C#了,但总体上来说,所有改进依然以优化开发者的编码体验为最终目的。

首先,要记住一张表,如下:

C#版本     发布时间         .NET版本                       VS版本                  CLR版本

C#1.0        2002-2-13       .NET Framework 1.0     VS.NET 2002      .NET Framework CLR 1.0

C#2.0        2005-11-7       .NET Framework 2.0     VS2005               .NET Framework CLR 2.0

C#3.0        2006-11-6       .NET Framework 3.0     VS2008               .NET Framework CLR 2.0 

C#3.0       2007-11-19     .NET Framework 3.5     VS2008                .NET Framework CLR 2.0 

C#4.0       2010-4-12       .NET Framework 4.0     VS2010                .NET Framework CLR 4.0

C#5.0       2012-2-20        .NET Framework 4.5     VS2012               .NET Framework CLR 4.0

C#6.0       2015-7-26        .NET Framework 4.6      VS2015              .NET Framework CLR 4.0

C#7.0       2016-8-2          .NET Framework 4.6.2    VS2017(v15)     .NET Framework CLR 4.0

C#7.1       2017-4-5          .NET Framework 4.7      VS2017(v15.3)   .NET Framework CLR 4.0

C#7.2       2017-10-17      .NET Framework 4.7.1   VS2017(v15.5)    .NET Framework CLR 4.0

C#7.3       2018-4-30         .NET Framework 4.7.2   VS2017(v15.8)   .NET Framework CLR 4.0

C#8.0       2019-4-18          .NET Framework 4.8    VS2019(v16.3)    .NET Framework CLR 4.0

C#8.0       2019-9-24         .NETCore 3.0                 VS2019(v16.4)    .NETCore CLR 3.0       

C#9.0       2020-11-10       .NET 5.0                        VS2019(v16.8)    .NET CLR 5.0           

C#10.0     2021-11-8         .NET 6.0                        VS2022(v17)       .NET CLR 6.0 

看完这张表,我真的是很感慨,从测试版开始,我居然陪伴着.NET和C#走过了二十多年,我不知道有没有微软公司的人在看这篇文章,如果有的话,不知道我这样的二十多年的.NET和C#程序员有没有机会去微软中国和微软亚洲研究院的总部去参观一下,去坐一坐,并作一下技术交流。二十多年了,人生又有几个二十多年。

.NET平台是基于IL中间语言的应用运行环境,面向对象语言C#是平台的主要开发语言。除此之外还有同样面向对象的C++/CLI。C++/CLI主要用于和原生C++交互,在.NET平台中仅支持Windows系统。

C#和.NET平台本来是微软为了与Java平台竞争而打造的,C#在设计时充分总结了Java的经验教训,解决了大量Java的基本设计缺陷。本着为一线开发者谋实惠的宗旨,C#设计了大量能减轻开发者的编写负担、容易理解且安全高效的实用功能。为了尽可能降低因安全措施导致性能大幅下降的影响,C#还在有限的情况下保留了C/C++语言的部分语法和功能。到了.NET时代,微软依然在运行时(Runtime)和语言两边同时进行着优化。

随着上世纪九十年代Java的发布,软件公司和开发者开始感受到基于虚拟机的托管语言所带来的好处,微软也不甘示弱,在2001年发布了.NET Framework平台和C#。提供了完整的基础面向对象支持。

接口

接口是从C++开始出现的概念,用来表示不相关的类能拥有的共同特征。由于C++支持类的多重继承,因此直接用纯抽象类和纯虚函数来实现接口的功能,并且C++中没有abstract和interface关键字,是否是接口完全看类的定义是否符合接口规范。C#和Java都增加了专门的关键字来表达相应的概念。在C#和Java中,类只允许单继承且抽象类能够包含非抽象成员,接口可以多重实现但不允许包含具体定义,这样它们就变成了不可互相替代的功能。后来Java为接口添加了默认实现功能,隐约有了多重继承的功能,而C#也在8.0版跟进了这一功能。

在C#中,实现接口的方式分为隐式实现和显式实现。隐式实现就是直接在类中定义和接口声明相同的方法,隐式实现可以直接在对象上调用。显式实现需要在方法名前包含接口名,且不能使用访问修饰符,显式实现必须先把对象转换为接口类型才能调用。一个类可以同时定义隐式实现和显式实现。显式接口实现通常在多个接口有签名冲突的方法时使用。

使用C#、C++、Java实现接口的示例代码如下所示。

(1)C#

public interface MyInterface
{
  void MyMethod();
    int MyProperty { get; set;}
}

(2) C++
MyInterface.h

#pragma once

class MyInterface
{
  public:
   MyInterface(){ };
    virtual ~MyInterface()=0{};
    virtual void MyMethod()=0;
   virtual int GetMyProperty()=0;
    virtual void SetMyProperty(int value)=0;
};

MyInterface.cpp

#include "MyInterface.h"

(3)Java

package com.example. coredx. practice;

public interface MyInterface{

  void myMethod();
  int getMyProperty();
  void setMyProperty (int value);
}

属性

属性(Property)是C#的独创功能,虽然属性在本质上就是方法(在C语言中称为函数),但却是拥有严格限制和特殊语法的方法。属性源于面向对象的封装性,意指类的字段(有时在C+中也被称为属性)不应该直接暴露到外部,要保持私有,应该由可以进行安全检查或其他额外处理的公共方法间接暴露到外部。因此,提供字段值的 get方法应该没有参数且返回类型和字段类型相同,修改字段值的set方法应该有一个和字段相同类型的参数且没有返回值。

比如要定义一个三角形类,三角形的三边长度存储在三个私有的数字字段中,就应该用属性对外提供访问渠道,因为三角形的边长是不能随意设置的,首先必须是正数,其次必须满足任意两边之和大于第三边,属性就能在赋值时提供相应的验证。另外三角形应该有周长属性,但周长实际是由三个边长间接算出来的,并不保存在字段中,除非要进行缓存避免重复计算,那缓存的失效和刷新就变成另一个要解决的问题了。这个时候,只读属性可以提供间接计算的功能并且和普通字段有相同的语法外观,用户也不必关心属性是从存储数据的字段中取出来的还是临时计算出来的。

C#则直接将属性变成语言本身的功能,并为其设计了专门的语法,后来又经过几次改进最终变成现在的样子。属性也彻底解决了Java的这一问题。C++也没有属性的概念,因此C+的基本解决方法和Java差不多,都是手动定义相应的访问函数。

使用C#、C++、Java定义一个三角形类的代如下所示。

(1)C#
 

using System;

namespace Example
{
  public class Triangle
  {
      private double aa;
     private double bb;
    private double cc;
  
      public Triangle(double a, double b, double c)
      {
           if (!Validate(a, b, c) throw new ArgumentException("三边长不满足三角形的规则。");

           aa = a;
           bb = b;
            cc = c;
        }

       public double A
     {
           get { return aa; }
           set {if (Validate (value, bb, cc)) aa=value; }
        }
        
        public double B
     {
           get { return bb; }
           set {if (Validate (aa, value, cc)) bb=value; }
        }
 
       public double C
     {
           get { return cc; }
           set {if (Validate (aa, bb, value)) cc=value; }
        }

        public double Perimeter
     {
           get{return aa + bb + cc;}
        }

       private bool Validate(double a, double b, double c)
       {
            return (a > 0 && b > 0 && c > 0)&&(a + b > c && a + c > b && b + c> a);
       }
   }
}
 

在C#的set访问器中,使用隐式参数关键字value表示属性赋值时的参数。

(2) C++
Triangle.h

#pragma once
class Triangle
{
   private:
      double aa;
       double bb;
       double cc;
 
    bool validate(double a, double b, double c);
  
    public:
        Triangle (double a, double b, double c);
        double GetA();
        void SetA(double a);
       double GetB();
       void SetB(double b);
       double GetC();
       void SetC(double c);
       double GetPerimeter();
};

Triangle.cpp

#include "Triangle.h"
#include <stdexcept>

using namespace std;

bool Triangle::Validate(double a, double b, double c)
{
  return (a > 0 && b> 0 && c > 0)&& (a +b >c && a + c > b && b + c > a) ;
}

Triangle::Triangle(double a, double b, double c)
{
  if (!Validate(a, b, c) throw invalid_argument("三边长不满足三角形的规则。");
 
  aa= a;
  bb= b;
   cc= c;
}

double Triangle::GetA()
{
  return aa;
}

void Triangle::SetA(double a)
{
  if (Validate(a, bb, cc)) aa= a;
}

double Triangle::GetB()
{
  return bb;
}

void Triangle::SetB(double b)
{
  if (Validate(aa, b,cc)) bb= b;
}

double Triangle::GetC()
{
  return c;
}

void Triangle::SetC(double c)

   if (Validate(aa, bb, c)) cc= c;
}

double Triangle:: GetPerimeter()
{
  return aa+bb+cc;
}
(3)Java
package com.example. coredx. practice;

public class Triangle{
    private double aa;
     private double bb;
     private double cc;

     public Triangle(double a, double b, double c) throws Exception{
       if (!validate(a, b, c) throw new Exception("三边长不满足三角形的规则。");
  
        aa = a;
        bb = b;
         cc= c;
       } 
  
      public double getA()
       {
       return aa;
       }
  
       public void setA(double a)
     {
         if (validate(a, bb, cc)) aa= a;
     }
  
       public double getB()
      {
         return bb;
       }

       public void setB(double b)
      {
          if (validate(aa, b, cc))bb= b;
      }
  
       public double getC()
      {
         return cc;
       }
    
       public void setc(double c)
       {
           if (validate(aa,bb, c))cc= c;
      }

       private boolean validate(double a, double b, double c)
        {
            return (a > 0 && b > 0 && c > 0)&& (a + b > c && a +c > b && b + c >a);
       }
}

作者简介:荔园微风,1981年生,高级工程师,浙大工学硕士,软件工程项目主管,做过程序员、软件设计师、系统架构师,早期的Windows程序员,Visual Studio忠实用户,C/C++使用者,是一位在计算机界学习、拼搏、奋斗了25年的老将,经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。

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

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

相关文章

Java面向对象 继承

目录 继承继承的好处继承具有传递性实例创建Person类Student继承Person类测试 继承 Java中的继承是面向对象编程的一个核心特性&#xff0c;它允许一个类&#xff08;子类或派生类&#xff09;继承另一个类&#xff08;父类或基类&#xff09;的属性和方法。通过继承&#xff0…

mysql 对于null字段排序处理

最近遇到一个需求 &#xff0c;需要对一个报表的多个字段进行多字段复杂条件排序 排序字段为NULL时 Mysql对于排序字段为NULL时&#xff0c;有自身默认的排序规则&#xff0c;默认是认为null 值 是无穷小 ELECT id,script_id,last_modified,live_count,next_show FROM virtua…

PKI - 05 证书申请步骤

文章目录 Pre概述第一步:时间同步第二步: 部署证书服务器第三步: 客户端产生密钥第四步: 验证证书服务器第五步: 申请个人证书第六步&#xff1a; 审核并签名证书第七步: 颁发数字证书第八步: 交换公钥 Pre PKI - 02 对称与非对称密钥算法 PKI - 03 密钥管理&#xff08;如何…

Docker Compose实例

目录 一、前提说明 二、简单的Docker容器部署案例 1. Dockerfile 配置 2. docker-compose.yml 配置 3. application.properties 配置 4. pom.xml 配置 5. 上传文件 6. 创建基础Docker镜像 7. docker-compose.yml编排 8. 停止并删除容器编排 一、前提说明 在配置好Do…

路由器如何映射端口映射?

在现代互联网中&#xff0c;随着网络应用的不断发展&#xff0c;很多用户需要进行远程访问或搭建服务器来满足自己的需求。由于网络安全的原因&#xff0c;直接将内网设备暴露在公网中是非常危险的。为了解决这个问题&#xff0c;路由器映射端口映射技术应运而生。本文将介绍什…

STM32控制JQ8400语音播报模块

时间记录&#xff1a;2024/2/7 一、JQ8400引脚介绍 标示说明ONE LINE一线操作引脚BUSY忙信号引脚&#xff0c;正在播放语音时输出高电平RX串口两线操作接收引脚TX串口两线操作发送引脚GND电源地引脚DC-5V电源引脚&#xff0c;3.3-5VDAC-RDAC输出右声道引脚DAC-LDAC输出左声道…

2023年第四季度硬盘容量强势增长9%

在2023年第四季度&#xff08;CQ4 23&#xff09;&#xff0c;硬盘驱动器&#xff08;HDD&#xff09;市场的总容量出货量环比增长9%&#xff0c;达到214EB&#xff0c;而单位出货量保持在2900万块不变。其中&#xff0c;近线存储&#xff08;Nearline&#xff09;硬盘的容量出…

【MySQL】MySQL复合查询--多表查询/自连接/子查询

文章目录 1.基本查询回顾2.多表查询3.自连接4.子查询4.1单行子查询4.2多行子查询4.3多列子查询4.4在from子句中使用子查询4.5合并查询4.5.1 union4.5.2 union all 1.基本查询回顾 表的内容如下&#xff1a; mysql> select * from emp; ----------------------------------…

基于Skywalking开发分布式监控(二)

续上篇&#xff0c;上一篇主要是讲了为啥选skywalking&#xff0c;以及怎么有针对性改造SW Agent&#xff0c;现在我们继续看看如何构建自定义Trace跟踪链 要对SW Agent插件做适当剪裁&#xff0c;原来包括customize插件在内SW 8.9有100多个插件&#xff0c;如果没有作用也就罢…

C#调用WechatOCR.exe实现本地OCR文字识别

最近遇到一个需求&#xff1a;有大量的扫描件需要还原为可编辑的文本&#xff0c;很显然需要用到图片OCR识别为文字技术。本来以为这个技术很普遍的&#xff0c;结果用了几个开源库&#xff0c;效果不理想。后来&#xff0c;用了取巧的方法&#xff0c;直接使用了WX的OCR识别模…

STM32 新建寄存器版本MDK工程简要步骤

新建工程文件夹 新建一个工程根目录文件夹&#xff0c;并在该文件夹里新建D/M/O/P/U文件夹。 Drivers&#xff1a;存放与硬件相关的驱动层文件Middlewares&#xff1a;存放正点原子提供的中间层组件文件和第三方中间层文件Output&#xff1a;存放工程编译输出文件Projects&am…

介绍一下BFS

BFS&#xff0c;即广度优先搜索&#xff08;Breadth-First Search&#xff09;&#xff0c;是一种图形搜索算法&#xff0c;用于在图或树等数据结构中遍历或搜索节点。这种算法从根节点开始&#xff0c;沿着树的宽度遍历树的节点&#xff0c;直到找到目标节点或遍历完所有节点。…

cnpm : 无法加载文件 C:\Users\xxx\AppData\Roaming\npm\cnpm.ps1

cnpm命令被禁止使用 我已经安装cnpm &#xff0c;但是使用不了&#xff0c;重新安装也没用。 报错如下图&#xff1a; cnpm无法使用报错 解决问题 1、打开系统Windows PowerShell,使用管理员身份运行。 打开Windows PowerShell 2、输入set-ExecutionPolicy RemoteSigned&a…

FPGA_工程_按键控制的基于Rom数码管显示

一 信号 框图&#xff1a; 其中 key_filter seg_595_dynamic均为已有模块&#xff0c;直接例化即可使用&#xff0c;rom_8*256模块&#xff0c;调用rom ip实现。Rom_ctrl模块需要重新编写。 波形图&#xff1a; 二 代码 module key_fliter #(parameter CNT_MAX 24d9_999_99…

BlueLotus 下载安装使用

说明 蓝莲花平台BlueLotus&#xff0c;是清华大学曾经的蓝莲花战队搭建的平台&#xff0c;该平台用于接收xss返回数据。 正常执行反射型xss和存储型xss&#xff1a; 反射型在执行poc时&#xff0c;会直接在页面弹出执行注入的poc代码&#xff1b;存储型则是在将poc代码注入用…

grafana+prometheus+hiveserver2(jmx_exporter+metrics)

一、hiveserver2开启metrics&#xff0c;并启动jmx_exporter 1、修改hive-site.xml文件开启metrics <property><name>hive.server2.metrics.enabled</name><value>true</value> </property> <property><name>hive.service.m…

idea 配置文件,中文出现乱码如何解决

在进行 spring 项目开发时&#xff0c;项目中有 application.properties/application.yml 等配置文件&#xff0c;在配置文件中使用中文注解时可能会出现乱码的情况&#xff0c;如下&#xff1a; 这是因为 idea 配置文件的编码和其他文件的不同&#xff0c;我们需要修改配置文件…

特征工程:特征提取和降维-上

目录 一、前言 二、正文 Ⅰ.主成分分析 Ⅱ.核主成分分析 三、结语 一、前言 前面介绍的特征选择方法获得的特征&#xff0c;是从原始数据中抽取出来的&#xff0c;并没有对数据进行变换。而特征提取和降维&#xff0c;则是对原始数据的特征进行相应的数据变换&#xff0c;并…

leetcode707. 设计链表

leetcode707. 设计链表 题目 思路 1.使用虚头节点&#xff0c;模拟class的初始化 2.class中添加一个链表长度的属性&#xff0c;便于后续操作 代码 class ListNode:def __init__(self, val0, nextNone):self.val valself.next nextclass MyLinkedList:def __init__(self)…

优化梯度下降算法

文章目录 Optimization problemNormalizing inputsvanishing/exploding gradientsweight initializegradient checkNumerical approximationgrad check Optimize algorithmmini-bach gradientmini-batch size exponential weighted averagesBias correctionMomentum RMSpropAda…