小编Lou*_*Lou的帖子

为什么`IList <T>`不继承自`IReadOnlyList <T>`?

什么时候IReadOnlyList<T>在.NET 4.5中引入,有一段时间我认为拼图的缺失部分最终被插入到位:一种传递真正的只读索引接口的方法,以前我必须使用我自己的只读接口并创建包装器围绕一切的课程.

我期待接口被放置在"自然"层次结构中,理想情况是:

IEnumerable<T> 
.GetEnumerator()
      -> IReadOnlyCollection<T> : IEnumerable<T>
      .Count
            -> IReadOnlyList<T> : IReadOnlyCollection<T>
            .Item[...]
                     -> IList<T> : IReadOnlyList<T>
                     .Add(...)
                     .Clear()
                     .Contains(...)
                     (etc)
Run Code Online (Sandbox Code Playgroud)

但是,事实证明,IList<T>不会继承IReadOnlyList<T>.

是否有一个原因?

.net c# generics .net-4.5

28
推荐指数
1
解决办法
1832
查看次数

优雅地处理损坏的状态异常

此问题相关,我想强制CLR让我的.NET 4.5.2应用程序捕获损坏的状态异常,其唯一目的是记录它们然后终止应用程序.如果我catch (Exception ex)在应用程序周围的几个地方,这样做的正确方法是什么?

因此,在我指定<legacyCorruptedStateExceptionsPolicy>属性后,如果我理解正确,所有catch (Exception ex)处理程序将捕获异常,AccessViolationException并愉快地继续.

是的,我知道catch (Exception ex)是一个坏主意™,但如果CLR至少将正确的堆栈跟踪放入事件日志中,我将非常乐意向客户解释他的服务器应用程序在凌晨1点快速失败并且离线晚上是件好事.但不幸的是,CLR将一个不相关的异常记录到事件日志中,然后关闭该过程,以便我无法找出实际发生的情况.

问题是,如何实现这一目标,流程广泛:

if the exception thrown is a Corrupted State Exception:
    - write the message to the log file
    - end the process 
Run Code Online (Sandbox Code Playgroud)

(更新)

换句话说,这可能适用于简单应用中的大多数例外:

