我尝试通过遵循此MDSN演练来设置调试.NET源代码.符号缓存已正确设置,检查"启用.NET Framework源步进"也是如此.
但随后,每当我想进入.NET代码时,系统都会提示我指定相关cs文件的位置.错误消息是
You need to find <filename>.cs to view the source for the current call stack frame和The debugger could not locate the source file <filename>.cs.
我被提议浏览文件(但我没有它)或查看反汇编(但我不希望这样).
如何进入.NET源代码?
我可能会说我对Code Contracts非常熟悉:我已经阅读并理解了大部分用户手册,并且已经使用了很长一段时间了,但我仍然有疑问.当我搜索SO代码"未经证实的代码合同"时,有很多点击,都在问为什么他们的具体陈述无法被静态证明.虽然我可以做同样的事情并发布我的具体情况(这是顺便说一句:
)
我更愿意理解为什么任何代码合同条件可以或不可以证明.有时我对它能证明的东西印象深刻,有时我......嗯......礼貌地说:绝对没有留下深刻的印象.如果我想了解这一点,我想知道静态检查器使用的机制.我相信我会从经验中学习,但我会在Contract.Assume所有地方喷洒语句以使警告消失,我觉得这不是Code Contracts的意思.谷歌搜索没有帮助我,所以我想问你们你们的经历:你们看到了什么(不明显的)模式?是什么让你看到光明?
我怀疑我对System.Collection.Generic.IReadOnlyCollection<T>语义的理解,并怀疑如何使用只读和不可变等概念进行设计.让我通过描述两个性质,我怀疑之间的文件,其中规定
表示强类型的只读元素集合.
取决于我是否强调"代表"或"只读"(当我在脑海中发音,或者如果这是你的风格时大声说话),我觉得这句话改变了意思:
IReadOnlyCollection<T>使用户(即对代表声明类型进行编码的人)明确表示他可能不会修改此集合.但是,声明类型本身是否可以修改集合是不明确的.第一个选项实际上是我的首选解释,尽管这个契约很容易被破解,例如通过ReadOnlyCollection<T>从一个数组中构造一个T然后将值设置到包装器数组中.
首创置业拥有门面不变性出色的接口,如IReadOnlyCollection<T>,IReadOnlyList<T>甚至可能IEnumerable<T>等.但是,我觉得观察不变性也是有用的,据我所知,有没有在BCL carring这个意义上任何接口(请指出来如果我错了,请告诉我.有意义的是,这些不存在,因为这种形式的不变性不能通过接口声明强制执行,只能由实现者强制执行(接口可以承载语义,如下所示).旁白:我希望在未来的C#版本中拥有这种能力!
示例:(可以跳过)我经常需要实现一个方法,该方法将另一个线程使用的集合作为参数获取,但该方法要求在执行期间不修改集合,因此我将参数声明为类型,IReadOnlyCollection<T>并给自己一个轻拍,认为我已满足要求.错误......对于一个调用者,签名看起来好像该方法承诺不更改集合,没有别的,如果调用者采用文档(外观)的第二种解释,他可能只是认为变异是允许的,并且方法在问题是对此的抵制.虽然此示例还有其他更常规的解决方案,但我希望您看到此问题可能是一个实际问题,特别是当其他人使用您的代码时(或未来 - 您就此而言).
所以现在我的实际问题(这引发了对现有接口语义的怀疑):
我想使用观察不变性和外观不变性并区分它们.我想到的两个选择是:
IImmutableCollection<T> : IReadOnlyCollection<T> { }和IImmutableList<T> : IReadOnlyList<T> { }.请注意,除了继承的接口之外,接口没有任何成员.这些接口的目的是单独说"即使声明类型也不会改变我!"‡我在这里特别说"不会"而不是"不能".这里有一个缺点:一个邪恶的(或者是错误的,保持礼貌的)实现者不会被编译器或其他任何东西阻止破坏这个合同.然而,优点是选择实现此接口而不是直接从其继承的接口的程序员很可能知道该接口发送的额外消息,因为程序员知道该接口的存在,因此可能会相应地实施它.我正在考虑使用第二种选择,但我担心它的设计问题与委托类型(它们被发明为在无语义的对应物上传递语义信息)相比Func,Action并且以某种方式失败,请参见此处.
我想知道你是否已经遇到/讨论过这个问题,或者我是否只是过多地讨论语义,应该接受现有的接口以及我是否只是不知道BCL中的现有解决方案.如上所述的任何设计问题都会有所帮助.但是我特别感兴趣的是你可能(已)提出我的问题的其他解决方案(简而言之就是在声明和使用方面区分观察和外观不变性).
先感谢您.
†我忽略了集合元素的字段等变异.
‡这对我之前给出的例子有效,但声明实际上更广泛.例如,任何声明方法都不会改变它,或者这种类型的参数表示该方法可以期望集合在其执行期间不会改变(这与说该方法不能改变集合不同,这是唯一的语句可以用现有的接口),也可能是许多其他语句.
我有一个我喜欢的问题,我喜欢考虑解决方案,但不幸的是我被困住了.我希望你也喜欢它.问题是:
我有两个2D点列表(比如A和B),并且需要将A点和B点的点配对,条件是所有对中的距离总和最小.一对包含A中的一个点和B中的一个点,一个点只能使用一次,并且应该创建尽可能多的对(即min(length(A), length(B))).
我做了一个简单的例子,其中颜色表示该点来自哪个列表,黑色连接是解决方案.
虽然这是一个很好的问题,我怀疑是NP难,但它会变得更好.我可以建立现有的解决方案.假设我有两个列表和相应的解决方案(即成对的集合),那么我需要解决的问题是当在一个列表中添加或删除一个点时重新优化该解决方案.
遗憾的是,我无法提出任何产生最佳解决方案的非暴力算法.我希望你可以.任何(伪)语言都可以理解任何算法,最好是C#.
遗憾的是,C#不允许使用额外的用户定义语法.但是我想知道是否有可能通过进入视觉工作室onbuild-event来超越这个限制.
假设我有一些语法糖,可以很容易地转换成实际的C#代码.如果我要自动将包含这种新语法的cs文档转换为有效的cs文档,那么在构建C#项目之前,项目就可以成功构建.总的来说,这就好像我已经扩展了C#语言,因为我开始使用包含非官方语法的无效cs文档,但无论如何都编译了.
我意识到这有一些问题,例如这种翻译是永久性的.这可以通过恢复原始cs来避免(在调试结束后应该恢复,否则会丢失一些IDE功能).但这些是次要问题.
请让我知道你对这个想法的看法.这是可能的,如果是这样,有人可以指导我一些有用的教程,以实现这一目标吗?特别是点击进入建筑事件.我搜索过MSDN,但主题(http://msdn.microsoft.com/en-us/library/hthab0h8.aspx)对我没有帮助.
我需要帮助才能理解multiprocessing.Queue.我遇到的问题是,queue.get(...)与调用queue.put(...)和队列缓冲区(deque)相比,获得结果是非常有趣的.
这种泄漏抽象导致我调查队列的内部.它直截了当的源代码只是指向deque实现,这似乎也很简单,我不能用它来解释我所看到的行为.另外我读到Queue使用管道,但我似乎无法在源代码中找到它.
我把它归结为一个重现问题的最小例子,我在下面指定了一个可能的输出.
import threading
import multiprocessing
import queue
q = None
def enqueue(item):
global q
if q is None:
q = multiprocessing.Queue()
process = threading.Thread(target=worker, args=(q,)) # or multiprocessing.Process Doesn't matter
process.start()
q.put(item)
print(f'len putted item: {len(item)}. qsize: {q.qsize()}. buffer len: {len(q._buffer)}')
def worker(local_queue):
while True:
try:
while True: # get all items
item = local_queue.get(block=False)
print(f'len got item: {len(item)}. qsize: {q.qsize()}. buffer len: {len(q._buffer)}')
except queue.Empty:
print('empty')
if …Run Code Online (Sandbox Code Playgroud) Resharper告诉我,MemberInfo.DeclaringType永远不能为null:

但是,当运行该代码时,将打印文本"顶级成员".我不明白,这里有什么不对?
像Resharper这样的产品有很多设置,我似乎找不到合适的设置来获得我想要的确切行为.
我试图改变的行为是:假设我想要的结果是

但目前的线路是

如你所料,我开始输入:

在选项卡之后我得到了这个

但我希望它成为

有谁知道如何改变Resharper设置,以实现我想要的行为?谢谢.
编辑:请注意,选项卡确实在默认VS智能感知中执行所需的行为.
请考虑以下代码:
int SomeField;
void Foo([Pure] Func<int, object> getData)
{
Contract.Requires(getData != null);
Contract.Requires(getData(this.SomeField) != null);
}
Run Code Online (Sandbox Code Playgroud)
我收到以下警告:
在方法合同中检测到对方法的调用'
System.Func'2<System.Int32,System.Object>.Invoke(System.Int32)' '[Pure]Foo(System.Func'2<System.Int32,System.Object>)
这个警告非常有意义.但是我还是想在合同中给代表打电话而不是警告(假设我的警告变成了错误).我如何实现这一目标?
我尝试了该属性Pure,如示例所示,但这不起作用.
我也想知道为什么PureAttribute可以在参数上指定.如果参数的类型不是委托类型是没有意义的,即使它是,它也不像我期望的那样工作,如上所述.
当在 vscode ( "python.linting.mypyEnabled": true,) 中启用 mypy 时,任何手动 mypy 命令都会变得非常慢且占用 CPU 资源(之前 10 秒,之后 3 分钟)。
看起来两个 mypy 进程应该是独立的,甚至可以通过缓存互相帮助,但它们似乎互相妨碍。
我注意到,从干净的环境来看,这种情况暂时不会发生。只有在 vscode 运行 mypy 之后,手动 mypy 命令才会变慢,即使 vscode 不再运行也是如此。
我能找到的唯一相关问题是这个。
c# ×6
resharper ×2
.net ×1
algorithm ×1
debugging ×1
delegates ×1
distance ×1
immutability ×1
intellisense ×1
mypy ×1
optimization ×1
parameters ×1
proof ×1
pylance ×1
python ×1
python-3.x ×1
readonly ×1
reflection ×1
semantics ×1
sum ×1