簡體   English   中英

具有Perameters的C#屬性獲取器和設置器

[英]C# property getters and setters with perameters

我正在創建一個矩陣類,所以我已經有一個

public double this[int row, col]

但我也想以類似的方式輕松設置並獲取特定的行或列。 我目前有:

public virtual Vector GetRow(int row)
{
    return m[row];
}

public virtual void SetRow(int row, Vector v)
{
    m[row] = v;
}

public virtual Vector GetCol(int col)
{
    return Transpose().m[col];
}

public virtual void SetCol(int col, Vector v)
{
    Matrix temp = Transpose();
    temp.SetRow(col, v);
    temp =  temp.Transpose();
    m = temp.m;
}

但是我想要的是這樣的:

public virtual Vector Row(int row)
{
    get => return m[row];
    set => m[row] = value;
}

public virtual Vector Col(int col)
{
    // getter and setter logic here
}

有沒有辦法做到這一點? 還是我絕對需要使用我創建的方法? 我知道我可以按照自己想要的方式來做行或列,但是,並非兩者都不會。

為此,您需要了解屬性的概念,讓我們看一下Microsoft docs

屬性結合了字段和方法的方面。 對於對象的用戶,屬性似乎是一個字段,訪問該屬性需要相同的語法。 對於一個類的實現者,屬性是一個或兩個代碼塊,分別代表一個get訪問器和/或set訪問器。 讀取屬性后,將執行get訪問器的代碼塊; 當為屬性分配新值時,將執行set訪問器的代碼塊。 沒有設置訪問器的屬性被視為只讀。 沒有獲取訪問器的屬性被認為是只寫的。 具有兩個訪問器的屬性是可讀寫的。

與字段不同,屬性未分類為變量。 因此,您不能將屬性作為ref或out參數傳遞。

這條線很重要: 與字段不同,屬性未歸類為變量。 因此,您不能將屬性作為ref或out參數傳遞。

含義 :您不能傳遞參數來獲取和設置屬性。 他們在這里為訪問者的 -他們的行為就像在讀的方式變量\\寫入財產,但你不能把他們當作領域。

它們為什么存在?

  1. 在每次訪問或值突變的開頭說“獲取並設置”令人煩惱和分心。

  2. 提供對實際變量的直接訪問會破壞封裝,因此這不是一種選擇。

意思是,它們在這里與OO編程概念一樣有幫助-保持封裝,並且它們是在程序中將值分配給變量的簡便方法。

c#中的所有索引器都命名為this 它們可以重載,因此您還可以實現:

public Vector this[int row]

就像您為public double this[int row, col]做的一樣,將public double this[int row, col] 但是,我們會注意到列和行的索引是同一類型,因此您只能對行列執行此操作(因為不能有兩個具有相同簽名的重載)。 此時,您必須確定這樣做的好處是否大於打破對稱性的好處。

因此,在大家卸載了這個問題后(考慮了很多有用的信息,由^-^給出了一些思考之后),我得出了一個效果很好的解決方案

    public enum RowCol {row, col}

    public Vector this[RowCol set, int rowcol]
    {
        get
        {
            switch (set)
            {
                case RowCol.col:
                    return Transpose().m[rowcol];

                default:
                    return m[rowcol];
            }
        }
        set
        {
            switch (set)
            {
                case RowCol.col:
                    Matrix temp = Transpose();
                    temp[RowCol.row, rowcol] = value;
                    temp = temp.Transpose();
                    m = temp.m;
                    break;

                default:
                    m[rowcol] = value;
                    break;
            }
        }
    }

因此,我認為這是我特定實現的最佳解決方案。 感謝您的所有輸入和信息。

編輯:我最終采用這種解決方案而不是ref,因為行是矢量,但是由於要存儲列,我必須具有相同數據的兩個變量,因此列是一個構造值,一個為行設置,另一個為列設置。 這對我來說似乎很浪費,我仍然需要找出一種方法來同步兩個變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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