我有几个方法都具有相同的签名(参数和返回值),但不同的名称和方法的内部是不同的.我想传递方法的名称以运行到另一个将调用传入方法的方法.
public int Method1(string)
{
... do something
return myInt;
}
public int Method2(string)
{
... do something different
return myInt;
}
public bool RunTheMethod([Method Name passed in here] myMethodName)
{
... do stuff
int i = myMethodName("My String");
... do more stuff
return true;
}
public bool Test()
{
return RunTheMethod(Method1);
}
Run Code Online (Sandbox Code Playgroud)
此代码不起作用,但这是我想要做的.我不明白的是如何编写RunTheMethod代码,因为我需要定义参数.
我知道如何使用Action和Func在.NET中,但每次我开始,使用我调用的常规旧方法可以实现完全相同的解决方案.
这排除了当一个Action或者Func被用作我无法控制的东西的参数时,比如LINQ .Where.
基本上我的问题是......为什么这些存在?他们给了我什么额外的和新的一个简单的方法不?
使用代表会减慢我的程序吗?
我一直在避免它们,因为我真的不知道如果它们使我的程序变慢.我知道如果我导致(catch)异常,它使用相当多的CPU功率但我不知道代理和事件以及.NET对它们做了什么.
如果我需要快速可重复使用的代码,我更喜欢使用Action或Func,但是我团队中的其他人不喜欢它们或理解它们.
目前,我唯一真正的论点是关于偏好和更新的代码实践,但这些只是不好的论点.
为什么这样做更好:
Action<FormView,String> hideControl = (form,name) => {
var button = form.GetControl<Button>(name);
if (button != null)
button.Visible = false;
}
Run Code Online (Sandbox Code Playgroud)
比:
public static void HideControl<T>(this FormView form, string name) where T : Control
{
var button = form.GetControl<Button>(name);
if (button != null)
button.Visible = false;
}
Run Code Online (Sandbox Code Playgroud)
?
任何人都可以给我具体的具体论据/例子吗?
我试着弄清楚如何在CallMe<T>()类中访问静态方法DoSomething.反思是唯一的解决方案吗?我不想实例化一个类型的对象MyAction.另外,如果通过反射进行,有一种方法可以通过方法内的反射创建方法CallMe<T>()一次,然后多次调用它来对同一个"反射"方法执行多个操作?或者有没有比通过反思更好的方式?我基本上想要创建模板实现样式类,例如MyAction定义如何byte[] DoThis(string text)执行其职责.然后,AskForSomething()将指定正在使用的模板,并根据该模板CallMe<T>()继续其工作.
public class AskSomething
{
public void AskForSomething()
{
DoSomething doSomething = new DoSomething();
doSomething.CallMe<MyAction>();
}
}
public class DoSomething
{
public void CallMe<T>()
{
Type type = typeof(T);
//Question: How can I access 'DoThis(string text)' here?
//Most likely by reflection?
}
}
public class MyAction
{
public static byte[] DoThis(string text)
{
byte[] ret = new byte[0]; //mock just to denote …Run Code Online (Sandbox Code Playgroud) 我升级了ReSharper并看到了以前没有出现的错误.我查了一下,但没有发现它正在标记的错误或潜在问题.
**编辑**:如下所述,它实际上是'堆分配查看器'插件,而不是ReSharper本身将其标记为错误 - 尽管这不会改变问题本身.
创建慢代表:从接口'IPluginHandler'方法
这是在为事件聚合器上的事件订阅插件处理程序期间发生的.
public void Subscribe(IPluginHandler subscriber)
{
Executing += subscriber.OnExecuting;
// -- additional subscriptions --
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,Executing是一个事件,并且subscriber.OnExecuting是事件的适当事件处理程序.
要清楚,这是一个ReSharper'软错误',因为代码仍将按预期构建和运行.
所以我的问题是JetBrains的优秀人才对我的标志是什么,以及它的后果是什么.
谢谢
我的目标是在我的应用程序中使用线程安全功能和异常处理的约定.我对线程管理/多线程的概念比较陌生.我在用.NET 3.5
我写了下面的辅助方法看完这篇文章后总结我的所有锁定动作http://blogs.msdn.com/b/ericlippert/archive/2009/03/06/locks-and-exceptions-do-not-mix. aspx,它是针对这个问题而链接的,Monitor vs lock.
我的想法是,如果我在我的应用程序中一致地使用此约定,那么编写线程安全代码并在线程安全代码中处理错误将更容易,而不会破坏状态.
public static class Locking
{
private static readonly Dictionary<object,bool> CorruptionStateDictionary = new Dictionary<object, bool>();
private static readonly object CorruptionLock = new object();
public static bool TryLockedAction(object lockObject, Action action, out Exception exception)
{
if (IsCorrupt(lockObject))
{
exception = new LockingException("Cannot execute locked action on a corrupt object.");
return false;
}
exception = null;
Monitor.Enter(lockObject);
try
{
action.Invoke();
}
catch (Exception ex)
{
exception = ex;
}
finally
{ …Run Code Online (Sandbox Code Playgroud) 我会试着澄清我的问题:
我有一个名为Draw的函数(有人(XNA)每秒调用她60次),我有很多要绘制的对象,所以我有以下代码:void Draw(){obj1.draw(); obj2.draw(); obj3.draw(); ....}
是否会产生性能影响,如果我将创建一个事件,将由Draw()引发,并且所有对象都会注册该事件?
如果我不清楚我要问的是:通过注册活动来呼叫功能是否与普通呼叫不同?
请考虑以下代码:
if (IsDebuggingEnabled) {
instance.Log(GetDetailedDebugInfo());
}
Run Code Online (Sandbox Code Playgroud)
GetDetailedDebugInfo() 可能是一种昂贵的方法,所以我们只想在调试模式下运行时调用它.
现在,更清洁的替代方案是编写如下代码:
instance.Log(() => GetDetailedDebugInfo());
Run Code Online (Sandbox Code Playgroud)
其中.Log()的定义如下:
public void Log(Func<string> getMessage)
{
if (IsDebuggingEnabled)
{
LogInternal(getMessage.Invoke());
}
}
Run Code Online (Sandbox Code Playgroud)
我关心的是性能,初步测试没有显示第二种情况特别昂贵,但如果负载增加,我不想遇到任何意外.
哦,请不要建议条件编译,因为它不适用于这种情况.
(PS:我直接在StackOverflow中写了代码问一个问题textarea所以不要责怪我,如果有微妙的错误,它没有编译,你明白了:)
我是代表们的新概念.我已经知道它类似于C++中的指针.在其优势中,它提到了代表的有效使用提高了性能.
考虑到它是一个指针.它如何改善应用程序的性能?
如果有人能用一个简单的例子解释这一点,那将会有所帮助.
有没有办法通过本机互操作将 C# 对象引用(类类型,而不是结构)传入和传出 C++?
这是我的用例:
我正在尝试用 C# 编写游戏引擎,但想使用本机 (C++) 物理库。物理库维护它自己的所有物理身体的内部状态,并让用户将少量数据(一个指针)与每个身体相关联。在物理模拟滴答之后,库提供所有移动的物理实体的列表。我想遍历这个列表并将所有更改中继到相应的 C# 对象。
问题是:将 C# 中的对象与 C++ 中的相应物理体相关联的最佳方法是什么?
我可以想到几种方法:
有没有我不知道的选项 3 之类的机制?C++/CLI 不是一个选项,因为我想支持没有它的平台。
当我在我的机器上以释放模式执行以下代码时,具有非null目标的委托的执行总是比委托具有空目标时快(我希望它等效或更慢).
我真的不是在寻找微优化,但我想知道为什么会这样呢?
static void Main(string[] args)
{
// Warmup code
long durationWithTarget =
MeasureDuration(() => new DelegatePerformanceTester(withTarget: true).Run());
Console.WriteLine($"With target: {durationWithTarget}");
long durationWithoutTarget =
MeasureDuration(() => new DelegatePerformanceTester(withTarget: false).Run());
Console.WriteLine($"Without target: {durationWithoutTarget}");
}
/// <summary>
/// Measures the duration of an action.
/// </summary>
/// <param name="action">Action which duration has to be measured.</param>
/// <returns>The duration in milliseconds.</returns>
private static long MeasureDuration(Action action)
{
Stopwatch stopwatch = Stopwatch.StartNew();
action();
return stopwatch.ElapsedMilliseconds;
}
class DelegatePerformanceTester
{
public DelegatePerformanceTester(bool withTarget)
{
if …Run Code Online (Sandbox Code Playgroud)