在.NET GetHashCode方法中,很多地方都使用.NET 方法.特别是在快速查找集合中的项目或确定相等性时.是否有关于如何GetHashCode为我的自定义类实现覆盖的标准算法/最佳实践,因此我不会降低性能?
这绝对是主观的,但我想尽量避免它变得有争议.我认为如果人们适当地对待它可能是一个有趣的问题.
对这个问题的想法来自评论跟帖从我的回答到:"你恨你喜欢的语言什么的五件事?" 问题.我争辩说C#中的类应该默认密封 - 我不会把我的推理放在这个问题上,但我可以写一个更全面的解释作为这个问题的答案.我对评论中讨论的热度感到惊讶(目前有25条评论).
那么,你持有什么有争议的意见?我宁愿避免那种以相对较少的基础(例如括号放置)而变得非常宗教的东西,但是例子可能包括诸如"单元测试实际上并不十分有用"或"公共领域真的很好"之类的东西.重要的是(对我来说,无论如何)是你有理由支持你的意见.
请提出您的意见和推理 - 我鼓励人们投票支持有争议和有趣的意见,无论您是否恰好同意这些意见.
在ASP.NET C#中我有一个结构:
public struct Data
{
public int item1;
public int item2;
public int category_id;
public string category_name;
}
Run Code Online (Sandbox Code Playgroud)
我有一份清单.我要选择category_id和category_name,运行的DISTINCT最后一个ORDERBY上category_name.
这就是我现在拥有的:
List<Data> listObject = getData();
string[] catNames = listObject
.Select(i=> i.category_name)
.Distinct()
.OrderByDescending(s => s)
.ToArray();
Run Code Online (Sandbox Code Playgroud)
这显然只是获得了类别名称.我的问题是,我如何获得多个字段,以及将其存储在(不是a string[])中的数据结构?
编辑
使用结构列表并不是一成不变的.如果建议更改我的支持数据结构以使选择更容易(我将写很多这些),那么我很乐意接受建议.
我即将在代码中创建100,000个对象.它们很小,只有2或3个属性.我将它们放在一个通用列表中,当它们存在时,我将循环它们并检查值a并可能更新值b.
将这些对象创建为类还是结构更快/更好?
编辑
一个.属性是值类型(我认为字符串除外?)
湾 他们可能(我们还不确定)有一个验证方法
编辑2
我想知道:堆上的对象和堆栈是否由垃圾收集器同等处理,或者它的工作方式有何不同?
我只是想知道为什么结构,字符串等是不可变的?是什么原因使它们成为不可变的,其余的对象是可变的.有什么东西被认为是使对象不可变的?
对可变和不可变对象分配和释放内存的方式有什么不同吗?
我应该在我的任意结构中实现什么成员才能使以下任务成为可能:
public struct MyStruct {
String s;
Int length;
}
MyStruct myStruct = new MyStruct { s = "Hello", length = 5 };
// Now, I want the following code to set the 's' to "Lol" and the
// length to 3 (length of "Lol"). The second part should be done
// automatically.
myStruct = "Lol"; // Or myStruct = String("Lol");
Run Code Online (Sandbox Code Playgroud)
该怎么做?
我已经在(其中包括)这个问题中看到人们想知道如何初始化KeyValuePair的实例,预计应该看起来像这样.
KeyValuePair<int, int> keyValuePair = new KeyValuePair<int, int>
{
Key = 1,
Value = 2
};
Run Code Online (Sandbox Code Playgroud)
它不起作用,好像属性不存在.Intead,我需要像这样使用构造函数.
KeyValuePair<int, int> keyValuePair = new KeyValuePair<int, int>(1, 2);
Run Code Online (Sandbox Code Playgroud)
不可否认,语法较短,但我不能使用初始化程序.我究竟做错了什么?
我经常读到structs应该是不可变的 - 根据定义它们不是吗?
你认为int是不可改变的吗?
int i = 0;
i = i + 123;
Run Code Online (Sandbox Code Playgroud)
似乎没关系 - 我们得到一个新的int并将其分配给i.那这个呢?
i++;
Run Code Online (Sandbox Code Playgroud)
好的,我们可以把它想象成一条捷径.
i = i + 1;
Run Code Online (Sandbox Code Playgroud)
怎么样struct Point?
Point p = new Point(1, 2);
p.Offset(3, 4);
Run Code Online (Sandbox Code Playgroud)
这真的改变了这一点(1, 2)吗?我们难道不应该将它视为Point.Offset()返回新点的下列捷径吗?
p = p.Offset(3, 4);
Run Code Online (Sandbox Code Playgroud)
这种想法的背景是这样的 - 没有身份的价值类型怎么可能是可变的?您必须至少查看两次以确定它是否发生了变化.但是如果没有身份,你怎么能这样做呢?
我不想通过考虑ref参数和拳击来使这个推理复杂化.我也知道,p = p.Offset(3, 4);表达不变性比做得好p.Offset(3, 4);.但问题仍然存在 - 根据定义,值不是不可变的值吗?
UPDATE
我认为至少涉及两个概念 - 变量或字段的可变性以及变量值的可变性.
public class Foo
{
private Point point; …Run Code Online (Sandbox Code Playgroud) 我正在使用地理编码API,需要将返回点的坐标表示为纬度/经度对.但是,我不确定是否为此使用结构或类.我最初的想法是使用一个结构,但它们似乎在C#中通常不赞成(例如,Jon Skeet 在这个答案中提到"我几乎从不定义自定义结构").性能和内存使用不是应用程序中的关键因素.
到目前为止,我已经基于一个简单的接口提出了这两个实现:
接口
public interface ILatLng
{
double Lat { get; }
double Lng { get; }
}
Run Code Online (Sandbox Code Playgroud)
LatLng类实现
public class CLatLng : ILatLng
{
public double Lat { get; private set; }
public double Lng { get; private set; }
public CLatLng(double lat, double lng)
{
this.Lat = lat;
this.Lng = lng;
}
public override string ToString()
{
return String.Format("{0},{1}", this.Lat, this.Lng);
}
public override bool Equals(Object obj)
{
if (obj == null)
return …Run Code Online (Sandbox Code Playgroud) 与C++不同,在C#中,您不能重载赋值运算符.
我正在为具有非常大数字的算术运算做一个自定义Number类,我希望它具有内置数值类型的外观,如int,decimal等.我已经重载了算术运算符,但是任务仍然是......
这是一个例子:
Number a = new Number(55);
Number b = a; //I want to copy the value, not the reference
Run Code Online (Sandbox Code Playgroud)
该问题是否有解决方法?
c# ×8
.net ×4
struct ×3
immutability ×2
algorithm ×1
geocoding ×1
gethashcode ×1
hashcode ×1
linq ×1
value-type ×1