【问题标题】:object vs object[]对象与对象[]
【发布时间】:2010-07-02 22:21:51
【问题描述】:

我正在研究一种采用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[]

【问题讨论】:

    标签: c# arrays object


    【解决方案1】:

    您可以在某些情况下接受参数数组,这允许您提供 1 到 n 个对象或单个数组。像

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

    关键是参数数组必须是方法的最终参数。如果您需要在最终参数之前选择单个对象或对象数组,则必须像原始代码一样提供重载。您的代码看起来好像您正在尝试使用第一个参数,所以您的答案是重载是您的朋友,因为您无法在不使用 params 关键字的情况下传入需要对象数组的对象,这不是一个选项除了最后一个参数。

    编辑根据附加信息,SqlCeDataReader.Seek 确实将 params 数组作为其最终参数,所以是的...您可以使用单个对象、多个对象或数组来调用它对象。

    这些电话都是合法的

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

    【讨论】:

    • 我认为你们没有抓住重点。请参阅关于他如何调用 SqlCeResultSet.Seek 的 OP 文本,该文本也接受 Object[] 的参数。
    • 罗伯特是对的。我想知道我是否需要做超载。
    • @Robert,我认为这是被编辑的,虽然它没有显示在历史记录中,因为它在时间限制之前。
    【解决方案2】:

    objectobject[] 不一样,您通常无法互换它们。 C# 中没有任何东西在幕后改变它们 - 您可能遇到过 parameter arrays,您之前已经看到过。

    这是一种特殊情况,其中方法调用将接受可变长度的单个对象列表作为方法的最后一个“参数”,允许调用者为方法调用指定任意数量的附加参数。

    这些情况很可能是您传递一个对象,而函数定义表明它需要一组对象。

    由于您的函数需要多个数组并传递它们,如果您想消除最终用户必须将其单个对象封装在数组中的情况,那么您需要同时提供这两个。

    老实说,作为 API 使用者,如果您不考虑单对象重载,我不会感到被冒犯 ;)

    【讨论】:

      【解决方案3】:

      是的,您需要重载方法,因为将单个对象传递给接受对象数组的方法会在编译时产生错误。

      编辑

      如果你想反过来,它确实有效,你可以这样做:

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

      【讨论】:

        【解决方案4】:

        如果你只使用第一个签名,取一个object,你可以传入一个object[],它会编译得很好。

        但是:

        • 你必须在你的方法中处理这个问题 - 检查你得到的是否是一个 object[] 并区别对待它是否只是一个 object
        • 看到带有object 参数的方法的人可能不会期望能够传递object[]
        • 这不适用于其他类 - object[]object,但 something[] 不是 something

        【讨论】:

          【解决方案5】:

          正如其他人所说,在 womp 的帖子之后,我想指出 object 和 object[] 不可互换,您所体验的正是所描述的。 SqlCeDataReader.Seek 函数定义为:

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

          您可以在此处找到有关参数数组的更多信息:

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

          【讨论】:

            猜你喜欢
            • 2015-10-06
            • 1970-01-01
            • 2015-12-13
            • 2015-11-28
            • 1970-01-01
            • 1970-01-01
            • 2019-07-11
            • 2013-07-26
            • 2021-10-21
            相关资源
            最近更新 更多