簡體   English   中英

將通用指針傳遞給c#中的方法

[英]Passing a generic pointer to a method in c#

我創建了一個通用類型來充當指針,以便可以通過引用傳遞。 (也許有一種更簡單的方法可以做到這一點,但我想強調,我這樣做是為了更多地了解泛型和通過引用傳遞,而不是完成任務的最有效方法,如果這是有道理的。)

這是我為泛型類型編寫的代碼

class GenericPointer<T> {
    public T item;
    public void setItem(T i){ item = i; }
    public T getItem(){ return item; }
}

在我的程序中,我創建了一個名為“ intPointer”的實例。 值143是任意的。

GenericPointer<int> intPointer = new GenericPointer<int>();
intPointer.setItem(143);
Console.WriteLine(intPointer.getItem());

上面的代碼運行正常,設置並返回值143。

我現在想將這個'intPointer'傳遞給一個遞增它的方法,然后再次打印該值。

所以我寫了一個名為addone()的方法

public void addone(int i) { i ++; }

現在我想進行以下調用(記住我已經將值設置為143):

Console.WriteLine(intPointer.getItem());
addone(intPointer);
Console.WriteLine(intPointer.getItem());

我原本希望看到的是143,然后是144,但是出現以下錯誤:

The best overloaded method match for 'Notes.Program.addone(int)' has some invalid arguments

和:

cannot convert from 'Notes.GenericPointer<int>' to 'int'

任何幫助將不勝感激!

我將首先糾正你的一些術語:你沒有使用指針。 C#確實支持指針,但使用unsafe關鍵字,它們是真正的指針(如在整數存儲器地址中,您可以直接操作)。 您編寫的代碼只是裝箱對象的示例。

.NET已經通過強制轉換為Object來支持裝箱; 但是不推薦也不需要它,因為ref關鍵字解決了你試圖“修復”的問題。

使用ref關鍵字來描述應該按引用而不是按值傳遞的值類型參數。 所有其他語義保持不變,如下所示:

void Foo() {
    int x = 123;
    Bar(ref x);
    Console.Write( x ); // prints "124".
}
void Bar(ref int x) {
    x++;
}

我還有一些其他說明:

  1. C#和.NET約定規定所有公共成員(方法,屬性,字段等)都應該有TitleCase,而不是camelCase(即確保首字母大寫)。
  2. 不建議使用普通的getter和setter方法,而應使用Properties(盡管我注意到您不能將ref參數與properties一起使用)。
  3. 由於intPointer的類型不是int ,而是您的類GenericPointer<int>

雖然GenericPointer包裝了一個int,但它實際上並不是一個int,因此它不能被視為一個int。 它具有int的屬性。

想象一下,如果GenericPointer包裹了一個字符串。 AddOne會對此做些什么。

您可以對類的屬性執行操作,但不將整個類視為其泛型類型。

可以編寫一個采用通用指針參數的AddOne方法,然后檢查其是否為整型,如果內部值為int,則將其添加到內部項中。 我確信這不是一個好主意。

你真的想用這個GenericPointer實現什么?

如果您希望參數是值類型(字符串,整數,布爾值等)的引用,則使您的參數像這樣:

public void addone(ref int i)
{
    i++;
}

然后像這樣調用方法:

addone(ref variableInt);

您還可以查看此內容 ,以了解如何使您的類作為特定類型工作。

暫無
暫無

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

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