相关疑难解决方法(0)

是什么让Enum.HasFlag这么慢?

我正在做一些速度测试,我注意到Enum.HasFlag比使用按位操作慢大约16倍.

有谁知道Enum.HasFlag的内部以及为什么它如此之慢?我的意思是两倍慢不会太糟糕但是当它慢了16倍时它会使该功能无法使用.

如果有人想知道,这是我用来测试其速度的代码.

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;

namespace app
{
    public class Program
    {
        [Flags]
        public enum Test
        {
            Flag1 = 1,
            Flag2 = 2,
            Flag3 = 4,
            Flag4 = 8
        }
        static int num = 0;
        static Random rand;
        static void Main(string[] args)
        {
            int seed = (int)DateTime.UtcNow.Ticks;

            var st1 = new SpeedTest(delegate
            {
                Test t = Test.Flag1;
                t |= (Test)rand.Next(1, 9);
                if (t.HasFlag(Test.Flag4))
                    num++;
            });

            var st2 = new SpeedTest(delegate
            {
                Test t = …
Run Code Online (Sandbox Code Playgroud)

.net c#

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

未调用重载的扩展方法

如果我们有一个像这样的简单类:

class MyClass
{
    public void DoSomething(object anObj)
    {
        Console.WriteLine("I am an Object: {0}", anObj);
    }

    public void DoSomething(string aStr)
    {
        Console.WriteLine("I am a String: {0}", aStr);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我们这样做:

        var myClass = new MyClass();
        myClass.DoSomething("A message");
Run Code Online (Sandbox Code Playgroud)

输出是"我是一个字符串:一些文本"

好.那样就好.但是,如果我们使用扩展方法进行"类似"重载,例如:

class MyClass
{
    public void DoSomething(object anObj)
    {
        Console.WriteLine("I am an Object: {0}", anObj);
    }
}

static class MyClassExtension
{
    public static void DoSomething(this MyClass myClass, string aStr)
    {
        Console.WriteLine("I am a String: {0}", aStr);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我们执行与以前相同的代码:

        var myClass = …
Run Code Online (Sandbox Code Playgroud)

c# extension-methods

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

标签 统计

c# ×2

.net ×1

extension-methods ×1