c# - 什么时候使用 C# 结构(值类型)会牺牲性能?

标签 c# performance struct non-nullable value-type

我一直在玩弄结构作为隐式验证复杂值对象的机制,以及围绕更复杂类的通用结构以确保有效值。我对性能后果有点无知,所以我希望大家能帮助我。例如,如果我要执行类似将域对象注入(inject)值类型包装器之类的操作,这会导致问题吗?为什么?我理解值类型和引用类型之间的区别,我的目标是利用值类型的不同行为。为了负责任地做到这一点,我到底需要研究什么?

这是我正在考虑的事情的一个非常基本的想法。

public struct NeverNull<T>
    where T: class, new()
{

    private NeverNull(T reference)
    {
        _reference = reference;
    }

    private T _reference;

    public T Reference
    {
        get
        {
            if(_reference == null)
            {
                _reference = new T();
            }
            return _reference;
        }
        set
        {
            _reference = value;
        }
    }

    public static implicit operator NeverNull<T>(T reference)
    {
        return new NeverNull<T>(reference);
    }

    public static implicit operator T(NeverNull<T> value)
    {
        return value.Reference;
    }
}

最佳答案

好吧,一件令人讨厌的事情是,这并不像您天真地期望的那样:

NeverNull<Foo> wrapper1 = new NeverNull<Foo>();
NeverNull<Foo> wrapper2 = wrapper1;

Foo foo1 = wrapper1;
Foo foo2 = wrapper2;

这将创建 Foo两个实例,因为在 wrapper1 创建实例之前复制了原始版本。

基本上,您正在处理一个可变结构 - 这几乎从来没有是一件好事。此外,我通常不热衷于隐式转换。

感觉就像您要在这里实现看起来很神奇的代码……我通常反对那种事情。 也许它对您的特定用例有意义,但我想不出我个人想在哪里使用它。

关于c# - 什么时候使用 C# 结构(值类型)会牺牲性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4399914/

相关文章:

c# - 从 BSON 序列化为 JSON

python - 是否有可能在一次迭代中或比 O(n*m) 更快地找到字符串中的指定子字符串?

performance - 在LINQ中优化IEnumerable到HashSet的转换

reflection - 通过接口(interface)访问嵌入式类型字段

c - Memcpy 或结构赋值?

c - Eclipse CDT 内容协助未完成结构

c# - NuGet 包拒绝在 .NET Core 库中卸载

javascript - LinkBut​​ton onclientclick 不起作用

c# - 在嵌套对象的 IQueryable 上动态创建 lambda 搜索

jQuery ajax 速度 vs 直接访问速度