小编Ben*_*jol的帖子

隐含运算符 - 何时是好/坏主意?

我正在开发一个应用程序,其中Direction(前进/后退)的概念非常重要.

问题是在整个代码库中传播有几种不同的约定:在某些地方它是真/假,在其他地方是+ 1/-1.

为了尝试将这些结合在一起,我创建了:

public class DirectionClass
{ 
     public bool Forwards { get; set; }
     public double Sign { get; set; }
     public EDirection { get; set; }
     //plus associated constructor overloads, implementing IEquatable, etc.
}
Run Code Online (Sandbox Code Playgroud)

我现在想知道隐式转换是好还是坏:

public static implicit operator DirectionClass(double sign);
public static implicit operator DirectionClass(bool forwards); //etc..
Run Code Online (Sandbox Code Playgroud)

以及是否有可能包含的经典陷阱.

c# implicit

5
推荐指数
2
解决办法
768
查看次数

Control.Invoke 在隐藏的 ShowDialog 中“卡住”

(我有解决这个问题的方法,但这不是我第一次被咬,所以我试图确切地了解发生了什么。)

  • 从我的申请中,我得到了ShowDialog一张表格。
  • 表单上有一个按钮,单击该按钮时会调用另一个(非 GUI)线程上的代码。
  • 非 GUI 线程通过 Control.Invoke发回状态( Pushedthen )Released
  • 当表单看到 时Pushed,它会调用form.Hide()
  • 当表单看到 时Released,它会更改按钮的外观。

发生的情况是,有时(但并非每次)非 Gui 线程在尝试发送Released. 无一例外,Gui 继续“工作”,但无论在哪个方向,都不可能与非 Gui 线程进行进一步的通信。

线程的(简化的)调用堆栈如下所示:

System.Threading.WaitHandle.WaitOne()
(...)
System.Windows.Forms.Control.WaitForWaitHandle()
(...)
System.Windows.Forms.Control.Invoke()
(...)
GuiCode.OnStatusChanged()
(...)
NonGuiCode.SetStatus()
Run Code Online (Sandbox Code Playgroud)

ShowDialog如果我替换为,问题就会消失,但是 - 有趣的是 - 它会变得更好(发生的频率较低),但如果我注释掉执行onShow的代码,问题不会完全消失。HidePushed

更新

感谢nobugz,我发现了死锁(我以前只在数据库中遇到过它)!显然,用 Control.BeginInvoke 替换 Control.Invoke 可以解决此问题(状态事件有时仍然“卡住”,但它不会阻止所有后续通信)。

.net c# multithreading invoke

5
推荐指数
1
解决办法
3570
查看次数

从多个git rebase中恢复"旧提交"

我知道这个问题,但不知道如何将其映射到我目前的情况.(Rebase是可怕的,撤消rebase是双重可怕!)

我从我的主人的几个不同的功能分支开始:

master    x-x-x-x-x-x-x-x-x-x
             \       \    \
FeatureA      1-2-3   \    \
FeatureB               A-B  \
FeatureC                     X-Y-Z
Run Code Online (Sandbox Code Playgroud)

我想将它们合并在一起并检查它们是否在合并回到主机顶部之前工作,所以我做了一个:

git checkout FeatureB
git rebase FeatureA
git mergetool //etc
git rebase --continue
Run Code Online (Sandbox Code Playgroud)

然后

git checkout FeatureC
git rebase FeatureB
git mergetool //hack hack
git rebase --continue
Run Code Online (Sandbox Code Playgroud)

这让我失望了

master    x-x-x-x-x-x-x-x-x-x
             \
FeatureA      1-2-3 
                   \
FeatureB            A'-B'
                         \ 
FeatureC                  X'-Y'-Z'
Run Code Online (Sandbox Code Playgroud)

然后我纠正了一些没有正确编译的位,并将整个功能设置为可接受的状态:

master    x-x-x-x-x-x-x-x-x-x
             \
FeatureA      1-2-3 
                   \
FeatureB            A'-B'
                         \ 
FeatureC                  X'-Y'-Z'-W
Run Code Online (Sandbox Code Playgroud)

我的问题是,我的同事告诉我,我们还没有为FeatureA做好准备.

我有什么方法可以保留我的所有工作,但也可以恢复到我可以将FeatureC重新设置为功能B的情况吗?

git git-rebase

5
推荐指数
1
解决办法
498
查看次数

