在.NET GetHashCode方法中,很多地方都使用.NET 方法.特别是在快速查找集合中的项目或确定相等性时.是否有关于如何GetHashCode为我的自定义类实现覆盖的标准算法/最佳实践,因此我不会降低性能?
我今天碰到了这个,并且不知道为什么C#编译器没有抛出错误.
Int32 x = 1;
if (x == null)
{
Console.WriteLine("What the?");
}
Run Code Online (Sandbox Code Playgroud)
我很困惑x怎么可能是null.特别是因为这个赋值肯定会抛出编译器错误:
Int32 x = null;
Run Code Online (Sandbox Code Playgroud)
是否有可能x变为null,微软是否决定不将此检查放入编译器,还是完全错过了?
更新:在编写了这篇文章的代码后,编译器突然发出一个警告,表达式永远不会成立.现在我真的迷路了.我把对象放到一个类中,现在警告已经消失,但是留下了问题,值类型最终是否为null.
public class Test
{
public DateTime ADate = DateTime.Now;
public Test ()
{
Test test = new Test();
if (test.ADate == null)
{
Console.WriteLine("What the?");
}
}
}
Run Code Online (Sandbox Code Playgroud) 我们已经在SO中看到了很多关于c#中的类vs结构的讨论.最后得出的结论是它的堆/堆内存分配.并建议在小型数据结构中使用结构.
现在我有一种情况来决定这两种选择中的简单数据存储.在我们的应用程序中,我们有数千个类,只是作为简单的数据存储(仅暴露的公共字段),它们在不同的模块和服务之间传递.
根据我的理解,出于性能原因,我觉得最好继续使用struct而不是类.因为这些是简单的数据结构,所以只能充当数据存储.
在继续这一过程之前,我需要经历过这场斗争的人们的一些专家建议.
对于下面的代码
public struct Person
{
public int ID;
public static bool operator ==(Person a, Person b) { return a.Equals(b); }
public static bool operator !=(Person a, Person b) { return !a.Equals(b); }
}
Run Code Online (Sandbox Code Playgroud)
为什么编译器会给我这些警告?
没有定义下面的方法有什么问题?
warning CS0660: 'Person' defines operator == or operator != but
does not override Object.Equals(object o)
warning CS0661: 'Person' defines operator == or operator != but
does not override Object.GetHashCode()
Run Code Online (Sandbox Code Playgroud) 我正在考虑通过将它们包装在自定义中来使原始.NET值类型更加类型安全并且更"自我记录" struct.但是,我想知道它是否真的值得在现实世界的软件中付出努力.
(这种"努力"可以在下面看到:必须一次又一次地应用相同的代码模式.我们声明
structs,因此不能使用继承来删除代码重复;并且由于必须声明重载的运算符static,因此必须定义它们对于每种类型单独.)
拿这个(公平地说是微不足道的)例子:
struct Area
{
public static implicit operator Area(double x) { return new Area(x); }
public static implicit operator double(Area area) { return area.x; }
private Area(double x) { this.x = x; }
private readonly double x;
}
struct Length
{
public static implicit operator Length(double x) { return new Length(x); }
public static implicit operator double(Length length) { return length.x; }
private Length(double x) { this.x = x; }
private readonly …Run Code Online (Sandbox Code Playgroud) 我想使用imagefrom位图在图片框中绘制一条曲线(二极管曲线).我现在遇到一个问题,我的点数据被保存为Double,保持这种状态非常重要.
例如,我的情节中的一个点是这样的:
电压:-0.175电流:-9.930625E-06
是的,这是一个双倍!现在我怎么能有一点要做的例子:
Point[] ptarray = new Point[3];
ptarray[0] = new Point(250, 250);
Run Code Online (Sandbox Code Playgroud)
是否有一个替代Point []接受双值?我有一个500x500的图片框.有没有办法将这些值转换为仍可以节省成本的有效点?我正在使用微安培(10 ^ -6)和电压!
我创建了以下代码来验证一系列"元组"的唯一性:
struct MyTuple
{
public MyTuple(string a, string b, string c)
{
ValA = a; ValB = b; ValC = c;
}
private string ValA;
private string ValB;
private string ValC;
}
...
HashSet<MyTuple> tupleList = new HashSet<MyTuple>();
Run Code Online (Sandbox Code Playgroud)
如果我是正确的,我将不会得到两个具有相同值的元组,HashSet这要归功于我正在使用一个结构.如果没有实现类IEquatable或类似的东西我就不能有相同的行为(我没有太多挖掘如何做到这一点).
我想知道是否有一些关于我做什么的问题.性能方面,考虑到里面的字符串是引用类型,我不希望结构的使用成为问题.
编辑:我希望我的HashSet永远不会包含两个具有相同值的字符串的元组.换句话说,我希望字符串的行为类似于值类型.
我希望将一些客户数据存储在内存中,我认为最好的方法是使用一组记录.我不确定这是否是它在C#中所称的,但基本上我可以调用Customer(i).Name并将客户名称作为字符串返回.在图灵,它的完成如下:
type customers :
record
ID : string
Name, Address, Phone, Cell, Email : string
//Etc...
end record
Run Code Online (Sandbox Code Playgroud)
我已经搜索过,但我似乎无法找到C#的等价物.有人能指出我正确的方向吗?
谢谢!:)
我准备好把头撞在墙上
我有一个名为Map的类,它有一个名为tiles的字典.
class Map
{
public Dictionary<Location, Tile> tiles = new Dictionary<Location, Tile>();
public Size mapSize;
public Map(Size size)
{
this.mapSize = size;
}
//etc...
Run Code Online (Sandbox Code Playgroud)
我暂时填写这本字典来测试一些东西..
public void FillTemp(Dictionary<int, Item> itemInfo)
{
Random r = new Random();
for(int i =0; i < mapSize.Width; i++)
{
for(int j=0; j<mapSize.Height; j++)
{
Location temp = new Location(i, j, 0);
int rint = r.Next(0, (itemInfo.Count - 1));
Tile t = new Tile(new Item(rint, rint));
tiles[temp] = t;
}
}
}
Run Code Online (Sandbox Code Playgroud)
并在我的主程序代码中
Map m …Run Code Online (Sandbox Code Playgroud) c# ×8
.net ×2
equals ×2
struct ×2
algorithm ×1
class ×1
dictionary ×1
double ×1
gethashcode ×1
hashcode ×1
null ×1
point ×1
record ×1
type-safety ×1
warnings ×1