List构造的语法较短

时间:2015-07-23 16:39:10

标签: c# static-methods c#-6.0

使用C#6.0,给出了这种静态方法:

public static List<T> List<T>(params T[] items) => new List<T>(items);

和适当的using

using static ListTest.ListUtils;

我可以使用List来构建列表:

var lsInt = List(10, 20, 30);

var lsStr = List("abc", "bcd", "cde");

如果没有List方法,可以通过以下方式完成构建:

var lsIntInitializer = new List<int>() { 10, 20, 30 };

名称List现在用于类和方法。它似乎工作正常,但除了不被认为是惯用之外,还有任何技术原因导致我不应该在这里使用List作为方法名称吗?

我也可以使用list,但这不是以不同的方式惯用,因为方法往往是大写的。

请注意,我在使用非惯用路线方面没有任何问题,但如果在这方面有一个公认的做法,我想了解它。

当然,C#6.0及其using static是一个勇敢的新世界,所以也许还没有足够的社区经验来处理这类事情。

language-ext项目使用类似的方法来构造ImmutableList个对象。在这种情况下,他们使用名称list

以下显示了上述摘录的整个工作示例。

using System;
using System.Collections.Generic;

using static ListTest.ListUtils;

namespace ListTest
{
    public static class ListUtils
    {
        public static List<T> List<T>(params T[] items) => new List<T>(items);
    }
    class Program
    {
        static void Main(string[] args)
        {
            var lsInt = List(10, 20, 30);

            var lsStr = List("abc", "bcd", "cde");

            var lsIntInitializer = new List<int>() { 10, 20, 30 };

            lsInt.ForEach(Console.WriteLine);

            lsStr.ForEach(Console.WriteLine);
        }
    }
}

2 个答案:

答案 0 :(得分:3)

这可能是一个不那么混乱的方法:

public static class List
{
    public static List<T> Create<T>(params T[] items) => new List<T>(items);
}

你会这样称呼:

var lsInt = List.Create(10, 20, 30);

(当然没有using static;使用名为Create的方法导入一个类真的令人困惑)

这与不可变集合(ImmutableListImmutableArray等)使用的方法相同

答案 1 :(得分:1)

Language-Ext的作者。显然你知道我对此的看法。我现在使用List而不是list来构建Lst<T>,它是ImmutableList<T>的包装器。

我认为C#的习惯问题是它们已经牢牢扎根于Java / C#1时代。如果这是你想要的编码风格,这很好。我认为你可以争辩说C#越来越像Scala而越来越不像Java了,所以如果你要在C#中掌握更新的功能工具,那么或许可以将你的习语更接近Scala(或F#)感。

我经常在这些类型的讨论中看到@ErikE的一条评论:

  

对我来说,方法名称应该是动词。如果List是一个动词,那么它不会创建一个列表,也不是要求返回一个列表,但它会执行列表行为 - 例如将数字放入某个列表中location(以及void返回类型)。所以没有协议,这里

这个方法名称应该是动词&#39;事情需要消亡,以及四人帮所写的任何东西的痴迷。它只是一种风格,一种技术。你不会在F#中查看列表构造(例如下面),并且思考&#34;我无法理解它在做什么,因为没有动词&#34; < / p>

let values = [1;2;3;4;5]

显然正在构建一个列表。在C#中怎么样

var values = new[] { 1, 2, 3, 4 };

&#39;新&#39;,新的什么?很明显,使用名称List作为构造函数是描述性的,如果不是更多,那么语言自己内置的列表构造(在这种情况下是数组,但重点仍然是有效)。

我现在已经为Language-Ext统一了一种风格,那就是:

  • 静态构造函数(如List)以大写字母开头,并描述构造后类型的类型或状态(因此Option<T>Some(value)构造}或None)。
  • 与F#中的模块类似的静态类使用camelCase命名,例如:List.mapList.filterSet.intersect等。
  • 方法是通常的PascalCase。

这种方式为两个方面提供了最好的结果,对于希望其代码看起来像其他函数式语言的函数式程序员而言,List.filter(...)得到list.Filter(...),并且对于那些找到它的人,您可以获得流畅的方法<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"> <Sitecore> <contentSearch> <configuration> <indexes hint="list:AddIndex"> <index id="sitecore_master_index" type="Sitecore.ContentSearch.SolrProvider.SolrSearchIndex, Sitecore.ContentSearch.SolrProvider"> <param desc="core">"Your Core Name Here"</param> </index> <index id="sitecore_web_index" type="Sitecore.ContentSearch.SolrProvider.SolrSearchIndex, Sitecore.ContentSearch.SolrProvider"> <param desc="core">"Your Core Name Here"</param> </index> <index id="sitecore_core_index" type="Sitecore.ContentSearch.SolrProvider.SolrSearchIndex, Sitecore.ContentSearch.SolrProvider"> <param desc="core">"Your Core Name Here"</param> </index> <index id="sitecore_analytics_index" type="Sitecore.ContentSearch.SolrProvider.SolrSearchIndex, Sitecore.ContentSearch.SolrProvider"> <param desc="core">"Your Core Name Here"</param> </index> <index id="sitecore_testing_index" type="Sitecore.ContentSearch.SolrProvider.SolrSearchIndex, Sitecore.ContentSearch.SolrProvider"> <param desc="core">"Your Core Name Here"</param> </index> <index id="sitecore_suggested_test_index" type="Sitecore.ContentSearch.SolrProvider.SolrSearchIndex, Sitecore.ContentSearch.SolrProvider"> <param desc="core">"Your Core Name Here"</param> </index> <index id="sitecore_fxm_master_index" type="Sitecore.ContentSearch.SolrProvider.SolrSearchIndex, Sitecore.ContentSearch.SolrProvider"> <param desc="core">"Your Core Name Here"</param> </index> <index id="sitecore_fxm_web_index" type="Sitecore.ContentSearch.SolrProvider.SolrSearchIndex, Sitecore.ContentSearch.SolrProvider"> <param desc="core">"Your Core Name Here"</param> </index> <index id="sitecore_list_index" type="Sitecore.ContentSearch.SolrProvider.SolrSearchIndex, Sitecore.ContentSearch.SolrProvider"> <param desc="core">"Your Core Name Here"</param> </index> <index id="social_messages_master" type="Sitecore.ContentSearch.SolrProvider.SolrSearchIndex, Sitecore.ContentSearch.SolrProvider"> <param desc="core">"Your Core Name Here"</param> </index> <index id="social_messages_web" type="Sitecore.ContentSearch.SolrProvider.SolrSearchIndex, Sitecore.ContentSearch.SolrProvider"> <param desc="core">"Your Core Name Here"</param> </index> <index id="sitecore_marketing_asset_index_master" type="Sitecore.ContentSearch.SolrProvider.SolrSearchIndex, Sitecore.ContentSearch.SolrProvider"> <param desc="core">"Your Core Name Here"</param> </index> <index id="sitecore_marketing_asset_index_web" type="Sitecore.ContentSearch.SolrProvider.SolrSearchIndex, Sitecore.ContentSearch.SolrProvider"> <param desc="core">"Your Core Name Here"</param> </index> </indexes> </configuration> </contentSearch> <settings> <!--<setting name="ContentSearch.Solr.ServiceBaseAddress"> <patch:attribute name="value">http://localhost:8983/solr</patch:attribute> </setting>--> </settings> </sitecore> 风格&#39;挑战&#39;

最重要的是您的代码对您和您的团队意味着什么。教条很少是选择风格的理由。