【问题标题】:Why put things in a tuple only to immediately get them out?为什么把东西放在一个元组中只是为了立即把它们取出来?
【发布时间】:2015-08-07 20:35:10
【问题描述】:

我在 .NET 框架的很多地方都看到了这一点。不幸的是,我不记得其他的,但它们都在 Katana 源代码程序集中。

东西被放入一个元组并立即以相同的方法删除/读回。这对我来说没有任何意义。

我了解(并且还通过阅读 the Wikipedia entry 关于该主题并在多年前研究关系数据时了解了其含义)它的用途。只是这种特殊行为对我来说没有多大意义。

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);
    }
}

更新

好的,抱歉,不好的例子。我已经工作太久了。我需要一个例子来说明我的观点。不幸的是,我从早上起就翻遍了很多东西,以至于我记不起来了,我会在有空的时候再回到这个。

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    这样,原始元组this.ChallengeEntry,在设置/返回的元组更改时不会更改。

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

    【讨论】:

    • 可能还在检查它是否为null 和使用其中包含的值之间防止多线程问题?
    • 它检查challengeEntry 是否为空。如果您在到达return new AuthenticationResponseChallenge(... 之前没有复制this.ChallengeEntry,那么在您尝试使用this.ChallengeEntry.Item1 之前,其他东西可能会将其无效
    • @JamesThorpe 是的,正在查看错误的代码。谢谢。
    【解决方案2】:

    在您提供的示例中,您有两个共同工作的属性:AuthenticationResponseChallengeChallengeEntry。它们都可以随时访问,但值需要类似。

    AuthenticationResponseChallenge 是根据ChallengeEntry 计算得出的。

    我无法回答为什么任何库的作者都会做出他们所做的设计决策。我可以说,当您需要将任意数量的值关联在一起并且不需要字典的语义时,内置的Tuple 便于临时存储。

    在这种特殊情况下,我个人会做以下两件事之一:

    • 为成员元素创建我自己的结构/对象,并使用有意义的名称、ToAuthenticationResponseChallenge() 转换方法和接受AuthenticationResponseChallenge 对象的构造函数。
    • 创建执行转换的扩展方法或函数。

    【讨论】:

      猜你喜欢
      • 2013-02-09
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 2017-07-09
      • 2022-08-16
      • 2022-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多