簡體   English   中英

對象與對象[]

[英]object vs object[]

我正在研究一種采用object[]參數的方法。 但是,如果我傳遞一個值(即object ),它仍然可以工作。

這是C#的一部分嗎? objectobject[]是否相同?

我問,因為有時我需要傳遞一組對象,有時只需要一個對象,我想知道是否需要這樣做:

public static void MergeRow(object primaryKey, object[] rowValues)
{
    MergeRow(new object[]{primaryKey}, rowValues);
}

public static void MergeRow(object[] primaryKey, object[] rowValues)
{
     // Rest of my method

還是第一個簽名足夠,並且我可以根據需要傳遞數組或單個對象?

基本上我在問我是否需要重載此方法?

我可以這樣做嗎?

public static void MergeRow(object primaryKey, object[] rowValues)
{
    // Rest of my method

並傳入一個objectobject[]

(請注意,我正在談論的參數是第一個(primaryKey)。

(注意:我使用primaryKey參數調用的方法是SqlCeResultSet.Seek ,它也帶有一個object[]

在某些情況下,您可以接受參數數組,這允許您提供1到n個對象或單個數組。 就像是

public static void MyMethod(params object[] values) { }

問題在於params數組必須是該方法的最后一個參數 如果需要在最終參數之前使用單個對象或對象數組,則必須提供類似於原始代碼的重載。 您的代碼看起來像您正在嘗試使用第一個參數,因此您的答案是重載是您的朋友,因為您不能在不使用params關鍵字的情況下傳遞需要對象數組的對象,因此這不是一種選擇除了最后一個參數。

編輯根據其他信息, SqlCeDataReader.Seek確實將params數組作為其最終參數,因此可以...您可以使用單個對象,多個對象或對象數組來調用它。

這些電話都是合法的

Seek(DbSeekOptions.After, someObject);
Seek(DbSeekOptions.After, someObject, anotherObject);
Seek(DbSeekOptions.After, objectArray);
Seek(DbSeekOptions.After);

是的,您需要重載該方法,因為將單個對象傳遞給接受對象數組的方法會在編譯時產生錯誤。

編輯

如果您反過來想要它,它實際上可以工作,您可以這樣做:

public static void MergeRow(object primaryKey, object[] rowValues)
{
    if ( primaryKey is object[] )
    {
        // is an array of objects
    }
    else
    {
        // is a single object
    }
}

objectobject[]不相同,因此您通常無法互換它們。 在C#中,沒有任何東西可以在后台進行轉換-您可能會遇到參數數組 ,您之前已經看到過。

在一種特殊情況下,方法調用將接受長度可變的單個對象的列表作為方法的最后一個“參數”,從而允許調用者為方法調用指定任意數量的附加參數。

在可能的情況下,您傳遞的是一個對象,其中函數定義說它需要一個數組。

由於您的函數采用多個數組並傳遞它們,因此,如果您要消除最終用戶必須將其單個對象封裝在數組中,則需要同時提供兩者。

坦白地說,作為API使用者,如果您不考慮單對象重載,我不會感到冒犯;)

如果您僅使用第一個簽名並接受一個object ,則可以傳入object[] ,這樣可以很好地進行編譯。

然而:

  • 您必須在方法內部處理此問題-檢查給定的object[]是否為object[] ,並將其與僅作為object區別對待。
  • 看到帶有object參數的方法的人可能不會期望能夠傳遞object[]
  • 這不適用於其他類object[]objectsomething[]不是something

正如其他人所述,在womp發表文章之后 ,我想指出object和object []是不可互換的,並且您正在經歷的內容已經完全一樣。 SqlCeDataReader.Seek函數定義為:

public bool Seek (
    DbSeekOptions dbSeekOptions,
    params Object[] index
)

您可以在此處找到有關參數數組的更多信息:

http://msdn.microsoft.com/en-us/library/w5zay9db(VS.71).aspx

暫無
暫無

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

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