【问题标题】:How to initialize an object from another CS file如何从另一个 CS 文件初始化对象
【发布时间】:2013-09-26 00:39:18
【问题描述】:

注意:我已经从这个程序中删除了所有不相关的代码。

我在一个项目中有多个 CS 文件。我几乎完成了这个项目,但是对于我的最大值(和最小值,但我把它拿出来,因为它会和这个一样),它返回 void(我在“return”下得到红色曲线)。我觉得我正在正确初始化我的对象,但显然我没有。我在一个 CS 文件中有一个包含硬编码值的数组:

      static void Main(string[] args)
      {
          UnorderedArrayList<int> u = new UnorderedArrayList<int>();
          Console.WriteLine("This is the original list");
          u.print();
          int var = 5;
          u.insert(ref var);
          var = 12;
          u.insert(ref var);
          var = 2;
          u.insert(ref var);
          var = 29;
          u.insert(ref var);
          var = 40;
          u.insert(ref var);
          var = 5;
          u.insert(ref var);
          var = 58;
          u.insert(ref var);
          u.print();
          var = 5;
          Console.WriteLine("********");
          Console.WriteLine("Max Number:");
          u.returnMax(ref var);
          u.print();
      }

然后在另一个 CS 文件中我有方法:

      public override void insert(ref T item)
      {
          list[next] = item;
          next++;
      }

      public override void returnMax(ref T item)
      {
          dynamic max = list[0];
          for (int i = 0; i < list.Count() - 1; i++)

          {
              if (list[i] > max)
                    max = list[i];
          }
          return max;

此外,在另外一个 CS 文件中,我有抽象方法。

  public abstract class ArrayList<T>
  {
      protected T[] list;
      protected int next;
      public ArrayList()
      {
          list = new T[100];
          next = 0;
      }
      public abstract void returnMax(ref T item);
      public void print()
      {
          for (int i = 0; i < next; i++)
          {
              Console.WriteLine(list[i]);

          }
      }

我唯一有任何问题的部分是第二部分中的“返回最大值”,因为它返回 null。显然,我没有正确初始化对象“max”。任何帮助将不胜感激。我真的很想知道我做错了什么,因为它让我发疯!

【问题讨论】:

  • 不是整个u.Insert(ref var); 的一部分有味道吗?如果您在 C# 中复制/粘贴代码,很有可能您做错了某事
  • 我真的不知道你在说什么。我不是在复制和粘贴代码。这只是整个项目的一小部分。那么,你在暗示它“闻起来像什么”,只是为了让我们清楚?
  • 吞咽。误读您的代码,对不起。为什么不直接内联初始化该数组?
  • 不用担心。当谈到 C# 时,我仍然是一个相当大的新手。介意我问你所说的“内联初始化”是什么意思?这可能就是我正在寻找的。​​span>
  • 这如何返回任何东西...?它被标记为void.. 你能给我们正确的代码吗?

标签: c# arrays object methods


【解决方案1】:

小问题是您正在用 C# 编写 C。最大的问题是您错误地实现了 C 习语。

returnMax 被声明为void - 这意味着它不能返回值 - 这就是为什么你会在“return”下得到红色曲线,这也意味着你的代码无法编译,当你运行它实际运行的是最后一个编译成功的版本。

returnMax 的签名来看,实现不应该将最大值作为返回值返回——相反,它们应该将其写入ref 参数item。这是一个 C 习语——只有在 C 中,returnMax 会返回一个“退出代码”——如果函数成功完成,则整数设置为 0,如果出现错误,则设置为非零(可能是实际错误代码)。 C# 有异常,因此您不需要退出代码并且可以返回实际结果。此外,即使您无法通过方法的 return 语句返回它 - 您也应该使用 output 参数,而不是 ref

无论如何,假设您无法更改returnMax 的签名,您需要做的是删除return max;(它会破坏您的编译),而是将结果写入item 参数。

PS:max 的类型不应该是 dynamic - 它应该是 Tdynamic 仅在您想使用后期绑定时才有用。

【讨论】:

  • 那个,dynamic 将框 T.. 如果它是一个值类型。
  • 对不起,我是个白痴。在我试图将这段代码压缩到最低限度时,我遗漏了一个重要的部分。即: public override void insert(ref T item) { list[next] = item;下一个++;我在上面编辑了我的帖子以反映这一点。无论如何,这就是“项目”发挥作用的地方。另外,“list”在“protected T[] list;”中已经被表示为T,不是吗?正如你所说,当我用“动态”代替“T”时,我会看到更多的红色曲线告诉我不要这样做。
  • 虽然在概念上它们是相关的,但就编译器而言,insertitem 参数和 returnMaxitem 参数之间没有关系。即使insertiteminsert 的主体中发挥作用,returnMaxitem 也是一个不同的参数,不会在您的代码中发挥作用。无论如何,既然returnMax应该返回一个值,而item是返回值的唯一手段,那么通过item返回值是合乎逻辑的。
【解决方案2】:

我将给你一个答案,忽略你不应该通过ref 传递所有内容的事实。一定要回顾一下。

首先,您需要从returnMax.. 返回T,还需要将max 设置为T 类型。当你这样做时,编译器会给你一个错误,说明“不能应用运算符 > 到类型 T”。这可以通过使用默认比较器来解决。这就是returnMax 变成的样子:

public override T returnMax(ref T item)
{
    T max = list[0];
    Comparer<T> comparer = Comparer<T>.Default;
    for (int i = 0; i < list.Count() - 1; i++)
    {
        if (comparer.Compare(list[i], max) > 0)
            max = list[i];
    }
    return max;
}

确保您也更改了基本返回类型。然后你可以这样做:

int max = u.returnMax(ref var); // "max" contains the maximum.

【讨论】:

  • 如果要更改returnMax的签名,不妨去掉item参数。
  • 我将清理工作作为 OP 的练习。这至少会起作用。
猜你喜欢
  • 2016-05-30
  • 1970-01-01
  • 2017-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-20
  • 2012-10-05
  • 2013-10-12
相关资源
最近更新 更多