有向循环图(F#)的数据结构和算法

我正在尝试分析一个应用程序,其中程序集引用应该是有向非循环图,但不是.还有一个相关的问题,即子组件引用了一个子组件的不同版本(想想Escher ......)

我想要做的是分析每个组件 - 子组件对,并建立一个错误的图片.

我需要一些关于什么是良好的数据结构的指导.我不太确定我可以构建一个不可变的那个,但是我不介意在内部将它变为可变,然后在最后转换为不可变的.

问题的另一部分是我应该使用什么样的算法来填充数据结构,然后用于"分析"问题.

algorithm f# directed-graph data-structures

5
推荐指数
1
解决办法
1818
查看次数

在Mono上用F#签署DLL的问题

我试图在单声道F#中签署一个dll时遇到错误:

$ mono /usr/local/share/FSharp-2.0.0.0/bin/fsc.exe\
   --target:library \
   --keyfile:../../external/MyKeyFile.snk\
   AssemblyInfo.fs\
   ../../fs/FooBar.fs\  
   -o:FooBar.dll
Run Code Online (Sandbox Code Playgroud)

没有生成DLL,我收到此错误:

Microsoft (R) F# 2.0 Compiler build 2.0.0.0 Copyright (c) Microsoft Corporation. All Rights Reserved.`

error FS2014: A problem occurred writing the binary '': A call to StrongNameGetPublicKey failed (mscoree.dll)`
Run Code Online (Sandbox Code Playgroud)

密钥文件是在Windows中生成的,这有什么不同吗?

更新:

使用Mono 2.6.4

$ mono --version 

Mono JIT compiler version 2.6.4 (tarball Mon Jun 21 19:26:21 UTC 2010) 
Copyright (C) 2002-2010 Novell, Inc and Contributors. www.mono-project.com
TLS:           __thread
GC:            Included Boehm (with typed GC and Parallel Mark)
SIGSEGV:       altstack …
Run Code Online (Sandbox Code Playgroud)

mono f# assembly-signing

5
推荐指数
1
解决办法
600
查看次数

Visual Studio宏中是否存在等效的DoEvents?

我有一个长时间运行的宏,我在其中定期向Output写消息,以便用户知道发生的事情.问题是在宏完成之前输出不会显示(除非你打开"继续等待?"对话框,这很奇怪).

反正有没有'冲洗'事件队列?

macros visual-studio

5
推荐指数
1
解决办法
845
查看次数

开始使用SilverStripe模块的指针

我是SilverStripe的新手.

我想知道一个好的地方,我可以开始为SilverStripe制作模块; 一些很好的教程让我开始.

silverstripe

5
推荐指数
1
解决办法
1795
查看次数

在Ubuntu 10.10上安装git-flow会无声地失败

我试图使用说明安装gitflow在github上自述一拉:wget的-q -O - https://github.com/nvie/gitflow/raw/develop/contrib/gitflow-installer.sh | sudo sh

并且它默默地失败了...只是回到提示.有任何想法吗?

ubuntu-10.10 git-flow

5
推荐指数
1
解决办法
3435
查看次数

如何检测T是否为IEnumerable <T2>,如果是,则获取T2的类型?

我知道这个问题,它是后续的,也是这个问题,但我不能把它们放在一起,以帮助我做我想做的事情:

我有一个泛型类型,我想检查T是否为structOR,如果它实现IEnumerable<T2>,那么我想检查T2是否struct.

到目前为止,我已经到了这里('请原谅代码,这是实验性的):

private class TestClass<T>
{
    public TestClass()
    {
        Type type = typeof(T);
        //(detecting T == IEnumerable<something> ommitted for clarity)
        Type enumerableType = type.GetInterfaces()
                .Where(t => t.IsGenericType)
                .Select(t => t.GetGenericTypeDefinition())
                .Where(t => t == typeof(IEnumerable<>))
                .FirstOrDefault();
        if(enumerableType != null) 
        {
            Type enumeratedType = type.GetGenericArguments().First();
            if(!enumeratedType.IsValueType) //throw etc...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题enumerableTypeIEnumerable<>,所以enumeratedType它出来了T,而不是我传入的任何东西(例如new TestClass<int[]>()).

c# generics reflection

5
推荐指数
1
解决办法
1391
查看次数

Conjuring JQuery延迟了monadic咒语

受到这个(优秀)讨论在javascript中使用Promises的启发,我试图找出如何使用Deferred将异步和非异步函数链接在一起,以避免在使用我的" 全局存储 "代码时支付回调税.

我有几个与此相关的问题,但我会在这里问他们,因为背景是一样的.

我无法解决的一件事是我如何能够推断出非异步的东西 - 也就是说,我如何获取一个值,将其包装在一个promise中,然后直接返回它?(a -> M<a>)

另外,我如何获取异步函数并将其包装,以便它直接返回结果,但包含在promise中?((a -> b) -> (a -> M<b>))

最后一个问题,对于monadic怪胎 - 这个函数有一个标准名称吗? [a] -> (a -> M<b>) -> M<[b]>

monads jquery asynchronous jquery-deferred

5
推荐指数
2
解决办法
911
查看次数