[英]Struct c# and the memory related to it
給定結構點:
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
}
class Wrapper
{
public Point Point { get; set; }
}
使用包裝值類型(struct)的引用類型(類),您將在堆中分配它。
A1:在第一個語句中,您只是聲明變量,您不是像在第二個語句中那樣創建結構的實例。
A2:您需要使用REF關鍵字,將對象“提供”給另一個方法,而不是在聲明變量的位置。
如果我不想要一個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;
}
}
在第二個語句中,創建了一個類型為Point
的匿名臨時存儲位置,很可能是在堆棧上,並且它作為隱式ref
參數傳遞給參數化構造函數。 在構造函數完成之后,通過用該匿名臨時字段中的相應字段覆蓋每個字段(公共或私有)來改變Point
變量p
,然后放棄該字段。 請注意,無論struct假裝是不可變的,行為都是相同的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.