小编Bri*_*sen的帖子

.NET C#switch语句字符串比较与枚举比较

我对样式和性能方面的考虑都很感兴趣.我的选择是执行以下任一操作(抱歉格式不佳,但此网站的界面不是WYSIWYG):

一:

string value = "ALPHA";

switch ( value.ToUpper() )
{
   case "ALPHA":
     // do somthing
     break;
   case "BETA":
     // do something else
     break;
   default:
     break;
}
Run Code Online (Sandbox Code Playgroud)

二:

public enum GreekLetters
{
    UNKNOWN= 0,
    ALPHA= 1,
    BETA = 2,
    etc...

}

string value = "Alpha";
GreekLetters letter = (GreekLetters)Enum.Parse( typeof( GreekLetters ), value.ToUpper() );

switch( letter )
{
   case GreekLetters.ALPHA:
      // do something
      break;
   case GreekLetters.BETA:
      // do something else
      break;
   default:
      break;
}
Run Code Online (Sandbox Code Playgroud)

就个人而言,我更喜欢下面的选项TWO,但除了基本的风格原因之外我没有任何其他真正的理由.但是,我甚至不确定是否存在风格原因.感谢您的输入.

c# performance

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

如何在类型属性上限制NDepend方法查询

我试图让NDepend使用标准的"方法太大"查询的修改版本来识别长方法.

我不想报告开发人员几乎无法控制的长方法,所以我使用DebuggerNonUserCode属性过滤掉生成的代码InitializeComponent().

不幸的是,我仍然得到一些误报,因为报告了生成类型中的方法.问题是虽然类型本身具有DebuggerNonUserCode属性,但方法没有,因此尽管它们是生成的,但它们仍包含在输出中.

我正在寻找类似于类型和方法之间的连接:给我所有没有DebuggerNonUserCode属性的类型并对其运行查询,但我无法弄清楚如何在CQL中表达这一点.

对于某些程序集,我可以简单地过滤全名,但不幸的是我们的一些程序集混合了开发人员制作和生成的类型.不幸的IsGeneratedByCompiler是,在这种情况下也不能使用.

我的查询

WARN IF Count > 0 IN SELECT METHODS WHERE 
   NbLinesOfCode > 30 AND
   !HasAttribute "System.Diagnostics.DebuggerNonUserCodeAttribute" AND
   !NameIs "InitializeComponent()"
   ORDER BY NbLinesOfCode DESC
Run Code Online (Sandbox Code Playgroud)

c# ndepend cql cqlinq

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

ExceptionValidationRule不会对异常做出反应

我的ExceptionValidationRuleTextBox上有一个:

<Window.Resources>
    <Style x:Key="textStyleTextBox" TargetType="TextBox">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="true">
                <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" />
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

<TextBox x:Name="myTextBox"
    {Binding Path=MyProperty, ValidatesOnExceptions=True}"
    Style="{StaticResource ResourceKey=textStyleTextBox}" />
Run Code Online (Sandbox Code Playgroud)

MyProperty看起来像这样:

private int myProperty;

