0

给定结构点:

public struct Point {
    double x, y;
    Point(double i, double j) {
        x=i;
        y=j;
    }
}

Q1:有什么区别:

Point p;

Point p=new Point(2.0,3.0);

据我了解,在第二部分中,匿名 Point 结构被分配在堆上,并被逐位复制到堆栈上分配的 p 变量的内存中。我对么?

Q2:我需要做什么来携带对 Point 的引用,而不是在堆栈上分配它并按值传递它?(不使用不安全的指针)

class Linear {
    private double m, n;
    ref Point p = new Point(2.0,3.0); // not compiling
} 
4

4 回答 4

1
class Wrapper
{
    public Point Point { get; set; }
}

使用包装值类型(结构)的引用类型(类),您将在堆中分配它。

于 2012-07-05T10:26:43.080 回答
1

A1:在第一条语句中,您只是声明了变量,而不是像在第二条语句中那样创建结构的实例。

A2:您需要在将对象“提供”给另一个方法的地方使用 REF 关键字,而不是在声明变量的地方。

于 2012-07-05T10:28:00.130 回答
0

如果我不想要 valuetype 结构,我通常会创建一个非常简单的类。对于您的示例,这看起来像下面的代码。在某些情况下,一个类将防止结构装箱/拆箱性能下降。但是,如果您有一个 List<> 结构,那么它就是所有数据的单个内存块。使用 List<> of class,您可以获得指向许多类实例的单个指针块。

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public class Point
{
    public double x, y;

    public Point(double i, double j)
    {
        x = i;
        y = j;
    }
}
于 2012-07-05T10:33:26.977 回答
0

在第二个语句中,Point创建了一个匿名类型的临时存储位置,很可能在堆栈上,并将它作为隐式ref参数传递给参数化构造函数。构造函数完成后,通过使用匿名临时字段中的相应字段覆盖每个字段(公共或私有)来改变Point变量,然后将其丢弃。p请注意,无论结构是否假装不可变,行为都是相同的。

于 2012-07-06T17:15:57.673 回答