相关疑难解决方法(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万
查看次数

C# - 在打开上下文菜单时检测是否保持SHIFT键

在我的C#应用​​程序中,我想显示一个上下文菜单,但是如果在打开上下文菜单时按住SHIFT键,我想在菜单中添加特殊选项.

我目前正在使用GetKeyStateAPI来检查SHIFT键.它在我的计算机上工作正常,但是使用非英语Windows的用户表示它根本不起作用.

我还读到在Win32 API中打开上下文菜单时,菜单中应该显示一个标志EXTENDEDVERBS.在C#中EventArgs,Opening事件不包含(据我所知)一个属性指示EXTENDEDVERBS或是否按下任何修改键.

这是我现在在" Opening"事件中使用的代码:

// SHIFT KEY is being held down
if (Convert.ToBoolean(GetKeyState(0x10) & 0x1000))
{
     _menuStrip.Items.Add(new ToolStripSeparator());

     ToolStripMenuItem log = new ToolStripMenuItem("Enable Debug Logging");
     log.Click += new EventHandler(log_Click);
     log.Checked = Settings.Setting.EnableDebugLogging;
     _menuStrip.Items.Add(log);
 }
Run Code Online (Sandbox Code Playgroud)

如果GetKeyState是正确的方法,我的代码是否正确检测到按下了SHIFT键?

c# keyboard contextmenu

39
推荐指数
4
解决办法
6万
查看次数

在MouseDown事件处理程序中检测Ctrl + Left(鼠标按钮)

当我第一次按下控制键(左键)然后单击鼠标左键时,为什么以下代码被执行.我正在修改现有代码,下面的代码已经存在.我想以前没有人尝试过它,按下控制键,它只用于点击鼠标左键,它一直适用于那种情况.但是我想要在按下控制键的同时按下鼠标左键时执行不同的代码.

private void treeList1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
    TreeList tree = sender as TreeList;

    if (e.Button == MouseButtons.Right && ModifierKeys == Keys.None && tree.State == TreeListState.Regular)
    {
       //the code that is here gets executed 
       MessageBox.Show("I am here");
    }
}
Run Code Online (Sandbox Code Playgroud)

我非常感谢任何提示或帮助.

PS我想补充一点,在上面的情况下,当我检查e.button值时,虽然我按了鼠标左键和Ctrl键,但它显示等于Right.这对我来说是一个谜.

亲爱的StackOverflow研究员:我发现了问题,因为我在MAC上使用VM,我必须在我的虚拟机首选项上禁用一些键映射,现在我的原始代码工作.感谢你的帮助.

c# devexpress winforms

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

标签 统计

c# ×3

.net ×1

contextmenu ×1

devexpress ×1

keyboard ×1

winforms ×1