小编mic*_*idk的帖子

通过Equals或HashCode进行比较.哪个更快?

我必须将一个对象与同一个类的原始属性进行比较.意思是,我必须比较那些:

struct Identifier
{
    string name;
    string email;
}
Run Code Online (Sandbox Code Playgroud)

用两个字符串名称和电子邮件.我知道我可以为名称和电子邮件创建一个新的Identifier实例,并将其传递给equals().我的应用程序必须非常快速且节省资源.

我知道通过哈希码进行比较不是一个好方法,因为这里解释的是冲突.但碰撞对我来说没问题,我只需要快速.

所以,

1)通过GetHashCode进行比较(检查两个对象的哈希码是否相同)比Equals()更快?

2)我是否应该为比较创建两个值的标识符的新实例,创建一个直接获取值的新方法?例如

struct Identifier {
  string name;
  string email;

  bool Equals(string name, string email) {
      // todo comparison via hashcode or equals
  }
}
Run Code Online (Sandbox Code Playgroud)

我会使用resharper生成的Equals()和GetHashCode()方法.

c# comparison performance

4
推荐指数
2
解决办法
5794
查看次数

C#多线程:当只从列表/字典中获取对象时,是否必须使用锁?

我目前正在研究多线程c#应用程序.

在我的例子中,我有一个列表/字典,在应用程序启动时分配并填充在主线程中.该列表永远不会再次修改.我只使用列表来获取对象.

我必须使用锁吗?

lock(list) { var test = list[0]; }
Run Code Online (Sandbox Code Playgroud)

或者我可以直接访问该对象吗?

我知道,如果我访问列表中的对象,该对象必须是线程安全的.

c# multithreading list thread-safety

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

如何优化C#编译器?

这段代码的IL代码(用https://dotnetfiddle.net生成):

public class Program
{
    public static void Main()
    {
        int i = 10;
        if (i < 4)
            Console.WriteLine("Hello World");
    }
}
Run Code Online (Sandbox Code Playgroud)

包含ldstr"Hello World".

编译器不应该知道Console.WriteLine永远不会被执行吗?

这个IL代码:

public class Program
{
    public static void Main()
    {
        if (10 < 4)
            Console.WriteLine("Hello World");
    }
}
Run Code Online (Sandbox Code Playgroud)

不包含ldstr命令.

现在我很困惑.. .NET编译器真的很蠢吗?两个示例的C#/ IL代码完全相同:没有.但是第一个例子的IL代码比另一个大.不应该是一个好的编译器只是调用构造函数而什么都不做..?

编辑:

是的我已经读过这个,但我不是在谈论其他生成的本地人.

如果i是属性或公共变量,则可以从另一个线程修改它.但i只存在于Main()......

.net c# optimization cil compiler-optimization

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