Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 防止拳击。@Lee-no-这是一个竞争的例子。没有实现GetHashCode和等于。这是一个很好的解决方法,我没有尝试。这是你的实际代码吗?因为long?已经是一个“可为null的长包装器”(它的实际类型是nullable),所以不需要为它创建结构it@B_C#_.net_Performance_Struct - Fatal编程技术网

C# 防止拳击。@Lee-no-这是一个竞争的例子。没有实现GetHashCode和等于。这是一个很好的解决方法,我没有尝试。这是你的实际代码吗?因为long?已经是一个“可为null的长包装器”(它的实际类型是nullable),所以不需要为它创建结构it@B

C# 防止拳击。@Lee-no-这是一个竞争的例子。没有实现GetHashCode和等于。这是一个很好的解决方法,我没有尝试。这是你的实际代码吗?因为long?已经是一个“可为null的长包装器”(它的实际类型是nullable),所以不需要为它创建结构it@B,c#,.net,performance,struct,C#,.net,Performance,Struct,防止拳击。@Lee-no-这是一个竞争的例子。没有实现GetHashCode和等于。这是一个很好的解决方法,我没有尝试。这是你的实际代码吗?因为long?已经是一个“可为null的长包装器”(它的实际类型是nullable),所以不需要为它创建结构it@BlueRaja-不,这是一个说明问题的最小示例。我的真实结构中有两个long?s。这类似于外部联接的结果,其中左侧或右侧可能是null。我信任他们。谢谢为什么你认为他们会有相同的散列码?它们应该基于基础long的值。大致说“不要使用ValueT


防止拳击。@Lee-no-这是一个竞争的例子。没有实现
GetHashCode
等于
。这是一个很好的解决方法,我没有尝试。这是你的实际代码吗?因为
long?
已经是一个“可为null的长包装器”(它的实际类型是
nullable
),所以不需要为它创建结构it@BlueRaja-不,这是一个说明问题的最小示例。我的真实结构中有两个
long?
s。这类似于外部联接的结果,其中左侧或右侧可能是
null
。我信任他们。谢谢为什么你认为他们会有相同的散列码?它们应该基于基础
long
的值。大致说“不要使用ValueType的默认GetHashCode”在这种特殊情况下,它可能与唯一要装箱的字段有关。另外,任何
struct
中第一个字段为
null
类型的都会返回相同的hashcode。可能与此有关,尽管Hans的回答没有提到Nullable。@MatthewWatson:但是
Nullable
不是引用类型,它应该是一个,不是吗?你说的“内部布尔值”是什么意思?对不起,我是说“private”嗯,但是bool只有一个字节,但它可能在某处使用了地址。如果不指定对齐方式,则为4字节。机器字。此std实现用于性能目的。
public struct NullableLongWrapper
{
    private readonly long? _value;

    public NullableLongWrapper(long? value)
    {
        _value = value;
    }
}
using System.Collections.Generic;
using System.Linq;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Jobs;
using BenchmarkDotNet.Running;

public class Program
{
    static void Main()
    {
        BenchmarkRunner.Run<HashSets>();
    }
}

public class Config : ManualConfig
{
    public Config()
    {
        Add(Job.Dry.WithWarmupCount(1).WithLaunchCount(3).WithTargetCount(20));
    }
}

public struct NullableLongWrapper
{
    private readonly long? _value;

    public NullableLongWrapper(long? value)
    {
        _value = value;
    }

    public long? Value => _value;
}

public struct LongWrapper
{
    private readonly long _value;

    public LongWrapper(long value)
    {
        _value = value;
    }

    public long Value => _value;
}

[Config(typeof (Config))]
public class HashSets
{
    private const int ListSize = 1000;

    private readonly List<long?> _nullables;
    private readonly List<long> _longs;
    private readonly List<NullableLongWrapper> _nullableWrappers;
    private readonly List<LongWrapper> _wrappers;

    public HashSets()
    {
        _nullables = Enumerable.Range(1, ListSize).Select(i => (long?) i).ToList();
        _longs = Enumerable.Range(1, ListSize).Select(i => (long) i).ToList();
        _nullableWrappers = Enumerable.Range(1, ListSize).Select(i => new NullableLongWrapper(i)).ToList();
        _wrappers = Enumerable.Range(1, ListSize).Select(i => new LongWrapper(i)).ToList();
    }

    [Benchmark]
    public void Longs() => new HashSet<long>(_longs);

    [Benchmark]
    public void NullableLongs() => new HashSet<long?>(_nullables);

    [Benchmark(Baseline = true)]
    public void Wrappers() => new HashSet<LongWrapper>(_wrappers);

    [Benchmark]
    public void NullableWrappers() => new HashSet<NullableLongWrapper>(_nullableWrappers);
}
Method | Median | Scaled ----------------- |---------------- |--------- Longs | 22.8682 us | 0.42 NullableLongs | 39.0337 us | 0.62 Wrappers | 62.8877 us | 1.00 NullableWrappers | 231,993.7278 us | 3,540.34
public struct NullableLongWrapper
{
    private readonly long? _value;

    public NullableLongWrapper(long? value)
    {
        _value = value;
    }

    public override int GetHashCode()
    {
        return _value.GetHashCode();
    }

    public long? Value => _value;
}
using System;

public class Program
{
    static void Main()
    {
        var a = new Test {A = 0, B = 0};
        var b = new Test {A = 1, B = 0};
        var c = new Test {A = 0, B = 1};
        var d = new Test {A = 0, B = 2};
        var e = new Test {A = 0, B = 3};

        Console.WriteLine(a.GetHashCode());
        Console.WriteLine(b.GetHashCode());
        Console.WriteLine(c.GetHashCode());
        Console.WriteLine(d.GetHashCode());
        Console.WriteLine(e.GetHashCode());
    }
}

public struct Test
{
    public int A;
    public int B;
}

Output:

346948956
346948957
346948957
346948958
346948959
using System;

public class Program
{
    static void Main()
    {
        var a = new Test {A = false, B = 0};
        var b = new Test {A = true,  B = 0};
        var c = new Test {A = false, B = 1};
        var d = new Test {A = false, B = 2};
        var e = new Test {A = false, B = 3};

        Console.WriteLine(a.GetHashCode());
        Console.WriteLine(b.GetHashCode());
        Console.WriteLine(c.GetHashCode());
        Console.WriteLine(d.GetHashCode());
        Console.WriteLine(e.GetHashCode());
    }
}

public struct Test
{
    public bool A;
    public int  B;
}

Output

346948956
346948956
346948956
346948956
346948956