C# 用于列表构造的较短语法
对于C#6.0,给定此静态方法:C# 用于列表构造的较短语法,c#,static-methods,c#-6.0,C#,Static Methods,C# 6.0,对于C#6.0,给定此静态方法: public static List<T> List<T>(params T[] items) => new List<T>(items); 我可以使用List构建列表: var lsInt = List(10, 20, 30); var lsStr = List("abc", "bcd", "cde"); 如果没有列表方法,可以通过以下方式进行施工: var lsIntInitializer = new List
public static List<T> List<T>(params T[] items) => new List<T>(items);
我可以使用List
构建列表:
var lsInt = List(10, 20, 30);
var lsStr = List("abc", "bcd", "cde");
如果没有列表
方法,可以通过以下方式进行施工:
var lsIntInitializer = new List<int>() { 10, 20, 30 };
也许一个不那么令人困惑的方法是:
public static class List
{
public static List<T> Create<T>(params T[] items) => new List<T>(items);
}
(当然,如果不使用static,导入一个名为Create
的方法的类将非常混乱)
这与不可变集合(
ImmutableList
,ImmutableArray
等)使用的方法相同。这里是Language Ext的作者。很明显你知道我对这件事的看法。我现在使用List
而不是List
来构造Lst
,它是ImmutableList
的包装器
我认为C#的习惯用法的问题在于它们牢固地植根于Java/C#1时代。这很好,如果这是你想要的编码风格的话。我认为你可以说C越来越像Scala,而越来越不像Java,所以如果你想掌握C中较新的功能工具,那么也许将你的习惯用法更接近Scala(或F)是有意义的
我经常在这些类型的讨论中看到@ErikE的评论:
对我来说,方法名应该是动词。如果List是一个动词,那么它不会创建一个List,也不会要求返回List,而是执行列出的操作——比如将数字放在某个位置(返回类型为void)。所以这里没有协议
这种“方法名称应该是动词”的东西需要消失,再加上对“四人帮”写的任何东西的痴迷。这只是一种风格,一种技巧。例如,当你看F#中的列表结构时,你不会认为“我不可能理解它在做什么,因为没有动词”
它显然正在构建一个列表。C语言怎么样#
“新的”,新的什么?很明显,使用名称List
作为构造函数是描述性的,如果不是更多的话,那么语言本身内置的列表构造(在本例中是数组,但这一点仍然有效)
我现在已经统一了语言Ext的一种风格,那就是:
- 静态构造函数(如
)以大写字母开头,描述类型或类型在构造后的状态(因此对于列表
,使用选项
或一些(值)
)进行构造)无
- 与F#中的模块类似的静态类使用camelCase命名,例如:
、List.map
、List.filter
等Set.intersect
- 方法是以通常的方式使用PascalCase
List.filter(…)
,而对于那些认为这种风格“具有挑战性”的程序员,你可以得到流畅的方法List.filter(…)
最重要的是,你的代码对你和你的团队都有意义。教条不应该成为选择风格的理由。我不知道有什么技术原因,但为什么不选择一些更合适、更不容易混淆的东西,比如
MakeList
?还要注意,代码越短并不总是越好。我先看一下非惯用的变量名,就个人而言:)@dharmatech:我指的是下划线……虽然smth使代码更具可读性和语义,但非惯用命名没有错。如果惯例只是在增加噪音,那么它的含义是什么。这是一个观点,但列表(1,2,3)看起来很好,可读性很强。我要了一份清单——明白了。
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);
}
}
}
public static class List
{
public static List<T> Create<T>(params T[] items) => new List<T>(items);
}
var lsInt = List.Create(10, 20, 30);
let values = [1;2;3;4;5]
var values = new[] { 1, 2, 3, 4 };