天道酬勤,学无止境

Windows 7 中的 AssemblyDescription 发生了什么变化?(What happened to AssemblyDescription in Windows 7?)

问题

我们使用 AssemblyDescription 属性向我们的程序集添加注释(例如修复/分支信息)。

该文本在 XP 上的文件属性/注释中可见。 但是在 Windows 7 中,此字段已隐藏。

有没有办法在资源管理器或任何其他工具中显示此字段?

MS 是否在任何地方解释了为什么删除了这个字段以及我们应该使用什么来代替? (程序集标题?)

回答1

在我的测试程序集中,我在我的 AssemblyInfo.cs 中定义了这个

[assembly: AssemblyDescription("this is a description")]

我可以使用这些行中的任何一行从结果程序集中检索该文本:

通过 PowerShell

(dir $path).VersionInfo.Comments

通过 C#

System.Diagnostics.FileVersionInfo.GetVersionInfo(path).Comments
回答2

如果您想在 Windows 7 资源管理器中显示 AssemblyDescription,您将需要一个自定义外壳扩展,如下所示:

  • 版本标签
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • What happened to AssemblyDescription in Windows 7?
    We were using the AssemblyDescription attribute to add notes to our assemblies (e.g. fix/branch info). The text was visible on XP in the file Properties/Comments. However in Windows 7 this field has been hidden. Is there a way to show this field in explorer or any other tool? Does MS explain anywhere why this field was removed and what we should use instead? (AssemblyTitle?)
  • 在Visual Studio中重命名解决方案(和目录)的正确方法(Proper way to rename solution (and directories) in Visual Studio)
    问题 我有一个需要重新命名的相当复杂的Visual Studio解决方案(2010,但这没关系)。 我想重命名文件夹以匹配新的解决方案名称,但是我想不出一种自动重构文件夹名称的方法,因此遍历每个项目文件将很痛苦。 有官方的方法吗? 或者(是否更不建议如此),是否有免费工具来完成此任务? 回答1 手动编辑.sln文件 从Windows资源管理器中查看,此方法完全旨在重命名项目的目录。 此方法不会遇到下面的“删除/添加项目文件”方法中的问题(引用消失),但是如果您的项目在源代码控制下,则可能会导致问题(请参见下面的注释)。 这就是为什么步骤2(备份)如此重要的原因。 关闭Visual Studio。 创建.sln文件的备份(您可以随时回滚)。 假设您要将目录Project1重命名为Project2 。 如果未使用源代码管理,请使用Windows资源管理器将文件夹从Project1重命名为Project2 。 如果使用源代码管理,请使用源代码管理提供的功能将文件夹从Project1重命名为Project2 。 这将保留文件的历史记录。 例如,使用TortoiseSVN ,右键单击该文件,选择TortoiseSVN .. Rename 。 在.sln文件中,使用文本编辑器(如NotePad)将Project1所有实例编辑为Project2 。 重新启动Visual Studio
  • Android Gingerbread 之后 Async Task 真正发生了什么变化?(What change did really happen in Async Task after Android Gingerbread?)
    问题 在 android 2.3 之后,Android 团队在 Async 任务中真正做了什么改变。 当我执行以下代码时,我在 Android 2.3 和 3.0 中都得到了相同的结果。 package com.sample.asynctask; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; public class AsyncTaskTestActivity extends Activity { private static final String TAG = "AsyncTaskTestActivity"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //ExecutorService executorService = Executors.newFixedThreadPool(1); for (int
  • 调用QueryPerformanceCounter会发生什么?(What happens when QueryPerformanceCounter is called?)
    问题 我正在研究在系统中使用QueryPerformanceCounter的确切含义,并试图了解它对应用程序的影响。 从在4核单cpu机器上运行它可以看到运行大约需要230ns。 当我在24核4 cpu至强处理器上运行它时,大约需要1.4毫秒才能运行。 更有趣的是,在我的计算机上以多个线程运行它们时,它们不会互相影响。 但是在多cpu机器上,线程会引起某种交互,从而导致它们彼此阻塞。 我想知道总线上是否有所有它们都查询的共享资源? 当我调用QueryPerformanceCounter时会发生什么,它实际上能衡量什么? 回答1 Windows QueryPerformanceCounter()具有确定处理器数量并在必要时调用同步逻辑的逻辑。 它尝试使用TSC寄存器,但对于多处理器系统,不能保证该寄存器在处理器之间同步(更重要的是,由于智能降频和睡眠状态,该寄存器可能会发生很大变化)。 MSDN表示,调用哪个处理器都没有关系,因此您可能会在这种情况下看到额外的同步代码,从而导致开销。 还要记住,它可以调用总线传输,因此您可能会看到总线争用延迟。 如果可能,请尝试使用SetThreadAffinityMask()将其绑定到特定处理器。 否则,您可能只需要忍受延迟,或者可以尝试其他计时器(例如,查看http://en.wikipedia.org/wiki/High_Precision
  • 2 年后,github 学生帐户的存储库会发生什么变化?(What happens to a github student account's repositories at the end of 2 years?)
    问题 我刚刚使用我的大学电子邮件地址升级到免费的 github 微型计划。 我计划在本学期的一些课堂项目中使用私有存储库,但我想知道在我的免费学生升级到期后 2 年末这些存储库会发生什么。 我假设这与您从微型帐户降级到免费帐户时发生的情况相同。 我的存储库会消失、公开还是只读? 我已经搜索了一点,但无法找到答案。 回答1 (披露:我在 GitHub 工作) 只要您还是学生,就有资格享受学术折扣。 优惠券到期后,您可以重新申请学生折扣。 当您重新申请时,请确保您已将学校发放的电子邮件地址添加到您的帐户中,这将加快审批流程。 您将在折扣到期前收到一封通知电子邮件。 当折扣到期时,您的帐户将被锁定,这意味着您将无法访问您的私人存储库。 您的私有存储库不会被删除,也不会被公开。 当然,如果您有任何问题,您可以随时发送电子邮件至 support@github.com。 回答2 两年后,您将必须开始为私有存储库付费(7 美元/月),否则您的存储库将在保留期后被删除。 他们会给你 30 天的时间来付款,否则他们会删除存储库。 回答3 您即将到期的教育帐户的时间表如下所示: 您将在 Github 中收到一封电子邮件/通知,通知您您的教育优惠券将过期,并要求您: 将您的所有私人回购公开并降级为免费帐户, 添加付款方式,他们会在优惠券到期后开始向您收费,或者更新您的教育优惠券。 时间到了
  • 在高对比度模式下CSS实际发生了什么?(What actually happens to CSS in high contrast mode?)
    问题 谁能解释在高对比度模式下CSS会发生什么? http://hardlikesoftware.com/weblog/2009/11/04/css-sprites-vs-high-contrast-mode/ 在高对比度模式下,所有背景图像和颜色都将被忽略-替换为高对比度颜色,例如黑底白字或黑底白字。 另一个问题是背景图像不一定总是打印。 除此之外,还有什么? 我的登录表单看起来不太理想,我正在尝试调查。 直到最近才有https://www.google.com/search?q=axs+aol+accesibility+library,但它似乎不再存在。 通常,我看到有两种方法: 检测HCM(高对比度模式)并相应地调整CSS 使CSS更通用,使其可以在每种模式下工作 无论哪种情况,我都非常想知道在高对比度模式下CSS发生了什么变化。 如您所见,行为各不相同,因此您的专业知识将受到赞赏。 回答1 您是否为表单元素定义了文本和背景的颜色? 以下是参考列表Accessiweb 2.1中的相关标准:在每个网页上,是否正确使用了元素背景颜色和字体的CSS声明? (银级别等于WCAG 2.0 AA) 相关的WCAG 2.0故障技术为F24:指定前景色而不指定背景色,反之亦然 WebAIM最近发布的有关对比模式的文章:http://webaim.org/blog/high-contrast/
  • Android API 18 中的 windowContentOverlay 发生了什么变化?(What happened to windowContentOverlay in Android API 18?)
    问题 将手机升级到 Android 4.3 后,我注意到操作栏下方的阴影不再显示。 在我的应用程序中,我有一个使用windowContentOverlay的自定义阴影: <item name="android:windowContentOverlay">@drawable/shadows_bottom</item> 它一直在显示,但现在它在 API 18 上消失了。从主题中删除该行不会改变任何内容。 而在其他 API 版本上,它显示默认的轻微阴影。 有没有其他人注意到这个问题? 回答1 通过将以下方法添加到我的基础FragmentActivity并在布局膨胀后在onCreate调用它,我能够解决这个平台错误: /** * Set the window content overlay on device's that don't respect the theme * attribute. */ private void setWindowContentOverlayCompat() { if (Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN_MR2) { // Get the content view View contentView = findViewById(android.R.id.content); //
  • IE11 开发人员工具中的“始终从服务器刷新”发生了什么?(What happened to “Always refresh from server” in IE11 developer tools?)
    问题 Internet Explorer 11 中的 F12 开发人员工具是否也具有 IE 8-10 中开发人员工具的“始终从服务器刷新”功能? 我看到网络工具上的“清除浏览器缓存...(Ctrl + R)”按钮,但单击它似乎没有任何作用(Temporary Internet Files 文件夹之后仍然有文件)。 我还将“检查存储页面的较新版本:”设置设置为“每次访问网页时”,但这似乎并不总是刷新外部资产。 可以在 IE 11 中完全禁用缓存以进行开发吗? 现在我只是按住 Ctrl 键并单击刷新按钮(根据维基百科绕过缓存的说明),但这很容易忘记。 回答1 似乎他们在 Windows 8.1 附带的 IE11 的 RTM 版本中添加了“始终从服务器刷新”按钮 它位于开发人员工具的“网络”选项卡中,左侧第三个按钮。 回答2 2016 年 3 月 12 日更新 Windows 10上以蓝色Internet Explorer 11突出显示的左侧第四个图标: Windows 10上以蓝色Internet Explorer 12“Edge”突出显示的左侧第四个图标: 在 Windows 更新之前,Windows 7 上的旧版本、IE11 和可能的 IE10: 谢天谢地,Internet Explorer 开发人员工具栏已经过修订,但显然没有人更新他们的答案,因此您可以在此处禁用缓存: 回答3
  • iPhone 应用升级到新版本后,之前的数据会发生什么变化(iPhone What happens to previous data when app is upgraded to new version)
    问题 我有一个关于当应用程序升级到新版本时以前的数据会发生什么的问题。 我有一个具有本地数据库的当前应用程序。 用户可以修改数据库。 现在,如果我将应用程序升级到具有一些新功能的下一个版本,会发生什么? 它会完全取代数据库还是我仍然可以使用它。 如果数据库仍然存在,那么新功能如何像以前一样使用它,即假设它仍在资源中? 请在这方面提供帮助。 提前致谢。 编辑: 我试了一下,发现我们可以使用较早的数据库。 还有一个问题。 如何通知用户应用程序可以升级? 我需要使用推送通知还是有其他方法? 回答1 ~/Documents和~/Library/Preferences将被保留。 ~/Library那些 - 我不确定,但我认为它们也会被保留。 .app文件夹中的内容将被完全替换,但用户无论如何都无法更改.app文件夹中的内容。 回答2 应用数据由捆绑标识符管理,因为应用更新也在同一个捆绑标识符上, 当用户更新应用程序时,它会自动连接到相同的 Bundle 标识符,因此数据将与旧版本相同 但是如果您删除(卸载)应用程序,它将从 iPhone 中删除所有相关数据,然后安装新升级的应用程序将不会获得旧数据
  • 在Windows上使用符号链接克隆存储库时会发生什么?(What happens when I clone a repository with symlinks on Windows?)
    问题 关于在Windows上添加对符号链接的支持存在很多问题。 但是,当我在Windows上克隆带有符号链接的存储库时,实际发生了什么? 回答1 从本地Git客户端的1.5.3版本开始, git clone和git init将探测目标文件系统的符号链接支持,并相应地为core.symlinks设置本地存储库配置,即对于FAT或NTFS为false 。 这使得例如在Linux下创建和提交的符号链接显示为包含Windows下链接文本的纯文本文件(有关详细信息,请参阅core.symlinks上的git config文档)。 从Git for Windows 2.10.2版本开始,安装程序具有显式选项来启用符号链接支持。 在旧版Git for Windows中,您可以手动将core.symlinks设置为true ,这使Git可以在以下约束下创建符号链接: 符号链接仅在Windows Vista和更高版本上可用。 符号链接仅适用于NTFS,不适用于FAT。 您需要成为管理员和/或具有SeCreateSymbolicLinkPrivilege特权。 默认情况下,远程文件系统上的符号链接是禁用的。 Windows的符号链接被键入。 许多程序不理解符号链接(包括较旧版本的Windows资源管理器)。 有关更多详细信息,请参见Windows版Git Wiki。 在旧版的Git for
  • deltree发生了什么,它的替代品是什么?(What ever happened to deltree, and what's its replacement?)
    问题 在MS-DOS的早期版本中-我想说的是版本7,但我可能错了-有一个deltree命令,该命令递归地删除了给定路径中的所有子目录和文件。 deltree不再存在,但是del似乎没有继承删除树的功能。 del /s删除文件,但不删除文件夹。 您如何轻松地(即在一个命令中)从批处理文件中删除树? 回答1 正如其他人提到的那样, rd命令具有/s开关,以递归方式删除子目录。 您可以将其与/q开关结合使用,以强制删除子目录(及其内容),而无需进行提示 rd /s /q c:\foobar 每个人都缺少的是rd不能完全替代deltree因为(几乎)Googling为windows deltree返回的每个页面都会让您相信。 deltree命令适用于目录和文件,从而使其成为一个方便且通用的删除命令。 下列两个都是有效的: deltree /y c:\foobar deltree /y c:\baz.txt 但是rd (并不奇怪)仅适用于directory 。 因此,只有以下命令中的第一个有效,而第二个命令给出并出错并保留未删除的文件: rd /s /q c:\foobar rd /s /q c:\baz.txt 此外, del命令仅适用于文件,不适用于目录,因此只有第二条命令有效,而第一条命令却显示错误: del /f /q c:\foobar del /f /q c:\baz.txt
  • 如果我使用HTML 5的doctype,会发生什么?(If I use HTML 5's doctype, what will happen?)
    问题 我最近一直在学习doctype,并且想知道<!DOCTYPE html>与其他一些<!DOCTYPE html>之间的区别是什么。 我知道<!DOCTYPE html>是HTML5 doctype,并且它是实验性的,但是我想知道如果我使用它而不是其他doctype会发生什么? 提前致谢!!!! 回答1 基本上将发生的是,您将以“标准模式”呈现页面。 您可能不应该使用新的DOCTYPE的唯一原因是,如果您想使用XHTML 1.0标记并符合XHTML 1.0。 现在使用HTML5的不利之处在于规范可能会发生变化。 这对于您在不断变化的规格时保持最新很重要。 话虽如此,我已经开始在页面中使用新语法了。 此外,它还可以确保您的页面可以持续非常非常长的时间。 因此,继续使用它(并学习去爱它的简单性)。 回答2 卢卡斯(Lucas)最重要的方面。 让我以稍微不同的方式对此进行解释: 在浏览器中,doctype恰好用于设置渲染模式的一个目的:怪癖,几乎标准和完全标准的模式。 这一直很简单,直到MSIE 8引入了第二个开关,“兼容模式” =故意保留了MSIE7的错误和限制。 HTML5文档类型(通常)将覆盖该设置,因此比XHTML 1.x或HTML 4.01文档类型更强大。 (不过,MSIE有时可能会覆盖它。) 有关doctype切换和布局模式的权威指南,请访问:http:/
  • 当文件路径超过大约时,内部会发生什么? Windows 中有 32767 个字符?(What happens internally when a file path exceeds approx. 32767 characters in Windows?)
    问题 在 Windows 中(假设是 2000 年以后),文件路径的长度最多约为 32767 个字符。 由于在本机 API 中使用 UNICODE_STRING 进行内部处理(也在内核端、驱动程序等中),因此存在此限制。 到现在为止还挺好。 我知道那部分背后的理论。 限制的原因是UNICODE_STRING的Length和MaximumLength成员计算Buffer的字节数,但它们本身是 16 位无符号整数。 我也知道为什么这个限制是一个近似值而不是一个设定的限制。 这主要是由于您的文件名(例如\\.\C:\boot.ini )如何解析为其原生形式(例如\??\C:\boot.ini ),然后解析为以实际卷设备名称,然后是相对于该卷的路径,例如\Device\HarddiskVolume2\boot.ini 。 此外,从 Windows 资源管理器中,达到(“ANSI”) MAX_PATH限制时的已知症状是假装文件或文件夹在某些版本的 Windows 中不存在(这可能在某些时候得到修复)。 但是,当我使用类似\\.\C:\...\filename.ext的路径调用CreateFile()并且整个路径没有时,分别在对象管理器、I/O 管理器和文件系统驱动程序级别会发生什么超出限制,但在我对kernel32.dll的CreateFile()调用中达到它,然后被扩展? ... SDK
  • 了解事前发生和同步[重复](Understanding happens-before and synchronization [duplicate])
    问题 这个问题已经在这里有了答案: 在一致之前如何理解发生的事情(4个答案) 2年前关闭。 我试图理解Java发生在订单概念之前的事情,并且有些事情似乎非常令人困惑。 据我所知,之前发生的只是一系列动作的顺序,并不提供有关实时执行顺序的任何保证。 实际上(强调我的): 应当指出的是,两个动作之间先发生后发生的关系并不一定意味着它们必须在实现中按该顺序进行。 如果重新排序产生的结果与合法执行相符,则不合法。 因此,它的全部含义是,如果有两个动作w (写)和r (读)使得hb(w,r) ,则r可能实际上在执行中的w之前发生,但不能保证一定会。 同样,读r观察到写w 。 如何确定运行时随后执行了两个操作? 例如: public volatile int v; public int c; 动作: Thread A v = 3; //w Thread B c = v; //r 这里我们有hb(w, r)但这并不意味着c在赋值后将包含值3 。 如何强制c分配3? 同步命令是否提供这样的保证? 回答1 当JLS说线程A中的某个事件X在与线程B中的事件Y建立关系之前发生一个事件时,这并不意味着X将在Y之前发生。 这意味着,如果X发生在Y之前,那么两个线程都将同意X发生在Y之前。也就是说,两个线程都将以与X发生在Y之前的状态一致的方式看到程序的内存。 都是关于内存的。 线程通过共享内存进行通信
  • 如何具有自动递增的版本号(Visual Studio)? [复制](How to have an auto incrementing version number (Visual Studio)? [duplicate])
    问题 这个问题已经在这里有了答案: 使用Visual Studio时可以自动增加文件生成版本吗? (25个答案) 7年前关闭。 我想存储一组在构建时自动递增的整数: int MajorVersion = 0; int MinorVersion = 1; int Revision = 92; 当我编译时,它会自动增加Revision 。 当我建立安装项目时,它将增加MinorVersion (我可以手动执行此操作)。 MajorVersion只能手动增加。 然后,我可以在菜单“帮助/关于”中向用户显示版本号,如下所示: Version: 0.1.92 如何做到这一点? 这个问题不仅询问如何具有自动递增的版本号,还询问如何在代码中使用该版本号,这是比其他版本更完整的答案。 回答1 如果您将AssemblyInfo类添加到您的项目并修改AssemblyVersion属性以星号结尾,例如: [assembly: AssemblyVersion("2.10.*")] Visual Studio将根据这些规则为您增加最终编号(感谢galets,我完全错了!) 要在代码中引用此版本,以便可以将其显示给用户,请使用reflection 。 例如, Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName(
  • 当tcp / udp服务器发布的速度快于客户端消耗的速度时,会发生什么?(what happens when tcp/udp server is publishing faster than client is consuming?)
    问题 我试图了解当服务器发布(通过tcp,udp等)的发布速度超过客户端消耗数据的速度时发生的情况。 在一个程序中,我了解到,如果在生产者和消费者之间有一个队列,它将开始变得更大。 如果没有队列,那么生产者将根本无法生产任何新东西,直到消费者可以消费为止(我知道可能会有更多变化)。 我不清楚当数据离开服务器(可能是不同的进程,机器或数据中心)并发送到客户端时会发生什么情况。 如果客户端根本无法足够快地响应传入的数据(假设服务器和使用者之间的耦合非常松散),那么运行中的数据将如何处理? 在哪里可以阅读以获取有关此主题的详细信息? 我是否只需要阅读TCP / UDP的低级详细信息? 谢谢 回答1 使用TCP,有一个用于流量控制的TCP窗口。 TCP仅允许一次保留一定量的数据。 如果服务器生成数据的速度比客户端消耗数据的速度快,那么直到TCP窗口“满”时,未确认的数据量将增加,此时发送方TCP堆栈将等待,直到客户端发送完所有数据确认某些未决数据。 有了UDP,就没有这样的流控制系统。 毕竟是不可靠的。 客户端和服务器上的UDP堆栈都可以丢弃数据报,只要它们之间感觉良好,它们之间的所有路由器也是如此。 如果您发送的数据报数量超出了链接可以传递给客户端的数量,或者如果链接传递的数据报数量超过了客户端代码可以接收的数量,那么其中的一些数据报将被丢弃。
  • Windows 7上的Internet Explorer 11之后是什么? ES2016在企业中的支持程度如何?(What is after Internet Explorer 11 on Windows 7? How well will ES2016 be supported in enterprises?)
    问题 我在企业中支持基于Web的应用程序。 我目前需要使用Chrome,企业可以通过使用Chrome旧版浏览器支持插件来强制执行自动切换功能。 现在他们已经将Windows 7计算机更新为Internet Explorer 11,一些用户要求允许该应用程序在Internet Explorer 11上运行。 目前,我使用的JavaScript框架(与Babel一起)与IE11兼容,但是未来几年会发生什么呢? 我从未见过Microsoft提及IE 11之后发生任何变化的消息。实际上,他们说Windows 7不会有任何变化。随着JavaScript每年都在更新(ES2015,ES2016,ES2017等),Microsoft会如何做?计划使IE 11保持最新? 我们是否会被迫支持越来越“精简”的IE11? 在2020年(Windows 7生命周期结束)之前,我们是否会在企业中使用Internet Explorer 11? 回答1 随着JavaScript每年(ES2015,ES2016,ES2017等)每年进行更新,Microsoft如何计划使IE 11保持最新状态? 他们不会去。 自2015年起, Internet Explorer 11将不再接收任何新功能或平台错误修复。 从此以后,仅安全更新将提供给IE11。 展望未来,Microsoft Edge是新的浏览器,Windows
  • 如何检查程序集是使用Debug还是Release配置构建的?(How to check if an assembly was built using Debug or Release configuration?)
    问题 我正在开始部署Web应用程序,并且需要确保所有将要部署的程序集都是使用Release配置构建的。 我们的系统是使用C#/。Net 3.5开发的。 有什么办法可以做到这一点? 回答1 检查一下。 这个想法是,您可以使用Assembly.GetCustomAttributes()获取程序集属性的列表,并搜索DebuggableAttribute ,然后查找此类属性是否设置了IsJITTrackingEnabled属性。 public bool IsAssemblyDebugBuild(Assembly assembly) { return assembly.GetCustomAttributes(false).OfType<DebuggableAttribute>().Any(da => da.IsJITTrackingEnabled); } 回答2 我喜欢David的建议,但是您也可以这样( AssemblyInfo.cs ): #if DEBUG [assembly: AssemblyDescription("Your application assembly (DEBUG version)")] #else if RELEASE [assembly: AssemblyDescription("Your application assembly (RELEASE
  • 可观察到的行为和未定义的行为-如果不调用析构函数会发生什么?(Observable behavior and undefined behavior — What happens if I don't call a destructor?)
    问题 注意:我也看到过类似的问题,但是没有一个答案足够精确,所以我要问自己。 这是一个非常挑剔的“语言律师”问题; 我正在寻找权威的答案。 C ++标准说: 程序可以通过重新使用对象占用的存储空间,或通过为具有非平凡析构函数的类类型的对象显式调用析构函数,来结束任何对象的生命周期。 对于具有非平凡析构函数的类类型的对象,在重用或释放该对象占用的存储空间之前,不需要程序显式调用析构函数。 但是,如果没有显式调用析构函数,或者没有使用delete-expression释放存储,则不应隐式调用析构函数,并且任何依赖于析构函数产生的副作用的程序均具有未定义的行为。 我根本不理解“取决于副作用”的含义。 普遍的问题是: 忘了调用析构函数与忘了调用具有相同主体的普通函数有什么不同吗? 一个具体的例子来说明我的观点是: 考虑下面的程序。 还要考虑明显的变化(例如,如果我不在另一个对象之上构造一个对象,但仍然忘记调用析构函数,如果我不打印输出以观察它怎么办,等等): #include <math.h> #include <stdio.h> struct MakeRandom { int *p; MakeRandom(int *p) : p(p) { *p = rand(); } ~MakeRandom() { *p ^= rand(); } }; int main() { srand(
  • 为什么HashSet的keySet中的元素顺序在运行之间会发生变化?(Why the order of elements in HashSet's keySet changes from run to run?)
    问题 我有一些利用标准Java集合的代码:数组,ArrayDeques,HashMaps,列表,HashSets。 我的代码应该是确定性的:所有元素的哈希码,集合的初始内容等都应该仅取决于输入数据。 代码的最终输出是从某些HashMap的keySet()中产生的。 我注意到,结果keySet中的元素顺序有时会随着运行而变化。 这是什么意思? 一些标准集合具有不确定的行为(例如,某些内部对象的哈希码是不确定的)? 我自己的代码实际上是不确定的(例如,我忘记为某些类正确覆盖hashCode())? 这可能意味着我在某个地方有一个bug(尚未被测试捕获),这就是我担心的原因。 还有别的吗 这与Windows 7 x64上的JDK 1.7.0_60,x86相当一致。 据称,这在JDK 1.8.0_05中不会发生(或很少发生)。 同样,在上述JDK之间切换时,结果keySet中的元素顺序(以及处理数据项的整体顺序)也会改变。 我怀疑,这是HashSet的某些功能,但无法将其跟踪到特定的代码行。 UPD 1我实际上并不需要确定性集,而且我知道HashSet不提供任何保证。 我只是想找出不确定行为的原因。 如果它在库代码中-很好。 但是,如果它在我的代码中-我可能必须修复它。 因此,问题就来了。 UPD 2当然,发布问题后,我设法找到了答案。 刚开始是1.7的HashMap.java: /**