相关疑难解决方法(0)

使用C#将方法作为参数传递

我有几个方法都具有相同的签名(参数和返回值),但不同的名称和方法的内部是不同的.我想传递方法的名称以运行到另一个将调用传入方法的方法.

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代码,因为我需要定义参数.

.net c# methods delegates

646
推荐指数
7
解决办法
61万
查看次数

Action/Func vs Methods,有什么意义?

我知道如何使用ActionFunc在.NET中,但每次我开始,使用我调用的常规旧方法可以实现完全相同的解决方案.

这排除了当一个Action或者Func被用作我无法控制的东西的参数时,比如LINQ .Where.

基本上我的问题是......为什么这些存在?他们给了我什么额外的和新的一个简单的方法不?

.net c# action function func

31
推荐指数
3
解决办法
1万
查看次数

使用委托会减慢我的.NET程序吗?

使用代表会减慢我的程序吗?

我一直在避免它们,因为我真的不知道如果它们使我的程序变慢.我知道如果我导致(catch)异常,它使用相当多的CPU功率但我不知道代理和事件以及.NET对它们做了什么.

.net delegates

15
推荐指数
4
解决办法
5285
查看次数

为什么Action/Func比.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)

任何人都可以给我具体的具体论据/例子吗?

.net c# action func

12
推荐指数
5
解决办法
7931
查看次数

通用类型传递和使用,我可以执行以下操作吗?

我试着弄清楚如何在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)

c# generics reflection interface

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

代表创建缓慢

我升级了ReSharper并看到了以前没有出现的错误.我查了一下,但没有发现它正在标记的错误或潜在问题.

**编辑**:如下所述,它实际上是'堆分配查看器'插件,而不是ReSharper本身将其标记为错误 - 尽管这不会改变问题本身.

创建慢代表:从接口'IPluginHandler'方法

这是在为事件聚合器上的事件订阅插件处理程序期间发生的.

public void Subscribe(IPluginHandler subscriber)
{
  Executing += subscriber.OnExecuting;
  // -- additional subscriptions --
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,Executing是一个事件,并且subscriber.OnExecuting是事件的适当事件处理程序.

要清楚,这是一个ReSharper'软错误',因为代码仍将按预期构建和运行.

所以我的问题是JetBrains的优秀人才对我的标志是什么,以及它的后果是什么.

谢谢

c# resharper delegates

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

锁定和管理锁定异常的解决方案有什么问题?

我的目标是在我的应用程序中使用线程安全功能和异常处理的约定.我对线程管理/多线程的概念比较陌生.我在用.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)

c# multithreading locking thread-safety .net-3.5

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

函数调用和C#中的事件之间是否存在性能差异?

我会试着澄清我的问题:

我有一个名为Draw的函数(有人(XNA)每秒调用她60次),我有很多要绘制的对象,所以我有以下代码:void Draw(){obj1.draw(); obj2.draw(); obj3.draw(); ....}

是否会产生性能影响,如果我将创建一个事件,将由Draw()引发,并且所有对象都会注册该事件?

如果我不清楚我要问的是:通过注册活动来呼叫功能是否与普通呼叫不同?

c# events delegates

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

代表对代表性能过分是一个坏主意吗?

请考虑以下代码:

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所以不要责怪我,如果有微妙的错误,它没有编译,你明白了:)

.net c# performance lambda delegates

5
推荐指数
2
解决办法
1687
查看次数

代表们如何改进应用程序的性能?

我是代表们的新概念.我已经知道它类似于C++中的指针.在其优势中,它提到了代表的有效使用提高了性能.

考虑到它是一个指针.它如何改善应用程序的性能?

如果有人能用一个简单的例子解释这一点,那将会有所帮助.

c# asp.net delegates

5
推荐指数
1
解决办法
565
查看次数

如何将 C# 对象引用传入和传出 C++

有没有办法通过本机互操作将 C# 对象引用(类类型,而不是结构)传入和传出 C++?

这是我的用例:

我正在尝试用 C# 编写游戏引擎,但想使用本机 (C++) 物理库。物理库维护它自己的所有物理身体的内部状态,并让用户将少量数据(一个指针)与每个身体相关联。在物理模拟滴答之后,库提供所有移动的物理实体的列表。我想遍历这个列表并将所有更改中继到相应的 C# 对象。

问题是:将 C# 中的对象与 C++ 中的相应物理体相关联的最佳方法是什么?

我可以想到几种方法:

  1. 给每个物理身体一个某种类型的 ID,在 C++ 中将 ID 与物理身体相关联,并在 C# 中维护一个 ID 到相应对象的映射。即使使用优化的映射机制,这对我来说似乎也是不必要的间接。
  2. 利用将 C# 委托(可以隐式引用 C# 对象实例)编组到 C++ 函数指针中的能力。这可能是最好的方法;我不知道 C# 如何实现委托以及这会带来什么类型的开销。
  3. 寻找其他方式在 C++ 中引用 C# 对象,并将该引用与每个原生物理体相关联。

有没有我不知道的选项 3 之类的机制?C++/CLI 不是一个选项,因为我想支持没有它的平台。

c# c++ pinvoke

4
推荐指数
1
解决办法
3339
查看次数

没有目标的.net委托比目标慢.net委托

当我在我的机器上以释放模式执行以下代码时,具有非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)

.net c# performance delegates

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