为什么把东西放在元组中只是为了立即把它们取出来呢?

本文关键字:元组 为什么 | 更新日期: 2023-09-27 18:07:03

我在。net框架的很多地方都看到过这种情况。不幸的是,我不记得其他的,但他们都在武士刀的源代码程序集。

Stuff被放入元组中,并立即在相同的方法中删除/读回。这对我来说没有任何意义。

我理解它的用途(也是通过阅读维基百科关于这个主题的条目,以及多年前研究关系数据时学到的含义)。只是这种特殊的行为对我来说没有多大意义。

public AuthenticationResponseChallenge AuthenticationResponseChallenge
{
    get
    {
        Tuple<string[], IDictionary<string, string>> challengeEntry = this.ChallengeEntry;
        if (challengeEntry == null)
        {
            return null;
        }
        return new AuthenticationResponseChallenge(challengeEntry.Item1, new AuthenticationProperties(challengeEntry.Item2));
    }
    set
    {
        if (value == null)
        {
            this.ChallengeEntry = null;
            return;
        }
        this.ChallengeEntry = Tuple.Create<string[], IDictionary<string, string>>(value.AuthenticationTypes, value.Properties.Dictionary);
    }
}

好的,抱歉,坏例子。我工作太久了。我需要一个例子来说明我的观点。不幸的是,我从早上开始翻找了太多东西,我记不起来了,等我有空的时候再回来。

为什么把东西放在元组中只是为了立即把它们取出来呢?

这样,当set/return元组发生变化时,原始元组this.ChallengeEntry不会改变。

在此过程中,它保留对元组中原始项的引用,而不是对元组本身的引用。

在您提供的示例中,您有两个一起工作的属性:AuthenticationResponseChallengeChallengeEntry。它们都可以在任何时候访问,但值必须相似。

AuthenticationResponseChallengeChallengeEntry计算得出。

我不能回答为什么任何库的作者做出他们所做的设计决定。我可以说,当你需要将任意数量的值关联在一起时,内置的Tuple对于临时存储是很方便的,而且你不需要字典的语义。

在这个特殊的例子中,我个人会做两件事中的一件:

  • 创建我自己的结构/对象,为成员元素和ToAuthenticationResponseChallenge()转换方法和一个接受AuthenticationResponseChallenge对象的构造函数命名。
  • 创建一个扩展方法或函数来完成转换。