我在.NET中发现了这种奇怪的行为,甚至在通过C#再次查看CLR之后我仍然感到困惑.让我们假设我们有一个接口,一个方法和一个实现它的类:
interface IFoo
{
void Do();
}
class TheFoo : IFoo
{
public void Do()
{
//do nothing
}
}
Run Code Online (Sandbox Code Playgroud)
然后我们只想实例化这个类并以两种方式多次调用这个Do()方法:使用具体的类变量和使用接口变量:
TheFoo foo1 = new TheFoo();
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (long i = 0; i < 1000000000; i++)
foo1.Do();
stopwatch.Stop();
Console.Out.WriteLine("Elapsed time: " + stopwatch.ElapsedMilliseconds);
IFoo foo2 = foo1;
stopwatch = new Stopwatch();
stopwatch.Start();
for (long i = 0; i < 1000000000; i++)
foo2.Do();
stopwatch.Stop();
Console.Out.WriteLine("Elapsed time: " + stopwatch.ElapsedMilliseconds);
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是(至少对我而言)经过的时间差异大约为10%:
Elapsed time: …Run Code Online (Sandbox Code Playgroud) 我正在创建一个Visual Studio包(这是我的第一次),我的最终目标是为解决方案资源管理器创建一个仅适用于某些文件类型的上下文菜单项.(我认为这将是一个常见的事情,但没有找到任何体面的教程,所以如果你知道任何请告诉我)
我按照一个简单的MSDN指南首先在工具栏中创建一个项目(我忘记链接它的位置),这很好.
然后我找到了将其移动到Solution Explorer上下文菜单的方法.这是通过操作.vsct文件并具有如下元素来实现的:
<Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_ITEMNODE"/>
Run Code Online (Sandbox Code Playgroud)
这可能没关系,但我试图设置场景.
现在,因为我只想显示某些文件类型的项目,所以我需要找到一种方法来在按下右键单击按钮时检查文件.缩短搜索时间,我找到了这个并最终得到以下代码:
protected override void Initialize()
{
//stuff
OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
menuItem.BeforeQueryStatus += menuItem_BeforeQueryStatus;
//more stuff
}
void menuItem_BeforeQueryStatus(object sender, EventArgs e)
{
var myCommand = sender as OleMenuCommand;
myCommand.Text = "NEW NAME";
}
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我只是试图设置文本来尝试并证明它有效,我知道有一个Visible属性,但我希望这一步先工作.该BeforeQueryStatus事件被触发,并且调试显示代码按预期执行.但是,上下文菜单项没有变化,它保留原始文本.
我在这里错过了什么?为什么不更新?