在C#中交换两个引用类型的变量

卢卡斯M

我有两个具有引用类型变量的结构实例。我想交换这两个变量,但是关于如何执行此操作的第一个猜测似乎不起作用。我的代码如下所示:

struct Foo
{
    Bar m_bar;
}

void Main()
{
    Foo a = new Foo();
    Foo b = new Foo();

    //swapping the values of m_bar of a and b
    Bar temp = a.m_bar;
    a.m_bar = b.m_bar;
    b.m_bar = temp;
}

据我所知,由于变量是引用类型,因此分配b.m_bar给的a.m_bar同时也会将其分配给temp,使交换变得混乱。

那我的代码错了吗?如果是,交换两个引用类型变量的正确方法是什么?如果没有,我想我的代码会搞乱其他地方。

谢谢!

马克·格雷韦尔

问题中的代码可以正常工作,如下面的最小再现所示。这里的混乱几乎肯定与可变的值类型有关。具有可变字段的结构因混乱臭名昭著我强烈建议您将其Foo视为不可变的,readonly struct如果您的编译器支持,则明确将其设置为-类似于:

    readonly struct Foo
    {
        public Bar Bar { get; }
        public Foo(Bar bar) => Bar = bar;
        // not shown: override ToString, GetHashCode and Equals
    }

但是:与原始代码类似:


static class P
{
    static void Main()
    {
        Foo a = new Foo { m_bar = new Bar("abc") };
        Foo b = new Foo { m_bar = new Bar("def") };

        System.Console.WriteLine("Before");
        System.Console.WriteLine($"a.m_bar: {a.m_bar}"); // abc
        System.Console.WriteLine($"b.m_bar: {b.m_bar}"); // def

        //swapping the values of m_bar of a and b
        Bar temp = a.m_bar;
        a.m_bar = b.m_bar;
        b.m_bar = temp;

        System.Console.WriteLine("After");
        System.Console.WriteLine($"a.m_bar: {a.m_bar}"); // def
        System.Console.WriteLine($"b.m_bar: {b.m_bar}"); // abc
    }

    struct Foo
    {   // note: public fields are usually a bad idea in any type
        // note: mutable fields on value-types are usually a bad idea
        public Bar m_bar;
    }

    class Bar
    {
        public string Name { get; }
        public override string ToString() => Name;
        public Bar(string name) => Name = name;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在 Lolcode 中交换两个变量

来自分类Dev

C#中两个数据类型变量相互引用

来自分类Dev

在C ++中,有两个结构引用彼此的变量

来自分类Dev

C ++如何在类型不同的两个变量之间建立交换函数

来自分类Dev

如何交换存储在 C# 中的二维列表中的两个对象?

来自分类Dev

给定其不透明类型和数组,如何在C ++ 03中交换两个__m128i变量?

来自分类Dev

C#如何比较和交换两个结构?

来自分类Dev

如何交换两个 SyntaxNode (Roslyn C#)

来自分类Dev

SymPy:交换两个变量

来自分类Dev

如何交换两个变量?

来自分类Dev

交换两个变量的函数

来自分类Dev

C ++中两个向量之间的元素交换

来自分类Dev

类型脚本中的两个类型变量

来自分类Dev

在Swift中互相引用的两个弱变量?

来自分类Dev

C#中的两个语句

来自分类Dev

在C ++中为公共类变量声明两个或更多类型

来自分类Dev

在MATLAB中串联两个或多个结构类型变量

来自分类Dev

在MATLAB中连接两个或多个结构类型变量

来自分类Dev

在Webstorm中交换/交换两个选择

来自分类常见问题

尝试创建相同对象类型的两个实例,但最终得到两个引用相同对象的变量

来自分类Dev

如何在C#中编写两个类型为“委托”的lambda

来自分类Dev

如何在C#图表中添加两个不同的类型系列?

来自分类Dev

如何在C#图表中添加两个不同的类型系列?

来自分类Dev

如何在 C# 中合并两个自定义类型列表

来自分类Dev

在模板类型列表中交换两个元素。寻求最有效的算法

来自分类Dev

C#比较两个强类型列表

来自分类Dev

在CUDA中交换两个寄存器变量的有效方法是什么?

来自分类Dev

在QuickSort中交换两个变量时发生奇怪的事情

来自分类Dev

C#无法识别两个变量

Related 相关文章

  1. 1

    在 Lolcode 中交换两个变量

  2. 2

    C#中两个数据类型变量相互引用

  3. 3

    在C ++中,有两个结构引用彼此的变量

  4. 4

    C ++如何在类型不同的两个变量之间建立交换函数

  5. 5

    如何交换存储在 C# 中的二维列表中的两个对象?

  6. 6

    给定其不透明类型和数组,如何在C ++ 03中交换两个__m128i变量?

  7. 7

    C#如何比较和交换两个结构?

  8. 8

    如何交换两个 SyntaxNode (Roslyn C#)

  9. 9

    SymPy:交换两个变量

  10. 10

    如何交换两个变量?

  11. 11

    交换两个变量的函数

  12. 12

    C ++中两个向量之间的元素交换

  13. 13

    类型脚本中的两个类型变量

  14. 14

    在Swift中互相引用的两个弱变量?

  15. 15

    C#中的两个语句

  16. 16

    在C ++中为公共类变量声明两个或更多类型

  17. 17

    在MATLAB中串联两个或多个结构类型变量

  18. 18

    在MATLAB中连接两个或多个结构类型变量

  19. 19

    在Webstorm中交换/交换两个选择

  20. 20

    尝试创建相同对象类型的两个实例,但最终得到两个引用相同对象的变量

  21. 21

    如何在C#中编写两个类型为“委托”的lambda

  22. 22

    如何在C#图表中添加两个不同的类型系列?

  23. 23

    如何在C#图表中添加两个不同的类型系列?

  24. 24

    如何在 C# 中合并两个自定义类型列表

  25. 25

    在模板类型列表中交换两个元素。寻求最有效的算法

  26. 26

    C#比较两个强类型列表

  27. 27

    在CUDA中交换两个寄存器变量的有效方法是什么?

  28. 28

    在QuickSort中交换两个变量时发生奇怪的事情

  29. 29

    C#无法识别两个变量

热门标签

归档