【问题标题】:Return value of parameterized methods?参数化方法的返回值?
【发布时间】:2012-03-20 19:10:57
【问题描述】:

我是 C# 新手,我不确定我是否了解参数化方法的使用。下面我添加了一些代码,这些代码在我将要开发的任务中给出。这是一个简单的 GUI,带有一些询问名称和价格的文本框。

第一行代码调用该方法,布尔变量 inputOk 需要一个真或假值,而 out 参数也会“返回”一些值?

我想,在第二行代码中,尽管名称和价格“返回”,但我还需要返回 true 或 false 才能使第一行代码正常工作?只是想确定我理解它。而且由于我可以从txtName.Text之类的文本框中获取输入值,所以我在调用方法时不需要添加这个值吗?谢谢!

bool inputOk = ReadAndValidateInput(out customerName, out seatPrice);

private bool ReadAndValidateInput(out string name, out double price)

【问题讨论】:

  • 非常奇怪的术语。大多数方法都有参数。

标签: c#


【解决方案1】:

简单地说,是的,您在所有方面都是正确的,但我确实认为您可能需要复习一下您的术语;方法的返回值是returned,而括号中的内容是参数;当你调用方法时,它们被称为参数。

了解更多详情。

最好从第二行开始。

布尔值是来自方法的returned。 nameprice 参数保证被方法修改(因为它们是out,如果它们是ref,那么它们可能会被修改);而且,虽然可以将它们视为附加返回值,但实际上机制完全不同:它们只是称为输出参数

编辑 - 关于“输出参数”

输出参数仍然可以用来传递值(所以它们实际上是输入/输出)。接收参数的方法必须确保它随后写入它(因为它是out)。

结束编辑

如果该方法写在一个拥有文本框的表单类中,那么,是的,您可以简单地使用文本框变量而无需将其传入;因为该方法是一个“实例方法”(而不是 static,它没有 this)并且变量属于表单的同一个实例。

在第一行,是的 - inputOk 从调用方法接收布尔返回值 - 将 customerNameseatPrice 作为输出参数传递。方法返回后,假设没有异常发生,inputOk会被设置为方法的返回值;并且这两个参数将接收ReadAndValidateInput 方法调用设置的值。

【讨论】:

  • 感谢您的信息。我想知道第一行代码。当我使用 out customerName、out seatPrice 时,它​​们是否也会像普通调用一样工作,以便我可以在方法内使用 customerName 和 seatPrice 的值,还是它们只是在等待将新值返回给调用?
  • 我原本有一个关于那个的台词,但是因为我认为它混淆了事情所以把它删掉了。是的 - 您可以使用这些参数将值传递给方法。例如。如果方法是保证customerName 被修剪掉空白,你可以传入预先验证的名称,在方法内部你可以做name = name.Trim()。当方法返回时,调用者的customerName 将被修剪。
【解决方案2】:

你通常应该这样称呼它:

string name;
double price;
bool inputOk = ReadAndValidateInput(out customerName, out seatPrice);

所有三个变量都将在 ReadAndValidateInput 中获得赋值。 在 C++ 中,不可能返回多个值,因此可以使用 'out' 关键字。

但是,如果可能,最好避免它。您还可以创建两个额外的 get 函数来返回客户名称和座位价格。

【讨论】:

    【解决方案3】:

    想象一下,ReadAndValidateInput 不仅会验证输入,还会进行一些计算并返回其他值 - 例如折扣。这就是你需要 out 参数的地方

    double discount = 0;
    
    if(ReadAndValidateInput(customerName, seatPrice, out discount))
    {
       //do something with discount. You know that input was valid
    }
    else
    {  // do not touch discount. User has not entered valid values
    }
    

    如果被调用的方法不改变值或不生成除返回值之外的新值,则不需要 out 参数。你是对的 - 可以通过调用代码访问原始值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-14
      • 2017-02-16
      • 2012-08-05
      相关资源
      最近更新 更多