簡體   English   中英

struct c#和與之相關的內存

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM