.. NET最佳实践和技巧

Share

此资源包含的集合 .. NET最佳实践和技巧由我们的Toptal网络成员提供.

此资源包含的集合 .. NET最佳实践和技巧由我们的Toptal网络成员提供. As such, 本页将定期更新,以包括其他信息和涵盖新出现的问题 .NET techniques. 这是一个社区驱动的项目, 所以我们也鼓励你们做出贡献, 我们期待着你们的反馈.

.. NET Framework是微软公司开发的一个软件框架. 它功能强大,灵活,可以适应广泛的用途. Expert .. NET的最佳实践在网络上不难找到,因为它很受欢迎. 然而,通过展示最新的 .NET建议,我们认为我们可以做得更好.

请查看total资源页面以获取有关的其他信息 .NET, such as interview questions.

你应该知道的12个Visual Studio扩展

Visual Studio扩展正在添加新功能或修复IDE不需要的默认行为. Many .. NET开发人员非常熟悉一些很棒的扩展,比如ReSharper. 然而,有许多小而有用的扩展只做一项工作,但做得很好.

安装扩展非常简单:转到 Tools > Extensions and Updates..., click Online,然后搜索所需的扩展并单击 Download button. That’s it. 注意,某些扩展可能需要重新启动Visual Studio.

此列表中的所有扩展都满足以下条件:

  • 它们是免费软件,即使用于商业用途.
  • 它们服务于一个功能,而不是一个多用途的工具.
  • 它们是通用的扩展,不只是针对web或移动开发.

1. SpellChecker

Alternatives:

只是不要同时安装它们.

2. StopOnFirstBuildError

如果一个项目构建失败,这个简单的插件会立即停止构建过程.

3. VSColorOutput

用于构建和调试窗口的颜色输出.

4. Array Visualizer

这是为了显示阵列,锯齿状和高达4D,而调试应用程序. 现在它支持各种图表,如条形图、面积图和堆叠图.

5. Regex Tester

Visual Studio 2010-2015正则表达式测试器.

6. NoGit

在打开解决方案时禁用Git源代码控制提供程序.

7. ShowMyGitBranch

一个Visual Studio扩展,可以在标题栏上显示当前的Git分支.

8. 禁用No Source Available选项卡

这个小扩展将防止标题为“No Source Available”的工具窗口出现在Visual Studio中, 并将焦点保留在当前活动的选项卡上.

9. Copy As HTML

以HTML格式复制选定的代码,同时保留语法高亮显示, indentation, background colour and font.

10. BuildVision

这个简单的扩展可以可视化您的构建过程.

11. SaveAllTheTime

SaveAllTheTime使你永远不会在提交文件到Git时不再次保存. 它还会在屏幕右下角显示一个小部件,提醒您经常提交.

12. TabSanity

在制表符即空格中导航,就像它们实际上是制表符一样.

Contributors

Andrei Smirnov

Freelance .NET Developer
Turkey

Andrei是一位充满激情的全栈软件工程师,在微软工作了20年, EMC, Motorola, Deutsche Bank, and other big-name brands. 他利用各种移动软件栈构建了许多成功的项目, desktop, and web platforms. He is well versed in C++, C#, JavaScript语言和最受欢迎的框架, libraries, and tools.

Show More

从Toptal获取最新的开发人员更新.

订阅意味着同意我们的 privacy policy

你应该知道的11个NuGet软件包

每天我们使用很多NuGet包. 其中大多数都是众所周知的,并且需要安装,而其中一些是可选的. 如今,大多数“可选”软件包已成为工业标准,如NUnit或Newtonsoft.Json. 然而,开发人员不断开发新的软件,我们看到许多新的软件包出现在 NuGet Gallery.

在本文中,我们将回顾几个值得您注意的通用软件包. 我所说的“一般用途”是指您很可能会使用其中的一些软件包, 不管你在开发什么:一个web应用程序, 服务器端或桌面应用程序.

1. HangFire

一种在ASP中执行即炒即忘、延迟和循环任务的简单方法.NET applications. No Windows Service required.

Fire-and-forget tasks:

//静态方法用于演示
BackgroundJob.Enqueue(
    () => Console.WriteLine("Simple!"));

Delayed tasks:

BackgroundJob.Schedule(
    () => Console.WriteLine("Reliable!"), 
    TimeSpan.FromDays(7));

Recurring tasks:

RecurringJob.AddOrUpdate(
    () => Console.WriteLine("Transparent!"), 
    Cron.Daily);

2. NodaTime

一个更好的日期和时间API .NET.

乔恩出生于1976年6月19日(公历)。. 在英国时区,他现在多大了?

