объект против объекта [] - PullRequest
2 голосов
/ 03 июля 2010

Я смотрю на метод, который принимает параметр object[].Но если я передам одно значение (то есть object), оно все равно будет работать.

Это встроено как часть C #?object и object[] одинаковы?

Я спрашиваю, потому что иногда мне нужно передать массив объектов, а иногда мне нужен только один, и мне интересно, нужно ли мне это сделать:

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

и передать object или object[].

(Обратите внимание, что параметр, о котором я говорю, этопервый (primaryKey).

(Примечание: метод, который я вызываю с параметром primaryKey, - SqlCeResultSet.Seek, который также принимает object[])

Ответы [ 5 ]

3 голосов
/ 03 июля 2010

Вы можете принять массив параметров в определенных ситуациях, что позволяет вам предоставлять от 1 до n объектов или один массив.Что-то вроде

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

Уловка в том, что массив params должен быть последним параметром метода.Если вам нужен вариант иметь один объект или массив объектов перед последним параметром, вы должны предоставить перегрузку, как в исходном коде.Ваш код выглядит так, как будто вы пытаетесь работать с первым параметром, поэтому ваш ответ таков: перегрузки - ваш друг, поскольку вы не можете передать объект, для которого ожидается массив объектов, без использования ключевого слова params, и это не вариант длявсе, кроме последнего параметра.

Редактировать На основании дополнительной информации SqlCeDataReader.Seek принимает массив параметров в качестве окончательного параметра, так что да ... вы можете вызвать его с помощью одногообъект, несколько объектов или массив объектов.

Все эти вызовы допустимы

Seek(DbSeekOptions.After, someObject);
Seek(DbSeekOptions.After, someObject, anotherObject);
Seek(DbSeekOptions.After, objectArray);
Seek(DbSeekOptions.After);
1 голос
/ 03 июля 2010

Если вы просто используете первую подпись, взяв object, вы можете передать object[], и она будет хорошо скомпилирована.

Тем не менее:

  • Вам придется справиться с этим внутри вашего метода - проверьте, что вам дали object[], и относитесь к нему иначе, если это просто object.
  • Кто-то, видящий метод с параметром object, вероятно, не ожидает, что сможет передать object[].
  • Это не будет работать для других классов - object[] - это object, но something[] - это не something.
1 голос
/ 03 июля 2010

object и object[] - это не одно и то же, и вы вообще не сможете их поменять. В C # нет ничего, что могло бы трансформировать их за кулисами - вы, вероятно, сталкиваетесь с массивами параметров , где вы видели это раньше.

Это особый случай, когда вызов метода примет список отдельных объектов переменной длины в качестве последнего «параметра» метода, позволяя вызывающей стороне указать любое количество дополнительных параметров для вызова метода.

Это, вероятно, случаи, когда вы передаете один объект, когда определение функции говорит, что ему нужен массив из них.

Поскольку ваши функции берут несколько массивов и пропускают их, если вы хотите избавить конечного пользователя от необходимости инкапсулировать его единственный объект в массив, вам потребуется предоставить оба.

Честно говоря, хотя, как потребитель API, я бы не обиделся, если бы вы исключили перегрузку одного объекта;)

1 голос
/ 03 июля 2010

Да, вам необходимо перегрузить метод, поскольку передача одного объекта в метод, принимающий массив объектов, приведет к ошибке при компиляции.

редактировать

Если вы хотите наоборот, это действительно работает, и вы можете сделать это так:

public static void MergeRow(object primaryKey, object[] rowValues)
{
    if ( primaryKey is object[] )
    {
        // is an array of objects
    }
    else
    {
        // is a single object
    }
}
0 голосов
/ 03 июля 2010

Как уже говорили другие, и после сообщения womp я хотел бы отметить, что объект и объект [] не являются взаимозаменяемыми, и вы испытываете именно то, что было описано.Функция SqlCeDataReader.Seek определяется как:

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

Более подробную информацию о массивах параметров можно найти здесь:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...