ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

《c#10 in a nutshell》--- 读书随记(1)

2022-07-02 22:03:07  阅读:181  来源: 互联网

标签:10 函数 c# C# 类型 var NET 随记


Chaptor 1 . Introducing C# and .NET

内容来自书籍《C# 10 in a Nutshell》
Author:Joseph Albahari
需要该电子书的小伙伴,可以留下邮箱,有空看到就会发送的

Object Orientation 面向对象

c#是一门多用途,类型安全,面向对象的编程语言。

  • Unified type system,统一类型系统

    c#的最基本组成部分是一个封装了数据的集合和函数,这叫做一个类型。c#有一个统一的类型系统,所有类型的最终继承自一个公共的类型,这意味着无论是业务对象还是基本类型都共享相同的基本功能,比如说,它们都有ToString方法

  • Classes and interfaces,类和接口

    在传统的面向对象范式中,只有唯一一种类型就是类。在c#中,有几种类型,一种是接口。接口就像一个不能携带数据的类,所以接口只有动作的定义,它可以多继承

  • Properties, methods, and events

    在纯面向对象中,所有的函数都是方法。在c#,方法只是函数的其中一种,属性和事件也算是函数。属性是封装了对象一部分状态的函数。事件是简化了对象状态变化时引发的动作的函数

除了面向对象,c#也借鉴了函数式编程的概念

  • Functions can be treated as values

    在c#中,函数也算是一等公民了,它可以被当作值来传递,这个涉及一个概念,叫做delegates,它是函数的其中一种类型,可以被当作值传递到其他函数

  • supports patterns for purity

    函数式编程的核心是避免使用可变变量,而使用声明式模式。C # 有一些关键特性可以帮助处理这些模式,包括能够动态编写匿名函数来“捕获”变量(lambda 表达式) ,以及能够通过查询表达式执行list或响应式编程。C # 还提供了record,这使得编写不可变(只读)类型变得很容易。

CLRs, BCLs, and Runtimes

支持c#运行的Runtimes由Common Language Runtime(CLR)和Base Class Library(BCL)组成。一个运行时也可以包括一个高层的application layer提供给开发者。

Common Language Runtime

CLR提供了必要的运行时服务,比如自动内存管理和错误处理。

C#被叫做托管的语言,因为它会被编译成一种叫做Intermediate Language(IL)的托管代码。然后CLR会将IL翻译成目标机器的native code。这涉及一个叫做Just-in-Time (JIT)的编译器。还有一种叫做Ahead-of-time(AOT)的编译器也可以使用,这种编译器会提高大型应用的启动速度。

托管代码的容器叫做assembly程序集。它不仅仅包含IL,还有类型信息(metadata)。metadata的存在允许assemblies引用其他assemblies的类型而不需要额外的文件,程序当然也可以查找自己的metadata,这叫做reflection反射,甚至可以在运行时生成新的IL托管代码

Base Class Library

一个CLR总是关联着一个程序集的集合,叫做Base Class Library (BCL)。BCL提供了一些核心功能给开发人员,比如集合、IO、文本处理、XML/JSON序列化、网络、加密、并发、并行编程。还有一些C#语言自身特有的特性,比如枚举器、查询和异步,还有反射和内存管理

Runtimes

一个runtime(也叫做框架)是一个下载并安装之后的可部署的单元。一般由一个CLR和它的BCL,还有可选的application layer,这个是支持你编写一些特殊的应用,比如Web、mobile、rich client等,如果只是编写一些non-UI的应用,那么不需要application layer

.NET 6

.NET 6 是微软的开源运行时,可以编写Web和Console应用并运行在Windows、Linux和macOS;rich client可以运行在Windows7-11和macOS;moblie app运行在iOS和Android

.NET 6 没有预装在Windows上。启动会有信息提示安装哪个运行时,也可以通过构建self-contained的部署程序来避免这种情况

.NET 6 的前任是.NET 5,.NET 5 的前任是.NET Core 3,微软将Core 去除和Versiong 4 跳过了。为了避免和.NET Framework 4.x

A Brief History of C#

What’s New in C# 10

File-scoped namespaces

namespace MyNamespace;  // 将这个命名空间扩大到整个文件
class Class1 {} // inside MyNamespace
class Class2 {} // inside MyNamespace

The global using directive

global using System;
global using System.Collection.Generic;

会将项目中的所有文件都导入这个命名空间

Nondestructive mutation for anonymous types

var a1 = new { A = 1, B = 2, C = 3, D = 4, E = 5 };
var a2 = a1 with { E = 10 };
Console.WriteLine (a2);
// { A = 1, B = 2, C = 3, D = 4, E = 10 }

匿名创建一个类之后,可以使用with来将特定的元素修改,其他元素照搬,来创建一个新的类

New deconstruction syntax

var point = (3, 4);
double x = 0;
(x, double y) = point;

解构元组,可以一个是引用已有的变量,一个是新变量

Field initializers and parameterless constructors in structs

Record structs

record struct Point (int X, int Y);

Lambda expression enhancements

// 隐式推导
var greeter = () => "Hello, world";
// 隐式推导,入参需要写类型
var square = (int x) => x * x;
// 可以指定返回类型
var sqr = int (int x) => x;

M1 (() => "test");  // Implicitly typed to Func<string>
M2 (() => "test");  // Implicitly typed to Func<string>
M3 (() => "test");  // Implicitly typed to Expression<Func<string>>

void M1 (object x) {}
void M2 (Delegate x) {}
void M3 (Expression x) {}

// 可以添加attributes
Action a = [Description("test")] () => { };

Nested property patterns

var obj = new Uri ("https://www.linqpad.net");
if (obj is Uri { Scheme.Length: 5 })
// 等价于

if (obj is Uri { Scheme: { Length: 5 }})

标签:10,函数,c#,C#,类型,var,NET,随记
来源: https://www.cnblogs.com/huangwenhao1024/p/16438664.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有