LocalDate birthDate = new LocalDate(1976,19);
DateTimeZone zone = DateTimeZoneProviders.Tzdb["Europe/London"];
ZonedClock时钟= SystemClock.Instance.InZone(zone);
LocalDate today = clock.GetCurrentLocalDateTime().Date;
Period age = Period.Between(birthDate, today);
Console.Jon的年龄是{0}年,{1}个月,{2}天.", age.Years, age.Months, age.Days);

3. UniRest

UniRest是一组轻量级HTTP库,支持多种语言.

该库可用于所有保留相同API的主流语言. .. NET版本具有可移植库,几乎可以在所有设备上运行 .NET Framework versions.

一个基本的POST请求示例:

HttpResponse jsonResponse = Unirest.post("http://httpbin.org/post")
  .标题(“接受”、“application / json”)
  .field("parameter", "value")
  .field("foo", "bar")
  .asJson();

4. Shouldly

Shouldly是一个断言框架,它专注于在断言失败时给出巨大的错误消息,并且简单而简洁.

Assert.That(map.IndexOfValue("boo"), Is.EqualTo(2));    // -> Expected 2 but was 1
map.IndexOfValue("boo").ShouldBe(2);                    // -> map.IndexOfValue("boo")应该是2,但实际上是1

5. MarkdownLog

Lightweight .用于以编程方式生成Markdown的。NET组件. 用于生成具有最小依赖关系的丰富诊断日志.

var data = new[]
{
    new{年份= 1991,专辑= "Out of Time",歌曲=11,评分= "* * * *"},
    new{年份= 1992,专辑= "Automatic for the People",歌曲=12,评分= "* * * * *"},
    new{年份= 1994,专辑= "Monster",歌曲=12首,评分= "* * *"}
};

Console.Write(data.ToMarkdownTable());

// Produces:
//
//年份|专辑|歌曲|评分   
//     ----:| ------------------------ | -----:| --------- 
// 1991 |不合时宜| 11 | * * * *  
// 1992 |自动为人民| 12 | * * * * *
// 1994 |怪物| 12 | * * *    

6. SharpZipLib

ziplib是一个完全用c#编写的Zip, GZip, Tar和BZip2库 .NET platform.

How to create a Zip file:

FastZip = new FastZip();

bool recurse = true;  // Include all files by recursing through the directory structure
string filter = @"\.txt$"; // Only files ending in ".txt"
fastZip.CreateZip("fileName., @"C:\SourceDirectory",递归,过滤器);

7. Humanizer

Humanizer meets all your .. NET需要操作和显示字符串, enums, dates, times, timespans, numbers and quantities.

一些不需要解释的例子:

DateTime.UtcNow.AddHours(-30).Humanize() => "yesterday"
DateTime.UtcNow.AddHours(-2).Humanize() => "2 hours ago"
TimeSpan.FromMilliseconds (1299630020).Humanize(4) => "2 weeks, 1 day, 1 hour, 30 seconds"
"string".Pluralize() => "strings"
"Men".Singularize() => "Man"
"man".ToQuantity(1) => "1 man"

8. QuickGraph

通用图数据结构和算法 .NET.

最需要的特性是拓扑排序:

DataSet ds = new MyDataSet(); // your dataset
var graph = ds.ToGraph();  // wraps the dataset into a DataSetGraph
foreach(DataTable表在图中.TopologicalSort()) //对数据集图应用拓扑排序
    Console.WriteLine(table.TableName); // in which order should we delete the tables?

9. EPPlus

EPPlus is a .. NET库,使用Open Office Xml格式(XLSX)读写Excel 2007/2010文件。.

这是一个如何在不访问文件系统的情况下从web服务器返回电子表格的示例.

private void DumpExcel(数据表)
{
    使用(ExcelPackage pck = new ExcelPackage())
    {
        //Create the worksheet
        ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Demo");

        //加载数据表到工作表,从单元格A1开始. 打印第1行上的列名
        ws.Cells["A1"].LoadFromDataTable(资源描述,真正的);

        //设置1-3列的标题格式
        using (ExcelRange rng = ws.Cells["A1:C1"])
        {
            rng.Style.Font.Bold = true;
        }

        //示例如何将列1格式化为数字 
        using (ExcelRange col = ws.Cells[2, 1, 2 + tbl.Rows.Count, 1])
        {
            col.Style.Numberformat.Format = "#,##0.00";
            col.Style.excelhorizontalalign = excelhorizontalalign.Right;
        }

        //写回客户端
        Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        Response.AddHeader("content-disposition", "attachment;  filename=ExcelDemo.xlsx");
        Response.BinaryWrite(pck.GetAsByteArray());
    }
}

10. HtmlAgilityPack

It is a .NET代码库,允许您解析“来自web”的HTML文件. 解析器对“真实世界”的格式错误HTML非常宽容.

例如,以下是如何解决所有问题 href tags in an HTML file:

HtmlDocument = new HtmlDocument();
doc.Load("file.htm");
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href"])
{
	HtmlAttribute att = link["href"];
	att.Value = FixLink(att);
}
doc.Save("file.htm");

11. FluentValidation

的一个小验证库 .NET使用流畅接口和lambda表达式来构建验证规则.

Example:

using FluentValidation;

public class CustomerValidator: AbstractValidator {
  public CustomerValidator() {
    RuleFor(customer => customer.Surname).NotEmpty();
    RuleFor(customer => customer.Forename).NotEmpty().WithMessage("请指定名字");
    RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount);
    RuleFor(customer => customer.Address).Length(20, 250);
    RuleFor(customer => customer.Postcode).Must(BeAValidPostcode).WithMessage("请指定有效的邮政编码");
  }

  private bool BeAValidPostcode(string postcode) {
    //自定义邮政编码验证逻辑在这里
  }
}

