我必须将一个对象与同一个类的原始属性进行比较.意思是,我必须比较那些:
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)
我目前正在研究多线程c#应用程序.
在我的例子中,我有一个列表/字典,在应用程序启动时分配并填充在主线程中.该列表永远不会再次修改.我只使用列表来获取对象.
我必须使用锁吗?
lock(list) { var test = list[0]; }
Run Code Online (Sandbox Code Playgroud)
或者我可以直接访问该对象吗?
我知道,如果我访问列表中的对象,该对象必须是线程安全的.
这段代码的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()......