String是一种引用类型,即使它具有值类型的大多数特性,例如是不可变的并且具有==重载以比较文本而不是确保它们引用相同的对象.
为什么字符串不是一个值类型呢?
基本上问题是每次程序集版本更改(即用户安装新版本的应用程序)时,所有设置都会重置默认值(或者更准确地说,在具有不同版本的文件夹中创建新的user.config文件)号码作为名称)
升级版本时如何保持相同的设置,因为似乎不鼓励使用ini文件或注册表?
当我们使用Clickonce它似乎能够处理这个,所以它似乎应该能够完成,但我不知道如何.
我已经阅读了关于何时以及如何覆盖的10个不同的问题,GetHashCode但仍然有一些我不太了解的问题.大多数实现GetHashCode都是基于对象字段的哈希码,但是引用的是值的值GetHashCode永远不会在对象的生命周期内发生变化.如果它所基于的字段是可变的,那该怎么办?另外,如果我确实希望字典查找等基于引用相等而不是我的重写Equals?
我主要是Equals为了方便单元测试我的序列化代码,我假设序列化和反序列化(在我的情况下为XML)会导致引用相等,所以我想确保至少它的值是正确的.Equals在这种情况下,这种不良做法是否会被覆盖?基本上在大多数执行代码中,我希望引用相等,而且我总是使用,==而不是重写.我应该创建一个新的方法ValueEquals或什么而不是覆盖Equals?我曾经认为框架总是使用==而不是Equals比较事物,因此我认为覆盖是安全的,Equals因为在我看来,如果你想要有与==运算符不同的第二个等式定义,那么它的目的是什么.从阅读其他几个问题虽然看起来并非如此.
编辑:
看来我的意图不清楚,我的意思是99%的时候我想要普通的老参考平等,默认行为,没有惊喜.对于非常罕见的情况,我希望值相等,并且我希望通过使用.Equals而不是显式请求值相等==.
当我这样做时,编译器建议我也覆盖GetHashCode,这就是这个问题的出现方式.GetHashCode当应用于可变对象时,似乎存在矛盾的目标,即:
a.Equals(b)那时a.GetHashCode()应该== b.GetHashCode().a.GetHashCode()永远不应该改变的价值a.当一个可变对象时,这些看起来自然是矛盾的,因为如果对象的状态发生变化,我们期望值的.Equals()变化,这意味着GetHashCode应该改变以匹配变化.Equals(),但GetHashCode不应该改变.
为什么会出现这种矛盾呢?这些建议不适用于可变对象吗?可能是假设,但可能值得一提的是我指的是不是结构的类.
解析度:
我将JaredPar标记为已被接受,但主要用于评论互动.总结我从中学到的是,在边缘情况下实现所有目标和避免可能的古怪行为的唯一方法是仅覆盖Equals并GetHashCode基于不可变字段或实现IEquatable.这种类似似乎削弱了覆盖Equals引用类型的有用性,因为从我看到的大多数引用类型通常没有不可变字段,除非它们存储在关系数据库中以使用它们的主键来标识它们.
我已经看到了以下问题,但它并没有让我想到我想要的地方:如何在Python中获取当前模块中所有类的列表?
特别是,我不想要导入的类,例如,如果我有以下模块:
from my.namespace import MyBaseClass
from somewhere.else import SomeOtherClass
class NewClass(MyBaseClass):
pass
class AnotherClass(MyBaseClass):
pass
class YetAnotherClass(MyBaseClass):
pass
Run Code Online (Sandbox Code Playgroud)
如果我使用clsmembers = inspect.getmembers(sys.modules[__name__], inspect.isclass)链接问题中的接受答案建议,它将返回MyBaseClass并且SomeOtherClass除了本模块中定义的3之外.
我怎么才能得到NewClass,AnotherClass而且YetAnotherClass?
我找到了一个关于注册DLL的示例,使用Windows Installer XML工具集在MSI文件中注册COM Interop的程序集.,和WiX抱怨"AssemblyRegisterComInterop"属性.
我删除了它并将"Assembly"属性更改为win32,它说我需要指定AssemblyManifest属性,但是我应该放在那里?
问题:刚刚开始,解决方案之外的任何程序集的所有引用都无法解决,The referenced component 'SomeComponent' could not be found.在尝试构建时.这种情况发生在第三方组件(所有15个左右)以及所有.NET Framework程序集中 - 基本上任何不是同一解决方案中的另一个项目.
试图加载一些其他解决方案产生了同样的问题.但是,创建一个新的WinForms项目没有问题.(从头开始重新安装VS之前,它已经工作了,现在也不起作用.我创建了一个新的WinForms应用程序以及一个WPF应用程序,设计师也无法加载程序集.我尝试了目标3.5和2.0而没有运气.)
我试过的事情:
有没有人有这方面的经验,并知道如何让这个再次工作?我最强大的Google-fu让我失望了,所以我在这里问.如果需要,可以标记社区维基.
更新:我尝试"升级"Windows(到相同的版本),因为我没有看到Vista的修复选项,它仍然是一个禁忌.我重新安装了一切似乎相关的东西.到目前为止,看起来我只是需要备份和重新格式化,我想除非在明天之前出现解决方案.
Update2:我只是备份了数据并重新格式化了,所以我再也无法验证我还没有尝试过的任何想法,所以我只是让赏金自己到达最高投票答案并作为参考之后可能遇到此问题的其他人.
我的一个朋友正在谈论她喜欢玩的文字游戏,你试图通过一次切换一个字母来将一个单词转换成另一个单词(它们具有相同数量的字母),其中每个迭代产生一个真正的单词.
例:
MOON - > WOLF
GOON
穿帮
GOLF
WOLF
我认为编写一个程序来生成解决方案是一个有趣的小项目,并且进一步考虑2个单词,确定解决方案是否存在以及最佳解决方案中的迭代次数.
问题是我无法找到可以通过编程方式轻松访问的免费单词列表.我也在考虑用这个作为学习Python的借口,所以如果有人知道免费的单词列表以及如何从Python解析和访问它的指针就会很棒.用于确定如何找到最佳路径的算法我将自己工作.
分析显示这是我写的一个小字游戏的代码中最慢的部分:
def distance(word1, word2):
difference = 0
for i in range(len(word1)):
if word1[i] != word2[i]:
difference += 1
return difference
def getchildren(word, wordlist):
return [ w for w in wordlist if distance(word, w) == 1 ]
Run Code Online (Sandbox Code Playgroud)
笔记:
distance()被调用超过500万次,其中大部分是来自getchildren,它应该让wordlist中的所有单词与word1个字母完全不同.word所以它保证word1并word2具有相同数量的字符.结果:
谢谢大家,通过不同建议的组合,我现在运行程序的速度提高了两倍(除了我自己在询问之前做的优化之外,所以从初始实现开始,速度提高了4倍)
我测试了2组输入,我称之为A和B.
优化1:迭代word1,2 ...的索引
for i in range(len(word1)):
if word1[i] != word2[i]:
difference += 1
return difference
Run Code Online (Sandbox Code Playgroud)
使用迭代迭代字母对zip(word1, word2)
for x,y in zip …Run Code Online (Sandbox Code Playgroud) python optimization python-2.x levenshtein-distance word-diff
我知道如何使用以下流程从进程启动具有管理员权限的进程:
proc.StartInfo.UseShellExecute = true;
proc.StartInfo.Verb = "runas";
Run Code Online (Sandbox Code Playgroud)
其中proc是System.Diagnostics.Process.但是,如何做相反的事情呢?
如果您所处的进程已经提升,那么如何在没有管理员权限的情况下启动新进程?更准确地说,我们需要使用与Windows资源管理器相同的权限级别启动新进程,因此如果禁用UAC则无需更改,但如果启用了UAC,但我们的进程正在升级,则需要执行某项操作因为我们正在创建一个虚拟驱动器,如果它是使用提升的权限创建的,并且Windows资源管理器运行速度不高,则不会显示.
随意将标题更改为更好的标题,我无法想出一个好的描述.
在自然语言中,我们会说"如果颜色是红色,蓝色或黄色,某些颜色是主要颜色."
在我看过的每种编程语言中,都转化为:
isPrimaryColor = someColor == "Red" or someColor == "Blue" or someColor == "Yellow"
Run Code Online (Sandbox Code Playgroud)
为什么没有更接近匹配英语句子的语法.毕竟,如果颜色为红色,或者颜色为蓝色,或者颜色为黄色,则不会说"某些颜色是原色."
我只是isPrimaryColor = someColor == ("Red" or "Blue" or "Yellow")因为而不是红色和黄色它们可能是布尔语句,在这种情况下布尔逻辑适用,但是如下所示:
isPrimaryColor = someColor ( == "Red" or == "Blue" or == "Yellow")
Run Code Online (Sandbox Code Playgroud)
作为一个额外的奖励,语法将允许更多的灵活性,说你想看一个数字是1到100或1000和2000,你可以说:
someNumber ((>= 1 and <=100) or (>=1000 and <=2000))
Run Code Online (Sandbox Code Playgroud)
编辑:
非常有趣的答案,并指出我应该学习更多的语言.在阅读完答案之后,我同意,对于严格的相等比较,类似于集合成员资格的东西是表达同一事物的清晰简洁的方式(对于具有简明内联列表或集合和测试成员资格的语言支持的语言)
出现的一个问题是,如果要比较的值是昂贵计算的结果,则需要(好的,应该)创建临时变量.另一个问题是可能需要检查不同的评估,例如"一些昂贵的计算结果应该是素数并且在200到300之间"
更多功能语言也涵盖了这些场景(虽然取决于语言可能不是更简洁),或者实际上任何可以将函数作为参数的语言.例如,前面的例子可能是
MeetsRequirements(GetCalculatedValue(), f(x):x > 200, f(x):x < 300, IsPrime)
Run Code Online (Sandbox Code Playgroud) c# ×3
python ×3
.net ×2
clr ×1
com ×1
dictionary ×1
dll ×1
elevation ×1
equals ×1
gethashcode ×1
optimization ×1
overriding ×1
process ×1
python-2.7 ×1
python-2.x ×1
settings ×1
string ×1
uac ×1
value-type ×1
wix ×1
wix3 ×1
word-diff ×1