秒收录网站有哪些,建设营销型网站哪家好,微信小程序官网开发,著名建筑设计作品解析我是荔园微风#xff0c;作为一名在IT界整整25年的老兵#xff0c;看到不少初学者在学习编程语言的过程中如此的痛苦#xff0c;我决定做点什么#xff0c;下面我就重点讲讲微软.NET6开发人员需要知道的C#特性#xff0c;然后比较其他各种语言进行认识。
C#经历了多年发展… 我是荔园微风作为一名在IT界整整25年的老兵看到不少初学者在学习编程语言的过程中如此的痛苦我决定做点什么下面我就重点讲讲微软.NET6开发人员需要知道的C#特性然后比较其他各种语言进行认识。
C#经历了多年发展 进行了多次重大创新 大幅优化了开发者的编码体验。在.NET 平台移交给.NET基金会运营后 C#更新的越来越不像原来的C#了但总体上来说所有改进依然以优化开发者的编码体验为最终目的。
首先要记住一张表如下
C#版本 发布时间 .NET版本 VS版本 CLR版本
C#1.0 2002-2 .NET Framework 1.0 VS.NET 2002 .NET Framework CLR 1.0
C#2.0 2005-11 .NET Framework 2.0 VS2005 .NET Framework CLR 2.0
C#3.0 2006-11 .NET Framework 3.0 VS2008 .NET Framework CLR 2.0
C#3.0 2007-11 .NET Framework 3.5 VS2008 .NET Framework CLR 2.0
C#4.0 2010-4 .NET Framework 4.0 VS2010 .NET Framework CLR 4.0
C#5.0 2012-2 .NET Framework 4.5 VS2012 .NET Framework CLR 4.0
C#6.0 2015-7 .NET Framework 4.6 VS2015 .NET Framework CLR 4.0
C#7.0 2016-8 .NET Framework 4.6.2 VS2017(v15) .NET Framework CLR 4.0
C#7.1 2017-4 .NET Framework 4.7 VS2017(v15.3) .NET Framework CLR 4.0
C#7.2 2017-10 .NET Framework 4.7.1 VS2017(v15.5) .NET Framework CLR 4.0
C#7.3 2018-4 .NET Framework 4.7.2 VS2017(v15.8) .NET Framework CLR 4.0
C#8.0 2019-4 .NET Framework 4.8 VS2019(v16.3) .NET Framework CLR 4.0
C#8.0 2019-9 .NETCore 3.0 VS2019(v16.4) .NETCore CLR 3.0
C#9.0 2020-11 .NET 5.0 VS2019(v16.8) .NET CLR 5.0
C#10.0 2021-11 .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)) aavalue; }}public double B{get { return bb; }set {if (Validate (aa, value, cc)) bbvalue; }}public double C{get { return cc; }set {if (Validate (aa, bb, value)) ccvalue; }}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 stdexceptusing 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 aabbcc;
}
(3)Javapackage 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深度学习时代、智能机器时代我不知道未来还会有什么时代只记得这一路走来充满着艰辛与收获愿同大家一起走下去充满希望的走下去。