Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于列表构造的较短语法_C#_Static Methods_C# 6.0 - Fatal编程技术网

C# 用于列表构造的较短语法

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

对于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<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 };