Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.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# 什么是"建议"和"x201C ;;记录&x201D;在六年级上课?_C#_C# 6.0 - Fatal编程技术网

C# 什么是"建议"和"x201C ;;记录&x201D;在六年级上课?

C# 什么是"建议"和"x201C ;;记录&x201D;在六年级上课?,c#,c#-6.0,C#,C# 6.0,我相信这本书从未进入C#6k,但可能会考虑在以后的版本中发布。 我刚刚读了一篇关于C#6中的模式匹配和记录类以及操作符“is”的文章 请有人给我一个关于这一切的概述,这样我就可以理解一旦我写了C#6飞船,它会对C#代码产生什么影响 (请注意,这与数据库无关!但谷歌认为是这样的…) 我在找到之前先读——按其他顺序读会更有意义 如果记录类解决了以下问题: 目前,大多数ORMs和序列化程序都不支持不可变 类型。相反,他们假设将有一个无参数构造函数 和可变属性 通过标准化不可变类型的创建方式,无论模式

我相信这本书从未进入C#6k,但可能会考虑在以后的版本中发布。

我刚刚读了一篇关于C#6中的模式匹配和记录类以及操作符“is”的文章

请有人给我一个关于这一切的概述,这样我就可以理解一旦我写了C#6飞船,它会对C#代码产生什么影响

(请注意,这与数据库无关!但谷歌认为是这样的…)


我在找到之前先读——按其他顺序读会更有意义

如果记录类解决了以下问题:

目前,大多数ORMs和序列化程序都不支持不可变 类型。相反,他们假设将有一个无参数构造函数 和可变属性

通过标准化不可变类型的创建方式,无论模式匹配如何,我都可以看到它们非常棒。

来自:

这本质上是一个不可变的类,仅由其 构造器。以下是规范中的一个示例:

public record class Cartesian(double x: X, double y: Y);
除了构造函数之外,编译器还将自动 创建:

  • 每个参数的只读属性
  • 相等函数
  • GetHashCode重写
  • ToString覆盖
  • “is”运算符,在VB中称为“Matches”
我刚读到这个

想象一下一种叫做“记录”的东西,一种具有有序记录列表的类型 命名数据成员。不是说应该有一种新的类型 在类和结构旁边称为“记录类型”。。。的确如此 最好不要使用新的类型,因为我们可能需要 记录类和结构

方案1:可以使用主构造函数语法定义记录,它是扩展形式的语法糖,如下所示

class Point(int X, int Y);

==>

class Point(int X, int Y)
{
   public int X { get; } = X;
   public int Y { get; } = Y;
}
规则是:“当您编写记录时,它会自动为主要属性生成属性,除非您自己提供了这些属性”。术语“主属性”指的是主构造函数语法中的参数。因此,如果不希望它自动生成属性,则必须提供该属性的自己版本,如下例所示。(没有办法说您不想要这个语法的属性:如果您不想要这个属性,那么就根本不要使用这个特性)

根据,这是编译器生成不可变类型(
class
struct
)的一种方法,可用于模式匹配和记录语义


编译器将生成用于模式匹配的
is
运算符和
Equals
GetHashCode
ToString
方法具有记录语义。

在我看来,这只会增加一些语法上的糖分,在一些非常琐碎的情况下,你不应该更改旧代码。如果场景出现并有助于你的范例,你应该采用它,否则就是这样

这类似于异常过滤器,源于需要能够在C#中实现F#模式

让我们考虑“Is”超载,这个构造允许编译器进行特殊的过滤,但是在性能上没有那么简单,只是简单地过滤了这个子句。p> 例如

'如果(x是某物)返回(x是某物)。值>0'

变得有点像

“x是(某物,1)”

任何人都没有意识到的问题是,当x是通过继承或接口的其他属性的优点而产生的,并且这些属性是虚拟的时,调试起来可能会很棘手,特别是当每种类型都可能有im隐式或显式强制转换重载时

此外,“记录”的概念与匿名类型没有什么不同,匿名类型的类型具有基础属性

例如,某物的记录只是提供了一个包装器,将您的属性包装为不可变和哈希代码。(这一次只是为了支持具有另一组gotcha的主构造函数,例如,当继承类型定义由派生类型生成的属性时,会发生隐藏,并且最终必须键入所有内容)


希望这能回答这个问题。

请链接到博客帖子,否则很难获得任何上下文,但不确定哪一个是源头。就我个人而言,我非常喜欢这一切的外观,Instapaper:-)是博客文章,但我认为它可能遗漏了要点。这可能是:?它没有那么令人困惑。让人困惑的是如何整理初级开发人员试图编写的混乱的递归类型模式。只是一些没有实际用例的语法糖分:p@Jay,你真的认为球队有那么多的时间吗?我不知道,有主要的建设者,所有人都会感到惊讶!现在只要看看C语言团队如何避免使用/实现实际的“record”关键字。我在GitHub页面上看到的一切都显示了它们使用的是已经实现的语法,基本上看起来像是一个类声明。如果我们幸运的话,团队中的某个人可能真的会有一个存在意识,并尝试为这个特性添加一个合适的“record”关键字。
class Point(int X, int Y) { public int X => 15; }

==>

class Point(int X, int Y)
{
   public int X => 15;
   public int Y {get; set;} = Y;
}