public int MyProperty
{
    get { return myProperty; }
    set
    {
        if(value > 10)
            throw new ArgumentException("LOL that's an error");
        myProperty = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

DEBUG模式下,应用程序崩溃时出现未处理的异常"LOL that's an error"(WPF绑定引擎没有抓住这个,我认为它应该......).

RELEASE模式中,一切正常.

有人能告诉我,为什么会发生这种情况?我该如何解决这个问题?

debugging validation wpf exception

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

什么是数组的浅层副本

当您调用ArrayList的clone()方法时,将创建列表的浅表副本.什么是数组的浅层副本?

.net c#

7
推荐指数
2
解决办法
3735
查看次数

用于C#和CLSCompliant属性的ANTLR

我正在使用ANTLR V3为DSL语言生成C#代码.

生成的代码在laxer和parser类上都包含属性CLSCompliant,这会导致生成警告,因为我的项目不符合CLS.

  1. 如何在没有CLSCompliant属性的情况下使ANTLR生成代码?
  2. 是否可以更改C#3语法的字符串模板?

cls-compliant antlr3

7
推荐指数
2
解决办法
1149
查看次数

Windows上的Perl,文件关联和I/O重定向

有人能解释通过文件关联调用perl脚本与通过显式调用相同脚本之间的区别perl.exe吗?

显然,当通过文件关联调用脚本时,I/O重定向不能很好地工作,我真的很想知道原因.

例如,在Windows上查看PerlActivestate FAQ.cat file只要脚本没有通过重定向接收输入,该示例就可以正常工作.所以

cat file.txt
Run Code Online (Sandbox Code Playgroud)

按预期工作,但是

whoami | cat.pl
Run Code Online (Sandbox Code Playgroud)

才不是.不仅.pl需要扩展,而且显然输出whoami不会通过管道传输到脚本中.运行脚本(可以通过修改示例cat.pl脚本来验证),但由于某种原因,它不会接收whoami输入的输出.

但是,如果我像这样调用脚本:

whoami | perl cat.pl
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作.

显然,通过文件关联运行脚本和perl.exe使用脚本显式调用之间存在重要区别.

常见问题解答提到了这个问题,并指出pl2bat用于为脚本生成bat文件封面修复了问题,但我不明白为什么这是必要的.

请赐教.

windows perl redirect file-association

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

NOP在F#代码的发布版本中

我在VS2010 beta2中玩F#,因为我是F#的新手,所以我选择了一个常见的例子并继续实现了一个阶乘函数:

let rec factorial n =
  if n <= 1 then 1 else n * factorial (n - 1);;
Run Code Online (Sandbox Code Playgroud)

如果我构建它并查看Reflector中生成的代码,我会得到相应的C#代码:

public static int Factorial(int n) {
   if (n <= 1) 
      return 1;

      return n * Factorial(n - 1);
}
Run Code Online (Sandbox Code Playgroud)

因此,如果我编译Reflector的F#代码的C#表示,我希望得到相同的IL.

但是,如果我在发布模式下编译这两个片段并比较生成的IL,它们是不同的(它们在功能上是相同的,但仍然有所不同).

C#实现编译为:

.method public hidebysig static int32 Factorial(int32 n) cil managed
{
   .maxstack 8
   L_0000: ldarg.0 
   L_0001: ldc.i4.1 
   L_0002: bgt.s L_0006
   L_0004: ldc.i4.1 
   L_0005: ret 
   L_0006: ldarg.0 
   L_0007: ldarg.0 
   L_0008: ldc.i4.1 
   L_0009: sub 
   L_000a: call int32 TestApp.Program::Factorial(int32)
   L_000f: mul …
Run Code Online (Sandbox Code Playgroud)

f# cil visual-studio-2010-beta-2

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

PowerShell中的.NET类文档?

有没有一种方便的方法来从PowerShel中访问.NET类文档(即MSDN文档),类似于UNIX shell中的"man 3"?

.net powershell

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

将坐标转换卸载到GPU

我有一个使用WinForms的遗留地图查看器应用程序.它是sloooooow.(速度过去是可以接受的,但谷歌地图,谷歌地球出现了,用户被宠坏了.现在我被允许更快:)

在完成所有明显的速度改进(缓存,并行执行,不绘制不需要绘制的内容等)之后,我的探查器向我显示真正的窒息点是将点从地图空间转换为屏幕空间时的坐标转换.通常,转换代码如下所示:

    public Point MapToScreen(PointF input)
    {
        // Note that North is negative!
        var result = new Point(
           (int)((input.X - this.currentView.X) * this.Scale),
           (int)((input.Y - this.currentView.Y) * this.Scale));
        return result;
    }
Run Code Online (Sandbox Code Playgroud)

真正的实现比较棘手.纬度/长度表示为整数.为了避免失去精确度,它们乘以2 ^ 20(~1百万).这是一个坐标的表示方式.

public struct Position
{
    public const int PrecisionCompensationPower = 20;
    public const int PrecisionCompensationScale = 1048576; // 2^20
    public readonly int LatitudeInt; // North is negative!
    public readonly int LongitudeInt;
}
Run Code Online (Sandbox Code Playgroud)

重要的是,可能的比例因子也明确地绑定到2的幂.这允许我们用比特移位替换乘法.所以真正的算法看起来像这样:

    public Point MapToScreen(Position input)
    {
        Point result = new …
Run Code Online (Sandbox Code Playgroud)

c# gpu gpgpu opencl coordinate-transformation

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

如何在Vim中"扩展"文本,成为一种不错的阅读方式?

我使用嵌套数据结构工作很多,很多时候我必须从控制台手动分析它们.问题是它们全部印在一行上.

是否有一种简单的方法可以重新构建基于{,[,],}逗号的数据结构的显示,使其看起来像Ruby的pretty_print输出?

ruby vim text

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