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


我是荔园微风,作为一名在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 onceclass 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.mzph.cn/news/674119.shtml

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

相关文章

为什么要设置止损

2024年1月至2月7日&#xff0c;A股最令人瞩目的事件就是代表小微盘的中证500和中证1000雪球连续敲入&#xff0c;以及万得微盘指数的崩塌&#xff08;1个月下跌50%&#xff09;。 这次的这个过程中&#xff0c;止损很重要。一般情况下&#xff0c;如果设置了20%回撤止损的话&am…

跨品牌智能家居控制_从原理到实现_HomeAssistant

项目地址&#xff1a;https://github.com/home-assistant/core Star&#xff1a;67 K 1 引言 最近去南方玩&#xff0c;住了一些智能酒店&#xff0c;自动开关电视、窗帘、灯、空调&#xff0c;还挺好用的&#xff0c;尤其喜欢关灯这功能。先不说它的理解能力&#xff08;对同…

豪掷770亿!华为员工集体“分红大狂欢”:至少14万人受益

豪掷770亿&#xff01;华为员工集体“分红大狂欢”&#xff1a;至少14万人受益 近日&#xff0c;华为宣布了其2023年度分红计划&#xff0c;总金额高达770.85亿元&#xff0c;预计至少将惠及14万员工。这一消息引发了广泛关注和热议&#xff0c;成为业界的一大亮点。作为中国领…

Go 语言中如何大小端字节序?int 转 byte 是如何进行的?

嗨&#xff0c;大家好&#xff01;我是波罗学。 本文是系列文章 Go 技巧第十五篇&#xff0c;系列文章查看&#xff1a;Go 语言技巧。 我们先看这样一个问题&#xff1a;“Go 语言中&#xff0c;将 byte 转换为 int 时是否涉及字节序&#xff08;endianness&#xff09;&#x…

代码随想录算法训练营第42天 | 01背包理论基础 416.分割等和子集

01背包理论基础 问题定义&#xff1a;有n件物品和一个能装重量为w的背包&#xff0c;第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i]。每件物品只能用一次&#xff0c;求解将哪些物品装入背包获得的总价值最大。dp数组含义&#xff1a;dp[i][j] 表示从下标为 [0…

PHP安装后错误处理

一&#xff1a;问题 安装PHP后提示错误如下 二&#xff1a;解决 1&#xff1a;Warning: Module mysqli already loaded in Unknown on line 0解决 原因&#xff1a;通过php.ini配置文件开启mysqli扩展的时候&#xff0c;开启了多次 解决&#xff1a;将php.ini配置文件中多个…

层层深入揭示C语言指针的底层机制

理解C语言指针的底层机制需要我们从硬件、操作系统和编译器三个层次逐步展开。 1. 硬件层次 计算机硬件是实现内存管理的基础。内存是一个由无数个存储单元组成的线性空间&#xff0c;每个存储单元都有一个唯一的地址。这个地址通常是一个二进制数&#xff0c;表示该存储单元…

Linux网络编程——udp套接字

本章Gitee地址&#xff1a;udp套接字 文章目录 创建套接字绑定端口号读取数据发送数据聊天框输入框 创建套接字 #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol);int domain参数&#xff1a;表面要创建套接字的域…

windows 10 手写板画线会出现圈圈问题如何解决?

文章目录 1.方法一-控制面板解决2. 方法二-针对Windows Ink工作区 在Windows中&#xff0c;手写板或数位板的笔长按时出现圈圈或将其识别为右键单击的问题通常是在系统设置或者特定软件&#xff08;如Wacom驱动程序&#xff09;中进行调整的。如果您需要通过C代码来解决这个问题…

Netty中使用编解码器框架

目录 什么是编解码器&#xff1f; 解码器 将字节解码为消息 将一种消息类型解码为另一种 TooLongFrameException 编码器 将消息编码为字节 将消息编码为消息 编解码器类 通过http协议实现SSL/TLS和Web服务 什么是编解码器&#xff1f; 每个网络应用程序都必须定义如何…

【npm】修改npm全局安装包的位置路径

