

Nutshell系列中C#的最新更新,显然涵盖了C#7.0。 该书有1037页,是海量的书,大部分都可以用作参考书,而且除非您有非常特殊的需求,否则许多章节都不重要。 每章中的主题均已详细介绍,您很难找到我认为未涵盖的细节。
可以阅读,涵盖所有内容,但是我建议阅读前4章,并根据兴趣或需要从其余章节中进行选择。 详细程度和参考书的写作类型会使书干阅读,所以请注意!
我在书中的笔记收集在这里,希望它们对某人有用。
第1章和第2章:语言构造和类型定义的长期列举。 就像while,for,foreach,do-while,int,引用类型,值类型等等。 如果您需要从另一种语言过渡到C#的话,请好读,但是如果您已完成任何C#的操作,那应该是众所周知的。
- 南方黑色大师
- 为何魔鬼应该拥有所有美妙的音乐?:拉里·诺曼(Larry Norman)和克里斯蒂安·洛克(Christian Rock)的危险-格雷戈里·桑伯里(Gregory Thornbury)
- 博加万特斯,波拉斯-德佩罗和沙勒科-阿马里洛:米歇尔·侯埃勒贝克的少校
- 书评:李锦铭的调查
- [图书评论]埃里克·施密特(Eric Schmidt)和贾里德·科恩(Jared Cohen)的新数字时代
第3章:在C#中创建类型
C#在这方面正在进行很多特殊的事情。
解构方法 :
var rect = new Rectangle(3,4);
(浮动宽度,浮动高度)=矩形; //解构
命名参数 :调用时可以使用任何方法中变量的名称,因此顺序并不重要。
var r1 = new Rectangle(height:4,width:3);
属性具有与调用方字段相同的语法。
公共课矩形
{
整数高度 //私人的“支持”字段
public int高度//公共财产
{
得到{返回高度; }
设置{height = value; }
}
}
如果仅创建一个吸气剂,则属性为只读。
可以使用自动属性来缩短上面的示例,该属性将自动创建后备字段。
公共课矩形
{
公共小数高度{get; 组; }
}
另一种方法是使用表达式绑定的属性。
公众价值
{
得到=> currentPrice * sharesOwned;
设置=>份额拥有=值/ currentPrice;
}
如果仅需要吸气剂,则可以将其缩短:
公共十进制值=> currentPrice * sharesOwned;
索引器允许使用语法obj [index]
课堂句
{
string [] words =“ the quick brown fox” .Split();
公用字符串this [int wordNum] //索引器
{
得到{返回字[wordNum]; }
设置{个单词[wordNum] =值; }
}
}
部分类型允许将类型定义拆分到多个文件中。 每个定义都必须包含partial关键字。 通常用于自动生成的内容。 局部方法有点类似于抽象方法/接口,它允许一个局部类定义一个方法,而另一个实现该方法。
用于实现可与二进制运算符组合的标志的标志枚举 。
[标志]
公共枚举BorderSides
{
无= 0,
左= 1,右= 2,上= 4,下= 8,
LeftRight =左| 对,
TopBottom =顶部| 底部,
全部=左|右| 顶部底部
}
第4章:高级C#
您期望的语言中有许多功能,例如运算符重载,属性等。
委托是可以包含方法的类型。
委托int Transformer(int x);
课堂测试
{
静态void Main()
{
变压器t =正方形; //创建委托实例
int结果= t(3); //调用委托
Console.WriteLine(结果); // 9
}
static int Square(int x)=> x * x;
}
t(3)是t.Invoke(3)的简写。 由于委托是在运行时分配的,因此可以用来编写插件方法。
委托类型可以包含多个方法。
SomeDelegate d = SomeMethod1;
d + = SomeMethod2;
所有方法均按添加顺序调用。 也可以使用实例方法,委托将包含对该实例的引用。
事件:使用委托,我们可以实现广播者/订阅者模式,这是一种常见的模式,已正式形式化为语言。
公共委托void PriceChangedHandler(十进制oldPrice,
十进制newPrice);
公共类股票
{
字符串符号
十进制价格;
公共股票(字符串符号){this.symbol =符号; }
公共事件PriceChangedHandler PriceChanged;
公共十进制价格
{
得到{退货价格; }
组
{
如果(价格==价值)返回; //如果没有任何变化,则退出
十进制oldPrice =价格;
价格=价值;
if(PriceChanged!= null)//如果调用列表不存在
PriceChanged(旧价格,价格); //空的,触发事件。
}
}
}
Lambda表达式:此处无新内容,功能类似于Javascript和PHP
异常过滤器:避免异常块的一种很酷的方法是使用if-logic选择正确的处理异常的方法。
在(ex.Status == WebExceptionStatus.Timeout)时捕获(WebException ex)
{...}
当(ex.Status == WebExceptionStatus.SendFailure)时捕获(WebException ex)
{...}
迭代器/生成器:使用yield关键字。 可以使用多个产量,当发生产量中断时,发电机停止运转。
静态IEnumerable Foo(bool breakEarly)
{
收益率返回“一个”;
收益率返回“二”;
如果(早破)
产量中断;
收益回报“三”;
}
可空类型:我们可以使用“?”运算符指示编译器值类型可以为空。
诠释? i =空;
扩展方法: C#允许我们使用简单的静态类向现有类添加新方法,如下所示:
公共静态类StringHelper
{
公共静态布尔IsCapitalized(此字符串s)
{
如果(string.IsNullOrEmpty(s))返回false;
返回char.IsUpper(s [0]);
}
}
...
Console.WriteLine(“ Perth” .IsCapitalized()); //使用扩展方法
匿名类型:编译器在编译时会创建适当的类型。
var dude = new {名称=“鲍勃”,年龄= 23};
Console.WriteLine(dude.Name); //“鲍勃”
元组:允许将多个值组合到单个元素中,可用于从方法调用中返回多个值。
var bob = (“ Bob”,23) ; //允许编译器推断元素类型
Console.WriteLine(bob.Item1); //鲍勃
Console.WriteLine(bob.Item2); // 23
第5章:框架概述
存在哪些版本的.net框架及其功能集,包括框架不同部分的长长列表。 很好,仅供参考。
Windows Workflow Foundation对于构建实现业务工作流的软件而言似乎很有趣。 我稍后可能会对此进行进一步研究。
第6章:框架基础
描述编码的工作方式,诸如相等性比较之类的无休止的迭代,很容易参考,但不容易阅读。
值得注意的是,区域性设置会影响字符串功能。
第7章:集合
非常无聊的一章,介绍有关集合的所有内容。 大多数都完全符合预期。
第8章: LINQ查询
如果您希望学习如何使用LINQ,本章将使您失望。 它是LINQ特定的实现,必须涵盖每个LINQ构造如何在后台工作。 由于每个构造或多或少地被分开解释,因此很难获得有关如何使用LINQ的概述。
流利的语法和查询语法都包括在内。 需要注意的是,可以使用AsEnumerable在同一LINQ语句中从远程查询切换到本地查询。
正则表达式wordCounter =新正则表达式(@“ \ b(\ w | [-'])+ \ b”);
var query = dataContext.MedicalArticles
哪里(文章=> article.Topic ==“流感”)
.AsEnumerable()
哪里(article => wordCounter.Matches(article.Abstract).Count <100);
第一部分在远程SQL Server上运行,但是遇到AsEnumerable()时,将实例化该集合,其余部分在本地运行。 这样就可以执行远程源不支持的过滤。
LINQ L2S和EF有两个SQL后端。 如果使用新代码,似乎EF是必经之路。
第9章: LINQ运算符
所有操作员的演练,它们如何与本地集合和远程集合相关。 与上一章风格相似,它是所有运算符的枚举,并没有很好地说明如何使用它们。
第10章: LINQ to XML
我发现非常有趣的是,LINQ可用于查询XML文档,并且使用与LINQ其余部分相同的结构。
查询部分是从LINQ借来的,所以概念很相似。 从概念上讲,它与XPath非常相似,但是语法不同。
它还支持生成XML的聪明方法。 它不使用旧式DOM对象。 但是,X *类使生成XML更加容易。
var styleInstruction = new XProcessingInstruction(
“ xml-stylesheet”,“ href ='styles.css'type ='text / css'”);
var docType = new XDocumentType(“ html”,
“-// W3C // DTD XHTML 1.0 Strict // EN”,
“ http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”,null);
XNamespace ns =“ http://www.w3.org/1999/xhtml”;
var root =
新的XElement(ns +“ html”,
新的XElement(ns +“ head”,
新的XElement(ns +“标题”,“ XHTML页面”)),
新的XElement(ns +“ body”,
新的XElement(ns +“ p”,“这是内容”))
);
var doc =
新的XDocument(
新的XDeclaration(“ 1.0”,“ utf-8”,“否”),
新的XComment(“引用样式表”),
styleInstruction,
docType,
根);
doc.Save(“ test.html”);
第11章:其他XML技术
不使用LINQ当然也可以读写XML。
使用实际上不是SAX解析器而是关闭的东西读取XML。 与x-dom相比,它是低级别的,并且在许多方面都是原始的。
它提供了X-DOM无法实现的良好性能,但需要付出一定的代价。
它的问题是,它不善于处理顺序更改的元素。 可以将其与x-dom结合使用以同时兼顾两个方面。
第十二章:处置和垃圾收集
通过实现IDisposable,可以使用using语句触发dispose方法。
使用(FileStream fs = new FileStream(“ myFile.txt”,FileMode.Open))
{
// ...写入文件...
}
垃圾收集概述并不令人惊讶。
终结器是在垃圾回收之前在对象上运行的方法。 它通常是不需要的,并且功能非常有限。
如果任何字段包含实现IDisposable的类型,则最好在您的类中实现它,以确保调用所有dispose方法。
如果有对象引用,则不会对其进行垃圾回收。 但是可以创建对对象的弱引用。 垃圾收集器将忽略这种类型的引用,并且只有垃圾引用的对象可以被垃圾收集。 它可以用于实现缓存。
第十三章:诊断
有两个类提供基本的日志记录和断言功能。 调试和跟踪。 调试类仅在调试编译器中运行; 跟踪始终运行。 调试可用于仅在调试版本中启用的断言。
跟踪是标准的日志记录框架,具有许多不同的侦听器以记录到任何目的地。
例如,可以使用属性向调试器提示有关步进以及要忽略的内容:
[DebuggerStepThrough,DebuggerHidden]
无效的DoWorkProxy()
{
// 设定...
做工作();
// 拆除...
}
要声明性能,可以使用CPU和内存的性能计数器。 可以创建新的性能计数器(需要管理员权限)
Stopwatch类实现计时方法。
第14章:并发和异步
并发性的所有常见问题,与其他语言相比,C#没什么不同。
任务是路要走; 它为线程提供了更好的接口。 存在后台线程和前台线程两种类型。 如果主线程结束,则将杀死后台线程。 前景线程继续运行。
任务通过任务中的InnerException处理带有AggregateException的异常。 任务还支持继续以帮助提高性能。
粗粒度并发是使用Tasks实现的; 一个线程通常跨越多个方法调用。
细粒度的并发是使用异步实现的,并允许同时处理单个方法调用。
同步上下文,对GUI程序很有用。
调用异步方法并不总是在其他线程上执行。 如果知道答案(例如具有缓存),则可以同步完成。
如果不再需要结果,则将CancellationToken传递给异步调用使调用者可以取消处理。
使用IProgress 和Progress 类型实现进度报告。 它允许异步代码将进度传达回调用方。
第15章:流和I / O
构造为三层结构,包括适配器,装饰器和后备存储。 这似乎是一个经过深思熟虑的结构。
有不同标准Windows目录的常量列表。
MemoryMappedFile映射到共享内存。 可以在进程之间共享数据。
第十六章:网络
C#包含用于与服务交互的已实现客户端的列表。
- Web客户端(HTTP / FTP)
- HttpClient(Rest / web API),
- Smtp客户端
- Dns
- TcpClient
- UdpClient
请注意,默认并发限制为2,这对我来说有点保守。
HttpMessageHandler可用于在单元测试中进行模拟
请记住将代理设置设置为null,否则会自动检测到它们,这可能会很慢。
第17章:序列化
有四种不同的序列化机制,数据协定,二进制,XML序列化器和IXmlSerializable
它们都具有用于二进制/ XML格式的可插入格式器。
支持显式和隐式序列化。
某些引擎(并非全部)可能具有向前和向后兼容性。
据我所知,许多有关如何序列化和反序列化的选项几乎支持您所需要的一切。
第18章大会
强命名程序集提供了额外的安全性,因为它们包含用私钥签名的哈希,因此很难模仿。
GAC版本优于本地版本,这使事情变得复杂
附属程序集允许翻译资源+嵌入式资源,可使用GetManifestResourceStream访问
.resouce文件的处理与嵌入式资源的处理不同。
第19章:反射和元数据
支持您期望进行反思的所有内容。 支持即时生成新的IL代码。
第20章:动态编程
C#本质上是一种强类型语言。 但是它确实支持不带类型的编程。 这意味着在运行时解析类型。
此功能用于支持类似于IronPython的脚本语言。
第21章:安全性
代码访问安全性(CAS)用于创建沙箱环境,但:
微软在2015年表示,不应将CAS视为强制执行安全边界的机制(并且.NET Standard 2.0基本上已将CAS排除在外)。 尽管2010年CLR 4引入了对CAS的改进。
身份和角色安全性作为框架中的标准功能实现。 它同时支持命令式安全性(签入代码-迫使我们记住这样做)和声明性安全性(以属性最为人所知)。
加密支持使用最著名的算法支持哈希和加密/解密。
第22章:高级线程
我只是略读了本章,因为我主要是在Web上工作,在该Web中许多并行请求隐式地利用了线程。
第23章并行编程
也只是略读了本章。
PFX(并行框架)
PLINQ(与用于并行化任务的LINQ相同的语法)声明性语法
第24章:应用程序域
.net核心未使用该内容,因此我跳过了本章。
第25章:本机和COM互操作性
调用非托管代码(.dll等)。 我跳过了这一章。
第26章:正则表达式
C#正则表达式基于Perl 5正则表达式。 这样很容易找到好的例子。
第27章 Roslyn编译器
由于C#6.0编译器是用C#编写的,因此它是开源的,因此可以窥探代码的处理方式。
本章包含编译器体系结构的演练。 除非您对编译器有浓厚的兴趣,否则我将跳过本章。
最初发布在 Datadriven-investment.com上 。