我对C#很陌生,并且想知道是否可以将某些内容传递给每次都未定义/不同的函数,如下例所示;
string stringexam = "string"
或
int intexam = 5;
或
bool exam = false;
等。
Myfunction(stringexam);
Myfunction(intexam);
Myfunction(exam);
public static void MyFunction(accepteverything) {
//DO SOMETHING
}
怎样才能实现这样的目标? 我需要这个,因为我可以在我的代码中使用这样的东西:
MyFunction(1,"ok example 1");
MyFunction(2, 22);
MyFunction(3, false);
然后我可以继续使用MyFunction:
MyFunction(int method, accepteverything?!)
{
if(method == 1) {
ContinueExample1(string accepteverything); // CALLS FUNCTION CONTINUEEXAMPLE1 WHICH NEEDS A STRING AS PARAMETER
}
if(method == 2) {
ContinueExample2(int accepteverything); // CALLS FUNCTION CONTINUEEXAMPLE2 WHICH NEEDS A INT AS PARAMETER
}
if(method == 3) {
ContinueExample3(bool accepteverything);
}
}
答案 0 :(得分:4)
您可以使用方法重载,相同的命名函数但使用不同的参数类型来完成它。
void MyFunction(string accepteverything)
{
ContinueExample1(accepteverything);
}
void MyFunction(int accepteverything)
{
ContinueExample2(accepteverything);
}
void MyFunction(bool accepteverything)
{
ContinueExample3(accepteverything);
}
这可以让你做到
string stringexam = "string"
int intexam = 5;
bool exam = false;
MyFunction(stringexam);
MyFunction(intexam);
MyFunction(exam);
答案 1 :(得分:1)
如果方法的行为是相同的,无论传递什么类型,你都可以很容易地制作方法:
public void MyFunction(int method, object acceptEverything)
{
switch(method)
{
case 1: ContinueExample1(acceptEverything as string);
break;
case 2: ContineExample2(acceptEverything as int);
break;
// etc.
}
}
不幸的是,这会引入很多拳击和拆箱。
答案 2 :(得分:1)
您也可以使用通用功能。这也避免了装箱/拆箱
public void MyFunction<T>(int method, T acceptEverything)
{
switch(method)
{
case 1: ContinueExample1(acceptEverything as string); //String parameter
break;
case 2: ContineExample2(Convert.ToInt32(acceptEverything)); //int parameter
break;
// etc.
}
}
像这样打电话
MyFunction(1,stringexam);
MyFunction(2,intexam);
答案 3 :(得分:0)
当然,你可以。但是你可能想重新思考一下你做事的方式。想要减少你必须编写的代码是好的。
比尔盖茨 - &#39;我选择一个懒惰的人来做一份艰苦的工作。因为懒惰的人会找到一种简单的方法。&#39;
但它并不总是必要的,并且可以将不必要的复杂性引入其他简单且不言自明的东西。
考虑一下代码中发生了什么。你有一个考试,你想做什么。据推测,您担心可能有多种方法可以为不同的用户识别特定的考试。但是,无论你想做什么,都可能不会改变。所以,让我们从这个角度进行攻击:我们需要能够在给出一些未知参数的情况下识别考试。
public Exam FindExamFromAnything(object input)
{
int examID = 0;
if (int.TryParse(input.ToString(), out examID))
{
return GetExamFromID(examID);
}
else
{
return GetExamFromName(input.ToString());
}
}
public Exam GetExamFromID(int ID)
{
// get the Exam with the right ID from a database or something
}
public Exam GetExamFromName(string examName)
{
// get the Exam with the right name from a database
}
现在你已经有了一种可以通过任何方法的方法,而且你会找回你想要的东西。太好了!
除了......两年后,有人会有一份参加考试的学生名单,并尝试使用你的方法:
List<string> students = new List<string> {"Alice","Bob"};
var exam = FindExamFromAnything(students); // nope!
不起作用。但他怎么会知道?签名中没有任何内容指定要用作对象的内容。现在,他必须找到您的源代码,或使用反复试验来弄清楚如何使用您的API。您的文档可能会解释它只需要一个int或一个字符串,但是......
相反,编写第二种方法并不是那么多。作为Scott Chamberlain points out,您可以重载方法名称以使用不同的参数。对于此实现的更好的解决方案是为了更具体;我偏爱上面暴露的方法,即暴露你的GetExamFromString
和GetExamFromID
以及你需要的任何其他内容,因此它们是自我解释的。