代码之家  ›  专栏  ›  技术社区  ›  Ben McCormack

如何将唯一的对象引用作为列表中项目的字符串

  •  1
  • Ben McCormack  · 技术社区  · 14 年前

    我正在开发一个.NET电话应用程序,在这个应用程序中,我有一个显示给用户的内存项列表。当用户单击用户界面中的某个项目时,他们将在第二个视图中进入该项目的“详细信息”视图。我目前正在类中使用identity属性来引用列表中的唯一项,但我想知道是否有更好的方法。

    我在用 System.Windows.Navigation 设置 UriMappings 像这样:

    <nav:UriMapping Uri="/Items/{itemId}" 
                    MappedUri="/Views/Items.xaml?itemId={itemID}" />
    

    然后我使用 NavigationService 这样导航:

    NavigationService.Navigate(new Uri("/Items/" + item.id.ToString(),
                                       UriKind.Relative));
    

    所有这些都很好用,但我不知道我是否需要为我的客户提供一个标识栏 Item 类,这样就可以有一个唯一的字符串标识符传入 MappedUri 查询字符串。显示列表的用户界面控件提供了 中的对象 SelectionChanged 事件,所以我想知道是否有一种方法可以“匹配”它 项目 对象的唯一字符串值。如果我能为导航服务提供一个简单的对象引用,这将很容易,但我不知道如何使用字符串值来实现。这是什么 GetHashCode()

    3 回复  |  直到 14 年前
        1
  •  6
  •   Mark Byers    14 年前

    不, GetHashCode 不是用来唯一标识对象的。

    GetHashCode方法的默认实现不保证不同对象的唯一返回值。此外,.NETFramework不保证GetHashCode方法的默认实现,并且它返回的值在不同版本的.NETFramework之间是相同的。因此,此方法的默认实现不能用作散列目的的唯一对象标识符。

    Id 磁场是一个很好的解决方案。如果您不喜欢添加一个新字段只是为了给一个对象一个标识,那么您可以尝试找到一些现有字段的组合,这些字段被保护以唯一地标识您的对象,并使用合适的分隔符关联它们的字符串表示。注意分隔符不能出现在任何字段中。

        2
  •  2
  •   t0mm13b    14 年前

    有一个 GUID NewGuid ToString

        3
  •  2
  •   Jon Skeet    14 年前

    您一定要提供物品的ID。请记住,您的申请可能是 tombstoned ,因此当您尝试导航到该页时,该对象甚至可能不再位于内存中。您需要能够将应用程序还原到页面上,除了URL和序列化到临时或永久存储(通常在 OnNavigateFrom

    使用 GetHashCode() 因为这不仅不能保证唯一性,而且在新恢复的应用程序中也不太可能起作用。当你试图展示一些你没有真正了解的细节时,生活会变得更加艰难 得到了 身份证。。。但听起来你并不是真的处在那个位置。

    身份证, 作为身份证。你为什么还要用别的东西?如果你 不要 有一个ID,但可以很容易地添加一个,这样做。你想要一种唯一识别物体的方法。。。这正是身份证的作用。