比方说,像许多人一样,你每天早上的首要任务之一就是处理你的电子邮件。您到达办公室,喝杯咖啡,然后安顿下来完成这项无处不在的现代任务。 当然,你要做的第一件事就是打开你的收件箱。然后打开每个未读电子邮件,选择所有,并复制它。接下来,打开Visual Studio的新实例,创建控制台项目,向其中添加文本文件,然后将电子邮件文本粘贴到该文本文件中。到最后,你有2到20个Visual Studio实例运行,这取决于你有多少未读电子邮件。此时,您已准备好阅读电子邮件,因此您可以在VS实例中选择alt-tab,在阅读电子邮件后关闭每个实例。 这个系统很适合你,但有两个主要缺点。首先,必须手动创建一个新项目和一个文本文件,然后打开文本文件,这是一个真正的麻烦。这将是真棒,如果有一种方法,你可以让Visual Studio为你做到这一点。其次,Visual Studio的所有这些实例都倾向于导致您的计算机崩溃,有时它们会崩溃。 怎么办?我会回到那个。
新的C # 功能!
目前,我想谈谈C # (6.0) 的最新版本,以及它如何引入了一些令人兴奋的新功能。我个人喜欢使用特征名称这允许您消除字符串和代码元素名称之间的后期绑定。我还发现属性初始值设定项为了方便消除我不想要的后备字段周围的样板。但有一个特殊的功能,我还没有机会使用:null条件运算符。我想更详细地讨论这个功能。 考虑以下代码,它需要一个房子,并检查它,以确定是否一个潜在的入侵者会认为有人在家。公共类SecurityAuditor
{
公共bool wouldinruderthinksomeonewashome (House)
{
光mostProminentLight = house.Floores [1].Rooms[“Kitchen”].Lights[“Overhead”];
返回mostProminentLight.IsOn;
}
}
这是一个非常简单的概念。它认为房子里的某盏灯是 “最突出的”,如果那盏灯亮着,它说入侵者会认为有人在家。我怀疑我会为此赢得ADT的合同,但这很容易推理。 但这也不是防御性的。看看所有可能出错的东西。对象为空,数组未初始化或大小正确,字典缺少键… yikes。要修复它,我们需要这样的东西: 公共类SecurityAuditor
{
公共bool woulinderthinksomeonewashome (House)
{
if (house != null & & house.楼层!= null & & house.Floors.Length > 1 & & house.Floors[1] != 空
& & 。楼层 [1]。房间!= null & & house.Floores [1].Rooms.ContainsKey(“厨房”))
{
灯光mostProminentLight = house.Floores [1].Rooms[“厨房”].Lights[“头顶”];
返回mostProminentLight.IsOn;
}
返回false;
}
}
哇,太丑了。我们还没完呢.我只是厌倦了打字。房间周围的所有支票仍然没有空,灯光也没有。我也可能错过了一些东西。幸运的是,C #6让我们做一些很酷的事情。 公共类SecurityAuditor
{
公共bool woulinderthinksomeonewashome (House)
{
光mostProminentLight = house?。地板?[1]?.房间?[“厨房”]?。灯?[“开销”];
返回mostProminentLight.IsOn;
}
}
您在那里看到的那些问号创建了一个空条件运算符 (“?” 和 “?[“),它将 “if(x = = null)” 检查内联,如果沿途的内容为null,则返回null。通过插入这些,我们覆盖了所有的防御性编程基础,除了检查那些字典是否存在键。但是,嘿,好多了,对吧? 是的,不是。为了理解原因,让我们回到 “Visual Studio as email client” 方案。
有问题的耦合
如果我告诉你,当你检查你的电子邮件时,我有治愈你痛苦的方法呢?现在,我知道这是很明显如何处理这个问题,但我不会是一个博客,如果我没有解释的事情。所有你需要做的是写一个Visual Studio插件,让你,用一个键盘快捷键,创建一个空的控制台应用程序,在该应用程序创建一个 “email.txt” 文件,并转储粘贴缓冲区到该文本文件。然后,处理崩溃,你只需要购买更多的内存。很甜蜜,对吧? 是啊,也许不是。也许你会告诉我,这就像治疗你腿部的复合骨折,方法是注射奴佛卡因,直到你的整个下半身麻木,然后继续你的生意。而且,你是对的。 这里的基本问题是,这种检查电子邮件的方法是愚蠢的。但是,这在某种程度上是愚蠢的。它引入了有问题的和不必要的耦合。在检查您的电子邮件时,没有理由依赖Visual Studio,并且不需要启动足够的实例来击败您的计算机。只需使用Outlook或您的浏览器为您的电子邮件。 它实际上与此代码示例相同,如所描述的原则称为德米特定律。在我关于入侵者的方法中,我想知道的就是房子是否有明显的照明。我不需要知道地板,房间和灯光之间的相互关系,就可以知道光线是否从房子的外面显示出来。如果房主决定将 “厨房” 重命名为 “Ug获取食物的地方”,为什么我必须更改我的实现? 这里是什么方法应该看起来像,消除有问题的耦合。公共类SecurityAuditor
{
公共bool wouldinruderthinksomeonewashome (House)
{
if(house = = null)
抛出新的ArgumentException(nameof(house));
返回house.IsLightVisibleFromDistance(25);
}
}
请注意,我没有使用spiffy new运算符。我不需要到,现在我不再依赖于一个高度耦合的实现,在这个实现中,我正在挑选别人的对象图的胆量。 如果你发现自己使用这个新的运营商,这是一种气味。请注意,我不是说运营商是坏的,我不是说你不应该使用它。像Novocaine一样,它有它的位置 (例如,麻木自己处理讨厌的遗留代码的痛苦)。但是,就像奴佛卡因一样,如果你发现自己依赖它,可能会有更深层次的问题。 想要构建具有高性能控件的桌面、移动或web应用程序?下载终极免费试用版现在,看看它能为你做什么! </span