2012-03-02 99 views
1

我是C#的新手,我不确定我了解使用参数化方法。下面我添加了一些代码,这些代码是我在开发任务时给出的。这是一个简单的图形用户界面,其中有一些文本框要求提供名称和价格。参数化方法的返回值?

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

在第二行代码中,我猜尽管名称和价格的“返回”,我还需要返回true或false来获得第一行代码的工作?只是想确定我理解它。而且,因为我可以从txtName.Text这样的文本框中获得输入值,所以当我调用方法时,我不需要添加此值。谢谢!

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

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

非常奇怪的术语。大多数方法都有参数。 – 2012-03-02 09:14:39

回答

1

简而言之,是的,你说得对,但我确实认为你可能需要提高你的术语;方法的返回值是return ed,而括号中的内容是参数;当你调用这个方法时,它们被称为参数。

有关更多详细信息。

最好从第二行开始。

该方法的布尔值为returnnameprice参数保证通过该方法修改(因为它们是out,如果它们是ref那么它们可能可能被修改);并且,虽然它们可以被认为是附加的返回值,但实际上该机制是完全不同的:它们被称为输出参数

编辑 - 关于“输出参数”

的输出参数仍然可以使用也在值通过(所以真的它们是输入/输出)。接收参数的方法必须确保它接着写入(因为它是out)。

最终编辑

如果该方法是一个表格类,它拥有一个文本框然后,是的,可以简单地使用文本框变量,而不必把它传递在里面写;因为该方法是一种“实例方法”(与static相反,它没有this),并且该变量属于表单的同一实例。

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

+0

感谢您的信息。我想知道第一行代码。当我使用out的customerName,outPeicePrice时,它们是否也像普通调用一样工作,因此我可以在方法内使用customerName和seatPrice的值,还是只是等待将新值返回给调用? – 2012-03-02 09:37:05

+0

我原本有一条关于此的内容,但是把它拿出来是因为我认为它令人困惑。是的 - 您可以使用这些参数将值传递给方法。例如。如果该方法确保'customerName'被修剪为空白,则可以传入预先验证的名称,并在该方法内部可以执行'name = name.Trim()'。当方法返回时,调用者的'customerName'将被修剪。 – 2012-03-02 09:57:44

1

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

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参数,如果被调用方法不更改值或不产生比返回之外的其它新值。你是对的 - 可以从调用代码访问原始值。

1

通常应称其为:

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

所有三个变量将得到内ReadAndValidateInput赋值。 在C++中,不可能返回多个值,然后使用“out”关键字作为替代。

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