小编Jim*_*hel的帖子

为什么使用IList而不是IEnumerable?

1)我读了一些(一般)代码片段,看到了IList<T>一些使用过的地方和一些使用过的地方IEnumerable.使用第一个优于后者的优点是什么?

2)isasc#.我明白 is做类型检查并as做铸造.但到底是什么?强制数据到某个大小的对象?什么时候isas不同?

.net c#

15
推荐指数
1
解决办法
1908
查看次数

GC.KeepAlive与使用

在他关于防止应用程序的多个实例文章中,Michael Covington提出了以下代码:

static void Main()                  // args are OK here, of course
{
    bool ok;
    m = new System.Threading.Mutex(true, "YourNameHere", out ok);

    if (! ok)
    {
        MessageBox.Show("Another instance is already running.");
        return;
    }

    Application.Run(new Form1());   // or whatever was there

    GC.KeepAlive(m);                // important!
}
Run Code Online (Sandbox Code Playgroud)

他解释说,GC.KeepAlive(m)是防止垃圾收集器尽早收集互斥锁所必需的,因为没有额外的引用.

我的问题:将mutex包装在一个使用中做同样的事情?也就是说,以下是否也会阻止GC从我身下拉出地毯?

static void Main()                  // args are OK here, of course
{
    bool ok;
    using (var m = new System.Threading.Mutex(true, "YourNameHere", out ok))
    {
        if (! ok)
        {
            MessageBox.Show("Another …
Run Code Online (Sandbox Code Playgroud)

c# garbage-collection keep-alive

14
推荐指数
2
解决办法
6299
查看次数

从并发字典中获取所有值并清除它而不会丢失数据

我正在将对象添加/更新到并发字典中并定期(每分钟)刷新字典,所以我的代码看起来像这样:

    private static ConcurrentDictionary<string, Metric> _metrics = new ConcurrentDictionary<string, Metric>();

    public static void IncrementCountMetricBy(string name, int count)
    {           
        _metrics.AddOrUpdate(....
    }

    public static Metric[] Flush()
    {
        var flushedMetrics = _metrics;
        _metrics = new ConcurrentDictionary<string, Metric>();
        return flushedMetrics.Values.ToArray();
    }
Run Code Online (Sandbox Code Playgroud)

现在我不确定这段代码是否有可能丢失一些对象/更新

.net c#

14
推荐指数
2
解决办法
4131
查看次数

在.NET中,为什么常量在编译时而不是在JIT时进行评估?

今天,当我在静态类中更改公开可见常量的值,然后用新编译的版本替换了程序集的旧副本时,我有点意外.令人惊讶的是,引用程序集的现有程序没有获取常量的新值.也就是说,我没有重新编译可执行文件,而只是替换了那个程序集.

我的实验的完整描述是如何常数是常数?

我承认对这种行为感到非常惊讶.我明白发生了什么,但我不明白为什么.是否有一个特殊的技术原因导致常量不能在JIT时间而不是编译时间被选中?是否存在这样做会破坏事情的情况?

.net c# const

13
推荐指数
1
解决办法
1046
查看次数

Uri.TryCreate抛出UriFormatException?

我有一个方法,尝试创建一个Uri,然后清理它(删除片段,排除一些域和查询字符串模式等).该方法如下所示:

static public bool TryCreateCleanUri(Uri baseUri, string relstr, out Uri result)
{
    if (!Uri.TryCreate(baseUri, relstr, out result))
    {
        return false;
    }
    return CleanupUri(result, out result);
}
Run Code Online (Sandbox Code Playgroud)

这种方法已经好几个月了.但是昨晚失败了.Uri.TryCreate()抛出异常!这是堆栈跟踪:

ERROR: Unhandled exception caught.  Program terminating.
System.UriFormatException: Invalid URI: The hostname could not be parsed.
   at System.Uri.CreateHostStringHelper(String str, UInt16 idx, UInt16 end, Flags& flags, String& scopeId)
   at System.Uri.CreateHostString()
   at System.Uri.GetComponentsHelper(UriComponents uriComponents, UriFormat uriFormat)
   at System.Uri.CombineUri(Uri basePart, String relativePart, UriFormat uriFormat)
   at System.Uri.GetCombinedString(Uri baseUri, String relativeStr, Boolean dontEscape, String& result)
   at System.Uri.ResolveHelper(Uri baseUri, Uri …
Run Code Online (Sandbox Code Playgroud)

.net c#

12
推荐指数
1
解决办法
1万
查看次数

当替换类型参数后两个方法具有相同的签名时,将覆盖错误的重载

我们相信这个例子在C#编译器中出现了一个错误(如果我们错了,请取笑我).这个错误可能是众所周知的:毕竟,我们的示例是对此博客文章中描述的内容的简单修改.

using System;

namespace GenericConflict
{
  class Base<T, S>
  {
    public virtual int Foo(T t)
    { return 1; }
    public virtual int Foo(S s)
    { return 2; }

    public int CallFooOfT(T t)
    { return Foo(t); }
    public int CallFooOfS(S s)
    { return Foo(s); }
  }

  class Intermediate<T, S> : Base<T, S>
  {
    public override int Foo(T t)
    { return 11; }
  }

  class Conflict : Intermediate<string, string>
  {
    public override int Foo(string t)
    { return 101;  }
  } …
Run Code Online (Sandbox Code Playgroud)

c# compiler-construction generics overriding overload-resolution

12
推荐指数
1
解决办法
695
查看次数

如何拦截所有键盘事件并防止在WinForms应用程序中失去焦点?

我的一个朋友是盲人,我有一个想法是开发一个程序,让他在盲人打字方法和听力反馈的帮助下使用PC.如果我的应用程序可以在启动后立即强制完全控制整个键盘输入,那么体验会更加丰富(使用更多按键来执行特定功能)和完美无缺(如防止偶尔的焦点丢失)(我会把它放在一边)在他的启动).我是WinForms C#.Net开发人员,所以我想在使用这种特定框架和语言的应用程序中实现它(不过不介意包装WinAPI调用).

PS:我不介意系统保持对Ctrl + Ald + Del组合的控制,但我想控制所有其他键和组合,包括Windows徽标和标准应用程序启动器按钮.

.net c# keyboard accessibility winforms

12
推荐指数
2
解决办法
6998
查看次数

什么是逆转后期订单?

这是维基百科中的解释:数据流分析

这是前向数据流问题的典型迭代顺序.在反向后序迭代中,在访问任何后继节点之前访问节点,除非后边缘到达后继节点.(请注意,这与预订不同.)

有人能更详细地解释一下吗?

algorithm static-analysis

11
推荐指数
1
解决办法
5512
查看次数

避免.NET代码中的ABA问题

请注意,我已经了解并了解ABA问题.这个问题是关于ABA的.NET内存模型的行为.

在他对无锁LIFO堆栈(2007年5月MSDN杂志中的CLR Inside Out专栏)的讨论中,Joe Duffy说:

"我们为每个推送产生一个对象分配,使我们不必担心所谓的ABA问题."

然后他继续简要地描述了ABA问题并提到这可能发生在本机C/C++中,因为内存分配器可以在释放后立即重用地址.

一切都很好.但是什么使.NET程序免受ABA问题的影响?他是否暗示因为节点不能立即重用(即节点超出范围和GC收集节点之间存在一些延迟),ABA问题不可能发生?如果是这样,这是一个安全的断言吗?

我将是第一个承认我不知道.NET内存分配器或垃圾收集器的所有复杂性的人,但是我的有限理解使我相信可以重用引用.如果可以重复使用引用,那么是否可能使ABA问题成为可能,如果确实不太可能的话?

.net c# concurrency

9
推荐指数
1
解决办法
862
查看次数

用于在 Python 中构建 PriorityQueue 的自定义比较器

我试图在Python中使用 PriorityQueue 构建一个优先级队列,但我希望它在将元素传递给函数后使用函数的返回值,而不是考虑进行优先级比较的元素,类似于sorted(mtlist,key = myfun),有没有办法实现这一点,

python priority-queue

9
推荐指数
2
解决办法
2万
查看次数