相关疑难解决方法(0)

如何在没有无限递归的'=='运算符重载中检查空值?

以下将导致==运算符重载方法的无限递归

    Foo foo1 = null;
    Foo foo2 = new Foo();
    Assert.IsFalse(foo1 == foo2);

    public static bool operator ==(Foo foo1, Foo foo2) {
        if (foo1 == null) return foo2 == null;
        return foo1.Equals(foo2);
    }
Run Code Online (Sandbox Code Playgroud)

我如何检查空值?

.net c# operator-overloading

110
推荐指数
4
解决办法
6846
查看次数

如何在Visual C++中编译切换以及如何优化和快速?

当我发现我只能在C++的switch语句中使用数值时,我认为那里必须有一些更深的区别if-else.

所以我问自己:

  • (如何)在运行时速度,编译时优化和常规编译方面switch有所不同if-elseif-elseif?我这里主要谈的是MSVC.

c++ if-statement switch-statement visual-c++ visual-c++-2010

29
推荐指数
2
解决办法
9782
查看次数

函数指针强制指令管道清除吗?

现代CPU具有广泛的流水线操作,也就是说,它们在实际执行指令之前很久就会加载必要的指令和数据.

有时,加载到管道中的数据会失效,必须清除管道并重新加载新数据.重新填充管道所需的时间可能相当长,并导致性能下降.

如果我在C中调用一个函数指针,那么管道是否足够智能以实现管道中的指针是一个函数指针,并且它应该跟随该指针用于下一个指令?或者是否有一个函数指针导致管道清除并降低性能?

我在C中工作,但我想这在C++中更为重要,因为许多函数调用都是通过v-tables进行的.


编辑

@JensGustedt写道:

要成为函数调用的真正性能,您调用的函数必须非常简短.如果您通过测量代码来观察这一点,那么您最终应该重新审视您的设计以允许内联调用

不幸的是,这可能是我陷入的陷阱.

出于性能原因,我编写了小而快的目标函数.

但是它被函数指针引用,因此它可以很容易地被其他函数替换(只需使指针引用一个不同的函数!).因为我通过函数指针引用它,所以我认为它不能内联.

所以,我有一个非常简短,没有内联的功能.

c performance x86 pipeline function-pointers

23
推荐指数
2
解决办法
3249
查看次数

为什么不把一切都变成"虚拟"?

可能重复:
为什么C#默认将方法实现为非虚方式?

我主要讲的是C#,.NET 3.5,但总体上想知道不考虑所有"虚拟"的好处是什么 - 也就是说在子类实例中调用的方法总是执行最多的子版本那种方法.在C#中,如果父方法未使用"虚拟"修饰符标记,则情况并非如此.例:

public class Parent
{
    public void NonVirtual() { Console.WriteLine("Non-Virtual Parent"); }
    public virtual void Virtual(){ Console.WriteLine("Virtual Parent"); }
}

public class Child : Parent
{
    public new void NonVirtual() { Console.WriteLine("Non-Virtual Child"); }
    public override void Virtual() { Console.WriteLine("Virtual Child"); }
}

public class Program
{
    public static void Main(string[] args)
    {
        Child child = new Child();
        Parent parent = new Child();
        var anon = new Child();

        child.NonVirtual();           // => Child
        parent.NonVirtual();          // => …
Run Code Online (Sandbox Code Playgroud)

.net c# virtual overriding

18
推荐指数
2
解决办法
9633
查看次数

接受float []和double []数组的方法

我有一个方法接受一个数组(浮点数或双精度数),开始和结束索引,然后对startIndex到endIndex范围内的索引进行一些元素操作.

基本上它看起来像这样:

public void Update(float[] arr, int startIndex, int endIndex)
{
   if (condition1)
   {
     //Do some array manipulation
   }
   else if (condition2)
   {
     //Do some array manipulation
   }
   else if (condition3)
   {
       if (subcondition1)
       {
         //Do some array manipulation
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

方法比这长,并涉及将一些元素设置为0或1,或者规范化数组.问题是我需要在那里传递两个float[]double[]数组,并且不希望有一个重复的代码接受double[].

性能也很关键,因此我不想创建一个新double[]数组,向其投射浮点数组,执行计算,然后通过强制转换为浮点数来更新原始数组.

是否有任何解决方案可以避免重复的代码,但也尽可能快?

c# arrays

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

EF 6数据库首先使所有属性在生成的实体类中虚拟化

我有一个db第一个edmx模型.它生成的部分类具有非虚拟简单属性.例如

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

    public partial class Entity
    {
     public int Id {get;set;} //not virtual
     public string SomeOtherProperty {get;set;} //also not virtual
     public virtual ICollection<RelatedEntity> RelatedCollection {get;set;} //but 'navigational' properties are virtual.
    }
Run Code Online (Sandbox Code Playgroud)

如何告诉设计师将所有属性虚拟化?

c# virtual entity-framework properties

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