Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.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# 为什么.Net核心实现了ImmutableList<;T>;不产生无限循环?_C#_.net_Infinite Loop_Immutablelist - Fatal编程技术网

C# 为什么.Net核心实现了ImmutableList<;T>;不产生无限循环?

C# 为什么.Net核心实现了ImmutableList<;T>;不产生无限循环?,c#,.net,infinite-loop,immutablelist,C#,.net,Infinite Loop,Immutablelist,我一直在阅读微软刚刚发布的.Net核心项目中的一些代码。()很高兴能够看到.Net核心团队是如何实现的,我想我可能能够从他们的代码中学到一些东西 引起我注意的一件事是Clear()函数是如何实现的 [SuppressMessage("Microsoft.Security", "CA2104:DoNotDeclareReadOnlyMutableReferenceTypes")] public static readonly ImmutableList<T> Empty = new I

我一直在阅读微软刚刚发布的.Net核心项目中的一些代码。()很高兴能够看到.Net核心团队是如何实现的,我想我可能能够从他们的代码中学到一些东西

引起我注意的一件事是Clear()函数是如何实现的

[SuppressMessage("Microsoft.Security", "CA2104:DoNotDeclareReadOnlyMutableReferenceTypes")]
public static readonly ImmutableList<T> Empty = new ImmutableList<T>();


public ImmutableList<T> Clear()
{
    Contract.Ensures(Contract.Result<ImmutableList<T>>() != null);
    Contract.Ensures(Contract.Result<ImmutableList<T>>().IsEmpty);
    return Empty;
}
[SuppressMessage(“Microsoft.Security”,“CA2104:DoNotDeclareReadOnlyMutableReferenceTypes”)]
public static readonly ImmutableList Empty=新的ImmutableList();
公共不可变列表清除()
{
Contract.sure(Contract.Result()!=null);
Contract.survey(Contract.Result().IsEmpty);
返回空;
}
在我看来,当您创建一个新列表时,空属性将填充一个新列表,然后在运行Clear函数时返回该列表;从而取消对旧列表的引用(如果您说:var students=students.Clear();),并允许GC清除旧列表

所有这些都很酷,但我不明白的是,上面对空属性的定义如何不会导致无限循环?如果每次创建一个新列表时,它实际上会生成两个,那么这是否意味着为空属性列表实例化的新ImmutableList也会为其空属性实例化另一个列表,以此类推


有人能解释一下吗?如果我以上的理解不正确,也请纠正我。

是静态的,因此只创建一次。因为它是不可变的,所以它向调用
Clear

Empty
的任何人返回相同的实例并不重要,因为它是静态的,因此只创建一次。由于它是不可变的,所以它向调用
Clear

的任何人返回相同的实例并不重要,它是静态的-对于该类型的
Empty
属性,内存中只有一个
新的不可变列表
。您可能错过了static关键字吗?谢谢@Charleh,我没有意识到静态是如何工作的。我以为它只是为那个实例在内存中创建了一个新的不可变列表。我很高兴我现在问了。它是静态的-内存中只有一个
新的ImmutableList
用于此类型的
Empty
属性。您是否错过了静态关键字?谢谢@Charleh,我不知道静态是如何工作的。我以为它只是为那个实例在内存中创建了一个新的不可变列表。我很高兴我现在问了。谢谢!我不知道静电是这样工作的。我以为每个实例只有一个,不是所有的实例,太棒了。这样简单但经过深思熟虑的代码。这只会在产生相同数据时安全地工作。一般来说,静态的
static
不应该被认为是线程安全的。@Mgetz:但是静态字段初始值设定项是线程安全的。NET运行时确保它们只运行一次。因此,这并不是因为数据竞争无关紧要才起作用。没有数据竞争。@Joren正确,在这种情况下,数据竞争是不可能的,因为数据是不可变的,初始化没有问题。谢谢!我不知道静电是这样工作的。我以为每个实例只有一个,不是所有的实例,太棒了。这样简单但经过深思熟虑的代码。这只会在产生相同数据时安全地工作。一般来说,静态的
static
不应该被认为是线程安全的。@Mgetz:但是静态字段初始值设定项是线程安全的。NET运行时确保它们只运行一次。因此,这并不是因为数据竞争无关紧要才起作用。不存在数据竞争。@Joren正确,在这种情况下,数据竞争是不可能的,因为数据是不可变的,初始化没有问题。