C# 8:new关键字将能够推断类型

在许多情况下,在给定的位置只能是确定的类型。但是C#却要求显示的列出类型名称。如果Target-typed new表达式的建议被采纳,像这样的模板代码将不再需要。

表面上看,这个特征跟var关键字相反。但是它不是从表达式中推断变量类型,而是从变量中推断表达式的类型。下面分别是使用当前语法及建议语法的例子。

//当前语法
Dictionary<string, List<int>> field = new Dictionary<string, List<int>>();
//建议语法
Dictionary<string, List<int>> field = new();

像你看到的一样,当C#能够根据上下文推断出类型时,就不需要再详细制定类型了。对于局部变量,它并不是很有趣。它更能在临时参数的场景下发挥作用。

//当前写法
XmlReader.Create(reader, new XmlReaderSettings() { IgnoreWhitespace = true });
//建议写法
XmlReader.Create(reader, new() { IgnoreWhitespace = true });

再上面的代码中,类XmlReaderSettings并不是很有趣。它只不过是为了将选项值赋值给XmlReader。甚至有人认为XmlReaderSettings的出现能让我们忽视真正重要的信息。

在var关键字并不适用的场景下,比如字段和属性,这个特征比较有用。

private readonly static object s_syncObj = new();

根据这项建议,如下四种场景不适合使用。

  • 枚举: 并不是所有的枚举类型都包含0,因此应该明确列出每一个枚举成员。
  • 接口:这是一个小众的特征,最好明确的提出类型。
  • 数组: 数组的语法要求提供数组长度。
  • 结构体的默认构造函数: 这排除了所有基本类型和大多数值类型。如果您想使用此类类型的默认值,那么可以编写default。

目前,调用者表达式属性在c# 8路线图中以状态“Prototype”列出。特性测试计划在GitHub上可用。

本文翻译自:C# 8: Type Inference for the new Keyword

原文地址:https://www.cnblogs.com/SuperChan/p/10269394.html

时间: 2024-07-28 15:30:59

C# 8:new关键字将能够推断类型的相关文章

推断类型var

1.为什么使用推断类型var var可以根据变量的初始值自动推断局部变量类型,当无法确定所用变量的具体类型时可使用var 2.如何使用推断类型var 客户端代码 static void Main(string[] args) { var a = 10; var className = "var的学习"; //var student = new Student{StudentName = "王华", Age = 27};//创建对象 var student = new

强类型,弱类型和推断类型

一.强类型 在编译时就知道的类型.如: int i=1; 能点出来的也是强类型. 二.弱类型 在运行时才知道的类型. dynamic dynamic= new ExpandoObject();            dynamic.Name = "张三"; 通过索引器读出来的是弱类型.如:dr["id"]; 三.推断类型 var s="ss"; 反编译后发现s是string类型的.说明,在编译期间已经知道了类型.所以,var类型是强类型. var

黑马程序员---OC基础5【点语法】【@property关键字】【@synthesize关键字】【id类型】【动态类型】【构造方法】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- [点语法] 1 1.使用“点语法” 2 Student *stu= [[Student alloc]init]; 3         //调用set方法 4         [stu setAge:20]; 5         [stu setName:@"Jone"]; 6         //点语法:xcode的特性,Xcode帮我们做了代码替换 7         //点语法,

auto function -&gt; return type 当不能从{}内推断类型时

示例: 1 template<class F, class... Args> 2 auto ThreadPool::enqueue(F&& f, Args&&... args) 3 -> std::future<typename std::result_of<F(Args...)>::type> result_of可以推断函数F(Args...)的返回值类型, auto ->表明函数返回类型为std::future<ty

推断类型:decltype()的简单应用

template<class T, class U> auto operator+(const Matrix<T>& a, const Matrix<U>& b) -> Matrix<decltype(T{}+U{})> { Matrix<decltype(T{}+U{})> res; for(int i=0; i!=a.rows(); ++i) for(int j=0; j!=a.cols(); ++j) res(i,j)

推荐使用C++ 11

如果你的代码工作正常并且表现良好,你可能会想知道为什么还要使用C++ 11.当然了,使用用最新的技术感觉很好,但是事实上它是否值得呢? 在我看来,答案毫无疑问是肯定的.我在下面给出了9个理由,它们分为两类:性能优势和开发效率. 获得性能优势 理由1:move语义(move semantics).简单的说,它是优化复制的一种方式.有时候复制很显然是浪费的.如果你从一个临时的string对象复制内容,简单的复制指针到字符缓冲区将比创建一个新的缓冲区再复制要高效得多.他之所以能工作是因为源对象超出了范

浅谈C#中的常量、类型推断和作用域

浅谈C#中的常量.类型推断和作用域 作者: 字体:[增加 减小] 类型:转载 时间:2013-12-19我要评论 这篇文章主要介绍了C#中的常量.类型推断和作用域,有需要的朋友可以参考一下 一.常量常量是其值在使用过程中不会发生变化的变量.在声明和初始化变量时,在变量前面家关键字const,就可以把该变量指定为一个常量: const int a=100;//a的值将不可以改变 常量的特征: 1.常量必须在声明时初始化.指定了其值以后,就不能再修改了.2.常量的值必须能在编译时用于计算.因此不能从

6.6 类型推断

我们曾经讨论过值的类型推断,知道在 C# 3.0 中用 var 关键字,在 F#中用 let 绑定.从本节开始,我们将讨论由 C# 和 F# 共有的另一个方面,当在 C# 中调用泛型方法时,如 Option.Some(清单 5.9)或 Option.Map(清单 6.13),可以显式指定类型参数值,像这样: var dt = Option.Some<DateTime>(DateTime.Now); var nt = dt.Map<DateTime, int>(d=> d.Ye

Java 10 实战第 1 篇:局部变量类型推断

现在 Java 9 被遗弃了直接升级到了 Java 10,之前也发过 Java 10 新特性的文章,现在是开始实战 Java 10 的时候了. 今天要实战的是 Java 10 中最重要的特性:局部变量类型推断,大家都知道是 var 关键字,但具体怎么使用,及要注意什么要点呢? 我们通过几个例子来讲解局部变量类型推断这个新特性! 什么是局部变量类型推断 var javastack = "javastack"; System.out.println(javastack); 大家看出来了,局