Customer Customer = new Customer();
validator = new CustomerValidator();
ValidationResult结果=验证器.Validate(customer);

bool validationSucceeded =结果.IsValid;
IList failures = results.Errors;

Contributors

Andrei Smirnov

Freelance .NET Developer
Turkey

Andrei是一位充满激情的全栈软件工程师,在微软工作了20年, EMC, Motorola, Deutsche Bank, and other big-name brands. 他利用各种移动软件栈构建了许多成功的项目, desktop, and web platforms. He is well versed in C++, C#, JavaScript语言和最受欢迎的框架, libraries, and tools.

Show More

如何在Visual Studio中管理TODO注释?

When coding, 开发人员有时会在代码中留下注释快捷键,当代码必须被审查或当他们对其他团队成员有问题时,这些注释快捷键需要更多的关注.

通常的做法是留下一个经典的注释快捷方式,如TODO,如下例所示:

public ActionResult Index()
{
    ViewData["Message"] = ""; // TODO: compose the message text;
    return View();
}

下面是单元测试的例子:

[TestMethod]
ValidationLogicTest()
{
    // TODO:实现单元测试
    Assert.失败(“尚未实现”);
}

Many .. NET开发人员使用ReSharper用蓝色突出显示TODO注释和注释, so it is easy to find them. 但是,在Visual Studio中我们可以使用 Task List. 任务列表跟踪使用快捷方式的代码注释, or tokens, such as TODO or NOTE, 或任何其他自定义命名令牌, 并添加快捷方式,将用户直接带到代码中的预定义位置. 当用户单击Task List中的项目时,它将带他到源代码中的位置. By default, Visual Studio包括以下令牌, TODO, UNDONE, and NOTE, 哪里的情况是不敏感的. 如前所述,用户可以通过转到添加自定义令牌 Tools > Options > Environment folder > Task List. 稍后,要打开任务列表窗口,用户可以进入菜单 View > Task List, or simply use shortcut Ctrl + \ , T.

当我们讨论TODO注释时, 这里有一个额外的提示:在与TODO一词的同一行写注释, 就像下面的例子:

// TODO:需要验证用户是否已登录.

其原因是,当您将所有文件从解决方案中搜索到TODO字时, 你会在搜索结果中看到这个单词所在的行. 如果要保持TODO和comment在同一行, 您将在搜索结果中看到并阅读评论文本.

// TODO:注释文本到这里 
// TODO: cleanup the code
// TODO:切换到配置设置
// TODO: bla-bla

否则你会看到这样的内容:

// TODO
// TODO
// TODO
// TODO

Contributors

Dmitry Pavlov

Freelance .NET Developer
Russia

