c#pod复制或引用

时间:2011-10-17 11:37:53

标签: c# variables

float a = 3f; // presumably the same as float a = new float(3f);
float b = a;

我希望'b'成为一个全新的浮动,现在不是'a'的参考。

我该怎么做?

4 个答案:

答案 0 :(得分:6)

浮点值是值类型而不是引用类型,因此b是一个新浮点数,更改一个不会影响b。

检查一下:C# value types

答案 1 :(得分:2)

由于float类型为Value Type,因此它将是一个完全独立的变量,并且不会以任何方式引用aRefernce术语对于值类型没有意义。

请参阅MSDN上的Value Types

  

值类型包含两个主要类别:

     
      
  1. 的Structs
  2.   
  3. 枚举
  4.         

    结构属于以下类别:

         
        
    • 数字类型
    •   
    • 积分类型
    •   
    • 浮点类型
    •   
    • 小数
    •   
    • BOOL
    •   
    • 用户定义的结构。
    •   

答案 2 :(得分:2)

我将演示使用您自己的代码,这已经按照您希望的方式运行:

using System;
public sealed class Program{

    public static void Main()
    {
        float a = 3f; // presumably the same as float a = new float(3f);
        float b = a;
        a = a + 1;
        Console.WriteLine("A:{0}", a);//prints 4
        Console.WriteLine("B:{0}", b);//prints 3
    }
}

是的,正如其他人所指出的那样,这是有效的,因为float是一种值类型。值类型是堆栈分配。这意味着您声明并定义为值类型的每个变量在堆栈上都有自己的空间。在引用类型上是堆分配的。这意味着这些变量实际上并没有它们在堆栈上表示的实际值。但它们只是指向堆上实际对象的指针。查看MSDN的System.ValueType类以获得更清晰的信息。

编辑1: 关于如何将值类型总是存储在堆栈中,我错了。阅读此内容的任何人都应阅读Eric Lippert撰写的this questionthis post,了解实际发生的情况。在这种情况下,官方的Microsoft文档(上面分享的链接)似乎是错误的或至少能够被误解。

答案 3 :(得分:1)

请继续使用您的代码。

将新变量分配给现有变量时,将复制数值。

事实证明:

在LinqPad中执行此操作

float a = 3f;
float b = a;

b = 3.1f;

a.Dump();
b.Dump();

结果如下:

  

3
  3.1