使用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);
}
}
}
答案 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
的方法导入一个类真的令人困惑)
这与不可变集合(ImmutableList
,ImmutableArray
等)使用的方法相同
答案 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
)。List.map
,List.filter
,Set.intersect
等。这种方式为两个方面提供了最好的结果,对于希望其代码看起来像其他函数式语言的函数式程序员而言,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;
最重要的是您的代码对您和您的团队意味着什么。教条很少是选择风格的理由。