给出结构点:
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 struct正在堆上分配,并且被逐位复制到堆栈上分配的p变量的内存中。我是对的吗?
Q2 :我需要做什么来携带对Point的引用,而不是在堆栈上分配并按值传递它? (不使用不安全的指针)
class Linear {
private double m, n;
ref Point p = new Point(2.0,3.0); // not compiling
}
答案 0 :(得分:1)
class Wrapper
{
public Point Point { get; set; }
}
使用包装值类型(struct)的引用类型(类),您将在堆中分配它。
答案 1 :(得分:1)
A1:在第一个语句中,您只是声明变量,而不是像在第二个语句中那样创建结构的实例。
A2:您需要使用REF关键字,将对象“提供”给另一个方法,而不是声明变量的位置。
答案 2 :(得分:0)
如果我不想要一个valuetype结构,我通常会创建一个非常简单的类。对于你的例子,哪个看起来像下面的代码。在某些情况下,类会阻止struct boxing / unboxing性能命中。但是如果你有一个List<>结构它是所有数据的单个内存块。使用List<>你得到一个指向许多类实例的指针块。
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public class Point
{
public double x, y;
public Point(double i, double j)
{
x = i;
y = j;
}
}
答案 3 :(得分:0)
在第二个语句中,创建了类型为Point
的匿名临时存储位置,很可能是在堆栈上,并且它作为隐式ref
参数传递给参数化构造函数。构造函数完成后,Point
变量p
通过用匿名临时字段中的相应字段覆盖每个字段(公共或私有)来进行变异,然后放弃。请注意,无论struct假装是不可变的,行为都是相同的。