可以在方法中返回多个返回类型吗?

时间:2011-08-31 07:11:23

标签: c# asp.net

我使用asp.net 4和c#。

我想知道是否可以在方法中返回多个返回类型。

作为此方法的示例,我只返回一个bool类型。

   protected bool IsFilePresent()
    {
            return File.Exists(Server.MapPath("/myFile.txt"));
    }

但是让我们想象一下,我想在类似的方法中返回一个字符串类型:

string lineBase = File.ReadAllText(Server.MapPath("/myFile.txt"));

有可能吗?

我会很感激一些代码示例。非常感谢。

11 个答案:

答案 0 :(得分:7)

不,不可能返回多个不同的值。你有几个选择:

  1. 一种方法是制作一个classstruct,其中包含您想要作为属性或字段返回的每件事。

  2. 另一种方法是使用out参数,将变量传递给方法,然后该方法为其赋值。

  3. 您还可以使用ref参数(通过引用传递),类似于out,但是在调用方法之前需要分配传入的变量(即方法更改)价值)。

  4. 在您的情况下,作为cjk points out,您可以让方法返回包含文件内容的字符串,或者为null以指示该文件不存在。

答案 1 :(得分:2)

对于此示例,您有3个选择。

  1. 在方法中添加一个out参数并将其设置在正文中(下面的代码)
  2. 创建一个包含Booelan和String并返回
  3. 的自定义类
  4. 只返回字符串,但在文件不存在时返回null

  5. protected bool IsFilePresent(out String allText) 
    { 
         Boolean fileExists = File.Exists(Server.MapPath("/myFile.txt")); 
         if (fileExists)
         {
             allText = File.ReadAllText(Server.MapPath("/myFile.txt")); 
         }
         return fileExists;
    } 
    

答案 2 :(得分:1)

是的,只有你使用框架才能使用4.查看元组

http://sankarsan.wordpress.com/2009/11/29/tuple-in-c-4-0/

答案 3 :(得分:0)

答案 4 :(得分:0)

您可以在其中返回包含不同类型的类:

class TestFile
{
    private bool isFilePresent;
    private string lineBase;
}

答案 5 :(得分:0)

是的,您可以创建一个名为(例如)“包含”的包装类,使用两种类型进行参数化,将两个值放在该类的对象中并作为结果返回。在你的情况下,它会像Pair

我不是C#程序员,所以我不会给你准确的代码。

答案 6 :(得分:0)

您有两种选择。

第一个,更多C-ish:out参数:

void test(out bool p1, out bool p2) {
  p1 = true;
  p2 = false;
}

第二个,更多OO,使用结构或类来包含结果:

class Result {
   public bool Part1 {get;set;}
   public bool Part2 {get;set;}
}

Result test() {
   return new Result {Part1 = true, Part2 = false};
}

在C#4中,您可以使用Tuple class而不是创建自己的结果类。

我没有查看您的具体要求,但您可以根据需要组合这些方法,但请记住,至少根据微软指南,不建议在面向对象编程中使用out参数。

答案 7 :(得分:0)

您可能希望使用out - 参数。

protected bool IsFilePresent(out string fileContents) {
  string filePath = Server.MapPath("/myFile.txt");
  try {
    fileContents = File.ReadAllText(filePath);
    return true;
  } catch {
    fileContents = null;
    return false;
  }
}

答案 8 :(得分:0)

是的,您可以使用输出参数。

public bool GetData(string filename, out string data)
{
    if (File.Exists(filename))
    {
        data = File.ReadAllText(filename);
        return true;
    }
    data = string.Empty;
    return false;
}

string data;
if (GetData(Server.MapPath("/myFile.txt"), out data))
{
     // do something with data
}

答案 9 :(得分:0)

是的,我们可以。 dotNet 4支持动态类型,因此您可以返回多种类型

    public dynamic GetSomething()
    {
        if (!File.Exists(Server.MapPath("/myFile.txt")))
            return false;
        else
            return File.ReadAllText(Server.MapPath("/myFile.txt"));
    }

 var result = GetSomething();
 if(result is bool && result == false)
 {
     //doSomething();
 }

这种方式难以阅读您的代码。

答案 10 :(得分:0)

如今非常简单...使用元组

public (string,int) MyMethod(){
   return ("text", 3);
}   

string text;
int number;
(text, number) = MyMethod();

//OR
(var text, var number) = MyMethod();