Dmitry是一位拥有超过17年创作经验的顶尖开发者 .NET web applications. He mostly deals with ASP.NET Core and Blazor (C#, .. NET Core)软件开发栈. Dmitry曾八次获得微软MVP(开发者技术)奖,是一位有能力的社区领袖. 他还获得了计算机科学、构造地质学和建模的硕士学位. 客户称他为“编码机器”."

Show More

A Few ReSharper Tips

Many .. NET开发人员每天都在使用ReSharper,但却没有意识到ReSharper提供的隐藏的宝石.

对我来说最有用的技巧之一就是ReSharper。”Go To Type” feature. 此功能允许您快速导航到以下目的地:类型, symbols, files, recent edits, recent files, and recently viewed methods. 当您调用该功能时,建议列表就会出现,并最初包括您最近的文件和导航项. Default shortcut is Ctrl+T 如果您使用Visual Studio键盘方案.

ReSharper Go To Type

第二个有用的特性是“Incoming Calls”. 要访问它,请将光标移动到任何方法或属性上,然后按 Ctrl+Shift+Alt+A. In the Inspection Results Window that opens; you can expand the member node to run code analysis and display all members that call the current member. 还可以展开每个子节点.

ReSharper Incoming Calls

ReSharper另一个有用的特性是“Camel Humps Navigation”. 不幸的是,默认情况下,此选项没有绑定到任何快捷方式. To create a shortcut, go to Tools > Options > Keyboard, type “Hump” into the Show command containing:输入任何你想要的快捷方式. 例如,我的键盘快捷键如下:

  • Alt+Right Arrow for Hump_Next
  • Alt+Shift+Right Arrow for Hump_NextExtend
  • Alt+Left Arrow for Hump_Prev
  • Alt+Shift+Left Arrow for Hump_PrevExtend

ReSharper Camel Humps导航

Contributors

Vadim Pashkov

高级开发人员(TrustVerse)

Vadim是一名有十多年经验的软件开发人员, 并且对函数式编程等各种编程主题有着广泛的兴趣, distributed systems, and machine learning.

如何通过使用环绕代码片段来加速代码开发

Visual Studio IDE提供了一个很好的,但隐藏的特性,称为 Surround-with code snippets. 此特性允许您使用控制语句或 try-catch blocks quickly. 有许多可用的Surround-with代码片段,这里我们将使用 if 作为例证的陈述.

假设您有之前编写的一段代码. Now, 业务需求发生了变化, 你希望那个代码块只在特定的条件下执行.

Code example

传统上,你会输入 if-else 语句并将旧代码粘贴到其中. 如果您的代码很简单,这很容易. However, 如果你正在处理一个相对复杂的代码块,它本身有很多循环,并且已经包含了 if-else block statements? If you missed a single } 复制和粘贴时使用大括号, 解决这些相当简单的语法错误需要花费大量时间.

这是使用环绕代码片段的完美情况. Here is how it works:

  1. 首先,选择您想要包围的代码块 shift key together with up 箭头(用于从上到下的选择)或 down 箭头键(从下往上选择).
  2. 现在,使用三个键的组合键, CTRL + K + S.
  3. Visual Studio IDE将显示一个环绕代码块片段, 你可以选择任何你想要的. 在本例中,我们将使用 if statement block.
  4. 通过选择代码片段并点击 Enter 键时,代码块将被包围 if-else code block.

Using Surround-with

Contributors

Yogesh Keraliya

高级资讯科技顾问(物理顾问服务)

Yogesh Keraliya是一名技术爱好者,拥有两家技术咨询公司. 他帮助世界各地的许多客户使用微软技术栈成功地启动和运行他们的商业网站.

如何加快代码的编写速度

In Visual Studio, 有一个特性叫做“代码片段”, 哪一种方法可以简化通用代码结构的编写.

例如,如果您必须创建一个 for 语句时,您可能会键入以下代码块:

for (int i = 0; i < 10; i++)
    {
        
    }

Now imagine, if you type for and press TAB 你就会得到一个由Visual Studio生成的代码. As you keep pressing TAB 为了继续,您可以调整变量名. 如果您想回到代码片段中,只需使用 SHIFT+TAB.

对于代码片段,有一些特殊的命名为快捷键的单词, 你可以在Visual Studio菜单中看到可用的代码片段 Tools > Code Snippets Manager,其中按语言显示代码片段. 控件快速添加代码片段 VS extension. Or, if you want to do it manually.

此特性还适用于更多语句,例如 loop, while, and try/catch/finally.

Contributors

Dmitry Pavlov

Freelance .NET Developer
Russia

Dmitry是一位拥有超过17年创作经验的顶尖开发者 .NET web applications. He mostly deals with ASP.NET Core and Blazor (C#, .. NET Core)软件开发栈. Dmitry曾八次获得微软MVP(开发者技术)奖,是一位有能力的社区领袖. 他还获得了计算机科学、构造地质学和建模的硕士学位. 客户称他为“编码机器”."

Show More

Submit a tip

提交的问题和答案将被审查和编辑, 并可能会或可能不会选择张贴, 由Toptal全权决定, LLC.

* All fields are required

Toptal Connects the Top 3% 世界各地的自由职业人才.

Join the Toptal community.