[HandleProcessCorruptedStateExceptions] 
[SecurityCritical]
static void Main() // main entry point
{
    try 
    {

    }
    catch (Exception ex)
    {
        // this will catch CSEs
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,它不适用于:

  • 未处理的应用程序域异常(即在非前台线程上抛出)
  • Windows服务应用程序(没有实际Main入口点)

所以这似乎<legacyCorruptedStateExceptionsPolicy>是使这项工作成功的唯一方法,在这种情况下,我不知道在记录CSE后如何失败?

.net c# access-violation fail-fast corrupted-state-exception

23
推荐指数
2
解决办法
6837
查看次数

是否有可能在Monogame/XNA中获得"上下文"手势?

我正在使用Monogame开发多点触控应用程序,其中多个用户可以同时处理具有单独文档/图像/视频的更大的多点触摸屏,我想知道是否可以使手势"具有上下文感知",即两个手指在墙壁的一侧捏住文件不应该影响某人平移墙壁的另一侧.

Monogame的工作方式是,所有输入点都转换为手势,可以使用以下方法读取:

if (TouchPanel.IsGestureAvailable)
{
     var gesture = TouchPanel.ReadGesture();
     // do stuff
}
Run Code Online (Sandbox Code Playgroud)

有没有办法让手势限制在屏幕上的某个点,或者我是否需要自己实现?例如,通过查看源代码,看起来TouchPanelState该类完成了所有工作,但不幸的是它的构造函数是internal.

c# multi-touch gesture monogame

17
推荐指数
1
解决办法
309
查看次数

Monogame使用Graphics.DrawString(而不是SpriteBatch.DrawString)渲染文本

使用Graphics.DrawString将一组(相当静态的)文本渲染到屏幕外位图,将其转换为Texture2D一次,然后简单地调用SpriteBatch.Draw,而不是使用内容管道并使用渲染文本,是否有任何缺点SpriteFont?这基本上是一页文本,绘制成"纸张",但用户也可以选择调整字体大小,这意味着我必须包含不同大小的spritefonts.

由于这是一个仅限Windows的应用程序(不打算移植它),我可以访问所有字体,例如普通的WinForms应用程序,我相信使用Graphics.DrawString(甚至TextRenderer)使用精灵字体时渲染质量会好得多.

此外,似乎性能可能更好,因为SpriteBatch.DrawString需要在每次迭代中"渲染"整个文本(即分别为每个字母发送顶点),而使用位图我只做一次,所以它应该稍微减少工作量CPU方面.

  1. 我没有看到任何问题或缺点吗?
  2. 是否可以使用spritefonts获得alpha混合文本?我已经看过周围提到的Nuclex框架,但它并没有被移植到Monogame AFAIK.

[更新]

从技术方面来看,它似乎比通过精灵字体更好地完成文本渲染.如果它们是水平渲染的,我甚至会得到ClearType.可能存在的一个问题是字体的spritesheets(可能是?)在纹理内存方面比为文本页面创建单独的纹理更有效.

drawstring monogame spritefont spritebatch

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

用于切片堆积箱的线性时间算法

我有一个问题,它有一个相当有限的时间限制,并想看看我是否可以在正确的方向上轻推.

这是问题所在:

你会看到一面墙,上面有不同高度的柱子.每列高度表示为非零整数.

输入状态使用H长度数组定义N,包含N屏幕上每列的高度,例如:

使用<code>S</code></strong>的长度<strong><code>M</code></strong>,包含应执行M包含每个相应切割的切割件数量的长度数组.

例如,根据上面的示例,给定输入H = {2, 1, 3, 2, 3, 1, 1, 2}并且S = { 0, 1, 2, 3 }程序应返回数量{1, 3, 3, 0}.

NM在左右的范围内20,000,但在每个阵列中的高度可达到1,000,000.

解决方案的时间和空间最坏情况复杂性都不能超过 O(N + M + max(M) + max(N)).

最后一个约束是让我感到困惑的:它基本上意味着我不能拥有任何嵌套的for-loops,而我似乎无法逃脱这一点.

显然,有一些聪明的预处理需要在O(1)每个切片中产生最终结果,但我无法想出它.

我继续为每个切片级别创建一个切割数字数组,然后在迭代时更新所有切割数字H,但事实证明O(N*M),因为我需要更新所有较低的高度级别.

是否有适合此任务的数据结构?

algorithm

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

解决"减少弦乐"的挑战

我已经看到各种讨论和代码尝试解决来自interviewstreet.com 的"字符串缩减"问题,但他们都没有通过动态编程来解决它.

动态编程部分列出,问题描述如下:

给定由a,b和c组成的字符串,我们可以执行以下操作:获取任意两个相邻的不同字符,并将其替换为第三个字符.例如,如果'a'和'c'相邻,则可以用'b'代替.

重复应用此操作可以产生的最小字符串是多少?

可以使用详尽的强力搜索来解决问题,有效地创建所有可能替换的树:

// this is more or less pseudo code from my head
int GetMinLength(string s)
{
    // solve edge cases
    if (s.Length == 1) return 1;
    if (s.Length == 2) return ReduceIfPossible(s);

    // recursive brute force
    int min = s.Length;
    for (int i = 0; i<s.Length-1; i++)
    {
        if (s[i] != s[i+1])
        {
            var next = GetMinLength(
                  s.Substring(0, i) + 
                  Reduce(s[i], s[i + 1]) +
                  s.Substring(i + 2)
                  );

            if …
Run Code Online (Sandbox Code Playgroud)

algorithm dynamic-programming

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

ARM Cortex M7 什么时候真正需要 CLREX?

我在网上找到了几个地方,其中指出每当进入中断例程时“必须”调用 CLREX,我不明白。CLREX状态的文档(添加编号以便于参考):

(1) 清除执行处理器的本地记录,该记录表明地址已请求独占访问。

(2) 使用该CLREX指令将一个紧密耦合的独占访问监视器返回到其开放访问状态。这消除了对内存的虚拟存储的要求。

(3) 是否CLREX也清除执行处理器的全局记录,即某个地址已请求独占访问,则由实现定义。

我在这里几乎什么都不懂。

我的印象是,按照文档中示例编写一些内容足以保证原子性:

    MOV r1, #0x1                ; load the ‘lock taken’ value
try:                                                       <---\
    LDREX r0, [LockAddr]        ; load the lock value          |
    CMP r0, #0                  ; is the lock free?            |
    STREXEQ r0, r1, [LockAddr]  ; try and claim the lock       |
    CMPEQ r0, #0                ; did this succeed?            |
    BNE try                     ; no - try again   ------------/
    ....                        ; yes - …
Run Code Online (Sandbox Code Playgroud)

arm atomic cortex-m load-link-store-conditional

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

Visual Studio Web分析仅显示iexplore

当我在Visual Studio中为Web应用程序运行Visual Studio 2012探查器(Perfomance Analyzer)时,它会启动Internet Explorer并在关闭IE窗口时结束分析.

但是在分析之后,结果只显示iexplore.exe过程及其内部调用,而没有指示我的程序集的执行情况.

如何配置分析仪来分析我的代码?对于桌面应用程序,它可以正常工作.

performance profiler vs-web-application-project visual-studio-2012

8
推荐指数
1
解决办法
376
查看次数

缓存时间序列的差异聚合

是否有可能预先计算(缓存)两个信号差异的值的聚合(最小值/最大值/平均值)?

我有几个通道(例如50个),每秒进行一次或多次测量,我可以轻松存储预先计算的1分钟或15分钟聚合,以便更快地显示.

但其中一个要求是显示相对值的图表.例如,如果我有频道C1,C2并且C3用户希望在单独的图表上查看平均值C1和平均值(C2 - C3)(或最小值/最大值15分钟).

例如,假设我有这两个频道(还有48个频道):

t(min)    0    +1   +2   +3   +4   +5   +6   +7   +8   +9   +10
C1       0.0  0.1  0.2 -0.1  0.0  0.1  0.3  0.5  0.7  0.9  0.2
C2       0.1  0.4  0.2  0.1 -0.1  0.5  0.6  0.1  0.2  0.3  0.0
Run Code Online (Sandbox Code Playgroud)

我可以预先计算并存储5分钟的聚合:

t(min)    0 to +4    +5 to +10
C1_min     -0.1         0.1
C1_max      0.2         0.9
C2_min     -0.1         0.0
C2_max      0.4         0.6
Run Code Online (Sandbox Code Playgroud)

并且很容易从中获得10分钟或15分钟的聚合.

但是,如果用户想要查看min(C2-C1)max(C2-C1)5分钟聚合,对于这50个频道的任何组合,似乎我无法重复使用此信息. …

language-agnostic algorithm caching aggregate

7
推荐指数
1
解决办法
161
查看次数

Xamarin垃圾收集器和循环引用

"性能"部分阅读Xamarin文档时,我注意到以下章节:

下图说明了强引用可能出现的问题:

循环参考

对象A具有对对象B的强引用,对象B具有对对象A 的强引用.由于存在圆形强引用,这些对象被称为不朽对象.这种父子关系并不罕见,因此,即使对象不再被应用程序使用,垃圾收集器也不能回收任何对象.

这是我第一次在C#/ .NET/Mono语境中听说过"不朽的对象".

然后页面继续建议使用WeakReference其中一个对象,这将删除强循环引用并修复此"问题".

与此同时,Xamarin关于垃圾收集的文档声称:

Xamarin.Android使用Mono的Simple Generational垃圾收集器.这是一个标记和清除垃圾收集器[...]

标记和扫描GC不受循环引用的影响吗?

mono garbage-collection weak-references circular-reference xamarin

6
推荐指数
1
解决办法
682
查看次数