【C#】小知识 #7: 使用 nameof 方便维护专案

nameof是C# 6 才引进的功能,改善之前一些字串弱维护方式,改成编译前强检查,在重构/重命名的名称时非常有用。

举例:

常看到 ASP.NET MVC 工程师在新专案使用HTML Helper,还是延续弱维护字串方式来串接Link,Url...以下一个跳转Link例子

    public class HomeController : Controller    {        public ActionResult Index() => this.View();    }    public class ITHelpController : Controller    {        public ActionResult SayHello() => this.Content("Hello ITHelp");    }
@Html.ActionLink("SayHello","SayHello","Home")

专案小还好,当专案随着时间变大变複杂,这时候有人修改、停用Controller、Action名称,就需要使用人工判断方式找寻、修改。

这时候可以改成nameof,以下gif内容展示方便更改方法等名称,不用担心改A坏B

@Html.ActionLink(linkText: "SayHello",    actionName: nameof(ITHelpController.SayHello),    controllerName: nameof(ITHelpController).GetControllerName())

2019-01-15.13.34.45-20190107.gif

至于GetControllerName()是另外封装的工具方法,为何额外做一个Extension,有经验的前辈、读者一定会想到,HTML Helper 对Controller Name定义是不需要包含Controller,直接使用nameof(HomeController)会找不到资源404错误,举例:
2019-01-15.13.13.04-image.png

所以写一个MVCStringExtension

public static class MVCStringExtension{    public static string GetControllerName(this string controllerName)    {        if (! controllerName.EndsWith("Controller"))            throw new Exception("请使用Controller类别");        return controllerName.Replace("Controller", "");    }}

当然nameof不只能应用在HTML Helper,像是Dapper一样可以藉由nameof维护字串栏位,避免忘记更新名称情况

void Main(){using (var cn = SqlHelper.GetConnection()){cn.Query<Test>($"select {nameof(Test.Name)} from {nameof(Test)} ;");}}public class Test{public string Name { get; set; }}

最后nameof更好的一点是不会影响效能,藉由反编译查看,可以发现系统自动转成对应字串.
2019-01-15.14.05.36-image.png


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章