问题 全局安装的默认安装路径为&#xff1a;C:\Users\admin\AppData\Roaming\npm&#xff0c;缓存路径为&#xff1a;C:\Users\admin\AppData\Roaming\npm_cache&#xff08;其中admin为自己的用户名&#xff09;。 由于默认的安装路径在C盘&#xff0c;太浪费C盘内存啦&#…

《小狗钱钱2》读书笔记

目录 前言 作者简介 经典语句摘录 前言 尽管[ 智慧是无法传授的], 但读书可以启发思路&#xff0c;开拓解题方法。 《小狗钱钱2》这本书是在《小狗钱钱》的基础上&#xff0c;作业进一步阐述了关于人生出生的智慧。 当然了&#xff0c;这本书感觉更适合成年人来看&#xff0…

C++三剑客之std::any(一) : 使用

相关系列文章 C三剑客之std::any(一) : 使用 C之std::tuple(一) : 使用精讲(全) C三剑客之std::variant(一) : 使用 C三剑客之std::variant(二)&#xff1a;深入剖析​​​​​​​ 目录 1.概述 2.构建方式 2.1.构造函数 2.2.std::make_any 2.3.operator分配新值 3.访问值…

【python绘图】爱心、樱花树、饼图、折线图、雷达图

一、爱心 import turtledef curvemove():for i in range(200):turtle.speed(0)turtle.right(1) # 光标向右偏1度turtle.forward(1)# 前进1pxturtle.penup() turtle.goto(0, -70) turtle.pendown()turtle.color(red) turtle.begin_fill() turtle.left(140) turtle.forward(111…

【从Python基础到深度学习】1. Python PyCharm安装及激活

前言&#xff1a; 为了帮助大家快速入门机器学习-深度学习&#xff0c;从今天起我将用100天的时间将大学本科期间的所学所想分享给大家&#xff0c;和大家共同进步。【从Python基础到深度学习】系列博客中我将从python基础开始通过知识和代码实践结合的方式进行知识的分享和记…

【递归】【前序中序后序遍历】【递归调用栈空间与二叉树深度有关】【斐波那契数】Leetcode 94 144 145

【递归】【前序中序后序遍历】【递归调用栈空间与二叉树深度有关】Leetcode 94 144 145 1.前序遍历&#xff08;递归&#xff09; preorder2.中序遍历&#xff08;递归&#xff09;inorder3.后序遍历&#xff08;递归&#xff09;postorder4. 斐波那契数 ---------------&…

学习 Redis 基础数据结构,不讲虚的。

学习 Redis 基础数据结构&#xff0c;不讲虚的。 一个群友给我发消息&#xff0c;“该学的都学了&#xff0c;怎么就找不到心意的工作&#xff0c;太难了”。 很多在近期找过工作的同学一定都知道了&#xff0c;背诵八股文已经不是找工作的绝对王牌。企业最终要的是可以创造价…

【服务器数据恢复】HP EVA虚拟化磁盘阵列数据恢复原理方案

EVA存储结构&原理&#xff1a; EVA是虚拟化存储&#xff0c;在工作过程中&#xff0c;EVA存储中的数据会不断地迁移&#xff0c;再加上运行在EVA上的应用都比较繁重&#xff0c;磁盘负载高&#xff0c;很容易出现故障。EVA是通过大量磁盘的冗余空间和故障后rss冗余磁盘动态…

实例分割论文阅读之:《Mask Transfiner for High-Quality Instance Segmentation》

1.摘要 两阶段和基于查询的实例分割方法取得了显著的效果。然而&#xff0c;它们的分段掩模仍然非常粗糙。在本文中&#xff0c;我们提出了一种高质量和高效的实例分割Mask Transfiner。我们的Mask Transfiner不是在规则的密集张量上操作&#xff0c;而是将图像区域分解并表示…

TCP相关知识点

TCP相关知识点 参考&#xff1a; 《计算机网络》 (建议收藏)TCP协议灵魂之问&#xff0c;巩固你的网路底层基础 关于 TCP 三次握手和四次挥手&#xff0c;满分回答在此 (值得看) TCP处于网络体系结构中的运输层。 运输层主要为应用进程提供端到端的逻辑通信&#xff0c;然后对…