如何从C#方法返回多个数据类型?

6
我是一名有用的助手,可以为您翻译文本。
我有一个方法需要根据搜索返回不同的数据类型。我正在考虑两种方法,因为我对C#不熟悉,所以不知道哪种方法更好,请帮助我做出决定。
第一种方法是像这样重载该方法:
public int Get(string name){
   //...
   return intValue;
}

public double Get(string name){
   //...
   return doubleValue;
}

public string Get(string name){
   //...
   return stringValue;
}

第二种方法是针对每种数据类型使用不同的方法,如下所示:
public int GetInt(string name){
   //...
   return intValue;
}

public double GetDouble(string name){
   //...
   return doubleValue;
}

public string GetString(string name){
   //...
   return stringValue;
}

考虑到这段代码将从DLL中发布,哪一个对于C#来说是最安全的?


7
建议选择第二个,因为第一个无法编译。 - neeKo
你尝试过实现你的第一种方法吗? - Jonesopolis
你是否已经研究过泛型方法了?仅凭你提供的信息,它们可能与你的情况相关...编辑:看起来建议是多余的,因为已经有被接受的答案了。我的错! - Twisted Code
6个回答

13
第一种方法甚至不可能实现。你不能仅通过更改返回类型来重载方法。
根据代码的功能,你可以将其变成通用方法。
public T Get<T>(string name){
   //...
   return somegenericvalue;
}

但我怀疑你无论如何都会使用反射来决定该做什么,所以泛型的优势将被抵消。另外,你不能将其限制为只有你提到的类型(stringintdouble)。
按类型拥有不同方法的主要好处是强类型。对于消费者,支持的类型列表是有限的,因此他们不必担心Get方法是否支持特定类型。对于编写者,您可以编写针对特定类型的代码,因此不需要反射、类型检查、转换、解析等来实现泛型 - 您可以为该类型编写代码。
这可能感觉像冗余代码,但您仍然可以重构以将常见部分放入内部“帮助程序”方法中。
FYI框架在某些地方也这样做,所以这并不罕见:
- Convert.ToXXX - DbDataReader.GetXXX() 另一方面,有些扩展方法选择使用泛型方法:
- DataRow.Field<T> 但这些通常只是传递方法,它们不执行任何需要特定类型的代码转换。

1
考虑到我的用户将从DLL中使用此代码,相比我提出的第二种方法,有哪些好处???我的意思是从消费者的角度来看,他们需要输入更少吗???他们会获得更好的性能吗??? - george b
1
好处是相对于什么?泛型?你的第一个方法是不可能的,所以除非你想使用泛型,否则你必须使用第二个方法。 - D Stanley

6

您可以使用 元组(我不喜欢 ItemX 这种方式,但仍是一种选择)。 假设您需要一个方法来返回一个人对象、一个字符串和一个数字。那么您只需编写以下代码:

public static Tuple<Person, string, int> GetMyData()
{
    var person = GetPerson();
    var text = "Hello";
    var number = 2016;

    var result = Tuple.Create(person, text, number);
    return result;
}

调用方法并按以下方式访问返回的数据:
var data = GetMyData();
data.Item1; // person
data.Item2; // text
data.Item3; // number

在你的情况下,我会使用一个参数来指示要搜索的类型。
public Tuple<int, double, string> Search(searchPattern)
{
    if (serachPattern == "double")
    {
        double myDouble = SearchDouble();
        return Tuple.Create(0, myDouble, null);
    }

    // Handle other patterns here
}

使用方法:

var myDouble = Search("double").Item2;
var myString = Search("string").Item3;
var myInt = Search("int").Item1;

2

使用动态类型返回不同的数据值;


构建方法;

    internal static dynamic Get(System.String name){
      dynamic Result = null;
      //... if(name)... switch(name)...
      Result = 0;
      Result = false;
      Result = "use code logics to apply the required Result 'type'";
      Result = new System.Windows.Controls.Button();
      //...
      return Result;
    }

方法使用;

    System.String vartest1 = Get("make the method return String");
    System.Int32 vartest2 = Get("make the method return Int32");
    System.Boolean vartest3 = Get("make the method return Boolean");

1
为了将多个数据类型返回给C#方法,您也可以尝试一种方式,即将方法返回类型合并到一个方法中,并逐个检索它们。
请注意
   public ( int, double, string) Get(string name) {
             //...
             return (intValue, doubleValue, stringValue);
     } 
     // Once returned to the main method the code is disassembled into smaller code //variables
 public static void Main(string args[])  { 

          (int Ivals, double Dvals, string Svals) = Get(name);
          Console.WriteLine(Ivals);
          Console.WriteLine(Dvals);
          Console.WriteLine(Svals); 
} 

0

你可以将该方法泛型化,这是唯一的方法:

public T Get<T>(string name)
{
    ...
}

2
这不是唯一的方法,问题中的示例(编译通过的示例)也是有效的,而且更好,因为它可以限制返回类型的数量。顺便说一句,问题是哪种方式最安全,由于您的方式会对不支持的类型抛出运行时异常(或默认值,可能更糟),所以它绝对不是最安全的方法。 - neeKo

0
您可以使用以下方法:
public T GetT<T>(string name)
{
    // Code goes here
    return T;
}

因此,当您传递一个double时,您将得到一个double。当您传递一个int时,您将得到一个int等等。上述方法使用泛型来处理您的问题。有关泛型的文档,请在此处查看http://msdn.microsoft.com/en-us/library/ms379564%28v=vs.80%29.aspx


1
这是一个现有答案的副本。 - Servy
我开始回答这个问题的同时也在测试它。当我提交后,看到了其他的答案。如果这是一个问题的话,我可以删除它。 - Christos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接