【问题标题】:C# Hashtable not getting assigned a string [duplicate]C#哈希表没有被分配一个字符串[重复]
【发布时间】:2018-06-19 01:34:20
【问题描述】:

我最近遇到了这个关于哈希表的问题,想知道是否有人知道原因。请参阅下面的小代码示例和输出。

Hashtable temp = new Hashtable();
temp["a"] = ("100")[0].ToString();
temp["b"] = "1";

if(temp["a"] == "1")
  Response.Write("1");
else
  Response.Write("0");

if(temp["b"] == "1")
  Response.Write("1");
else
  Response.Write("0");

输出为“01”。为什么不是“11”? temp["a"] 被分配了一个字符串,那为什么实际上没有发生呢?

任何可以向我解释这一点或将我指向可能包含解释的文章的人都会有很大的帮助。一直困扰着我。

谢谢!

【问题讨论】:

  • 您正在通过引用比较字符串。使用泛型。
  • 或在比较之前强制转换。但泛型将是理想的解决方案。
  • 使用泛型有相同的输出。我不是在寻找让它工作的解决方案我在寻找为什么它不起作用的答案。在比较之前我不需要投射它。它被分配了一个字符串。
  • 另外你应该使用Dictionary 而不是HashTable,除非有充分的理由不...
  • @Aomine 这就是我要找的。谢谢。

标签: c# .net hashtable


【解决方案1】:

在这两种情况下,比较检查的是引用相等,而不是内容相等,因为左侧的类型是object。

temp["a"] 包含对在运行时创建的堆上的字符串“1”的引用,根据定义,它与内存中的 interned 字符串“1”不是同一个对象正在被比较。所以它运行其他部分。

temp["b"] 包含对 interned 字符串“1”的引用,根据定义,它与 interned 字符串“1”在内存中的对象相同被比较。所以它运行 if 部分。

有关更多信息,请查找“字符串实习”。

【讨论】:

    【解决方案2】:

    ((object)"1") == "1"[0].ToString() 计算结果为 False,因为这两个对象具有不同的地址。由于您使用的是非泛型 Hashtable 类,temp["a"] 被强制转换为对象,因此它会进行相同的比较。

    C# 竭尽全力让 string == string 工作得很好(与 Java 不同),但是当它不知道你在两边都有一个字符串时,它就无法做到这一点。

    正如其他人所提到的,您最好使用像 Dictionary 这样的泛型类来维护字符串的强类型,但另一种方法是使用 .Equals() 而不是 ==。或者在使用==之前手动将值转换为字符串。

    【讨论】:

      【解决方案3】:

      打电话

      if(temp["a"] == "1")

      将哈希表对象与字符串“1”进行比较,字符串“1”将对象与字符串进行比较。对象的根类型可能是字符串,但比较不会知道。

      如果你打电话

      if(temp["a"].ToString() == "1")

      相反,它应该可以工作。

      另一种选择是使用Dictionary<TKey,TValue> 泛型,当您调用temp["a"] 时,它将返回对象类型TValue 而不是对象

      Dictionary<string,int> temp = new Dictionary<string,int>();

      【讨论】:

      • if(temp["b"] == "1") 有什么不同?它不需要强制转换。
      • 正如@SLaks 提到的,因为它通过引用传递它。调用("100")[0].ToString(); 为您提供与"1" 不同的内存引用并且当C# 比较对象类型时,它使用内存位置而不是字符串值。
      • 本质上编译器是智能的,所以当你在许多不同的位置硬编码“1”时,它仍然会指向内存中的相同位置。查找字符串实习。
      • 尝试运行此示例。 (Object) 1 == (Object) 1; 将一个整数与另一个整数作为对象进行比较不会比较实际值,而是比较内存位置。基本类型(如 int、string、bool 等)具有内置的比较功能,指示如何按值而不是按引用比较两个对象。你甚至可以重载这些并在你自己的类上指定你自己的相等比较器来指示如何比较相同类型的两个对象。
      猜你喜欢
      • 2019-07-29
      • 1970-01-01
      • 2013-04-07
      • 2016-12-28
      • 2017-01-11
      • 2015-01-01
      • 2011-04-20
      • 2013-01-10
      • 2018-07-16
      相关资源
      最近更新 更多