C# - 在函数中返回混合类型

Posted

技术标签:

【中文标题】C# - 在函数中返回混合类型【英文标题】:C# - Returning mixed types in a function 【发布时间】:2014-07-19 14:03:03 【问题描述】:

我有一些不同的数据类型需要在函数中处理。这些数据需要在函数中处理并作为我相信它被调用的对象返回。

这是我刚刚在这里编写的一些未经测试的代码,但我认为它显示了我正在尝试做的事情.. 我希望你们能帮助我如何去做。

private void Button_Click(object sender, RoutedEventArgs e)

     // Here im calling the function which returns data to the object
     object thoseProcessedData = SomeTestObject(5, "ABC", SomeOtherThing);

     // When returned i want to be able to use the different data like so. 
     string useItLikeThis = thoseProcessedData.newString;
     int numbersLikeThis = thoseProcessedData.newNumber;


public object SomeTestObject(int numbers, string letters, AnotherType anothertype)


     string newString = letters.Substring(0,5);
     int newNumber = numbers + 10;
     AnotherType newType = anothertype.Something();

     return processedData;

如果这是一个太愚蠢的问题,请大家不要杀我。我对 C# 还是很陌生 ..

如果你不明白我想要做什么,请询问!由于我的英语不是最好的,所以我认为这种方式最能向您展示我想要的东西..

【问题讨论】:

C# 是静态类型的。这意味着您声明的类型会对编译器允许您编写的内容产生巨大的影响。在这里,SomeTestObject 返回object。为什么它返回 object 而不是其他类型? 不知道为什么投反对票。 OP 中有清晰的示例代码向我们展示了他们想要什么,而且英语很好。似乎也有 5 个答案.. 所以这个问题并不像一个人想象的那样不清楚。 +1 【参考方案1】:

创建包含您要传递和返回的数据的类:

public class Data

   public string Letters  get; set; 
   public int Number  get; set; 
   public AnotherType Thing  get; set; 

将其传递给方法:

var data = new Data  Letters = "ABC", Number = 5, Thing = SomeOtherThing ;
DoSomething(data);
// here data will have modified values

因此类是一个reference type,在DoSomething 方法中对其成员的所有更改都会反映在您的data 对象引用中。因此,更改可能如下所示:

public void DoSomething(Data data)

     data.Letters = data.Letters.Substring(0,5);
     data.Number += 10;
     data.Thing.Something();

【讨论】:

+1 最重要的事情之一,尤其是对于初学者来说,就是要让代码具有可读性。将数据封装到一个类型中,给定一个合适的名称,对于使代码自我记录大有帮助。 @Jay 谢谢!坦率地说,这不是最好的名字,但我从给出的信息中做得最好:) 无论如何,具有描述性名称和描述性成员名称的数据类型比带有 Item1、Item2 等的元组要好得多 :) 想出名字肯定很难 :) 如果你真的不打算使用元组,我只会建议元组,除非它作为返回值。我只是将它作为“最快”的方法包含在我的答案中,即使那样你也应该知道你在做什么(诚然,新程序员很少这样做)。对于 Tuple 的意图(替换小的、丢弃的类型类),它做得很好(当然同时降低了可读性)。【参考方案2】:

嗯,你在正确的轨道上(除了使用 object 关键字/类)! object 类是 C# 中每个引用类型的基类,它有 3 或 4 个函数,没有属性。你很少会直接使用这个类。

最简单的方法是使用Tuple

这看起来像:

public Tuple<string, int, AnotherType> SomeTestObject(
    int numbers, string letters, AnotherType anothertype)

     string newString = letters.Substring(0,5);
     int newNumber = numbers + 10;
     AnotherType newType = anothertype.Something();

     return Tuple.Create(newString, newNumber, newType);

但是,如果这将在其他地方使用、传递等等,您应该创建一个单独的对象,填充它,然后返回它。

public MyDataClass SomeTestObject(
     int numbers, string letters, AnotherType anothertype)

     string newString = letters.Substring(0,5);
     int newNumber = numbers + 10;
     AnotherType newType = anothertype.Something();

     return new MyDataClass(newString, newNumber, newType);


//Somewhere else, probably another file
public class MyDataClass

    public string StringData get; set;
    public int NumberData get; set;
    public AnotherType ObjectData get; set;

    public MyDataClass(string myString, int, myNumber, AnotherType myObject)
    
        StringData = myString;
        NumberData = myNumber;
        ObjectData = myObject;
    

MSDN 为:

Tuple

Object

【讨论】:

嗯,我认为在其他地方使用并不是从元组切换到自定义类的唯一原因——代码的可维护性对我来说是第一位的。数据类型应该是清晰的和自我描述的。否则,您需要进入方法以了解 Item2 中传递的内容(做了几次,不太喜欢那样)所以,自定义类 +1 :)【参考方案3】:

创建一个类来表示该数据:

public class ProcessedData

     public string NewString get; set;
     public int NewNumber get; set;
     public AnotherType NewType get; set;

然后填充该类的一个实例并返回它:

private void Button_Click(object sender, RoutedEventArgs e)

     // Here im calling the function which returns data to the object
     ProcessedData thoseProcessedData = SomeTestObject(5, "ABC", SomeOtherThing);

     // now you can access those properties 
     string useItLikeThis = thoseProcessedData.NewString;
     int numbersLikeThis = thoseProcessedData.NewNumber;


public ProcessedData SomeTestObject(int numbers, string letters, AnotherType anothertype)

     ProcessedData processedData = new ProcessedData();

     processedData.newString = letters.Substring(0,5);
     processedData.newNumber = numbers + 10;
     processedData.newType = anothertype.Something();

     return processedData;

有一些机制(匿名类型,dynamic)可以可能在运行时动态“查找”属性,但定义一个类并静态键入返回类型是 >到目前为止更安全。

【讨论】:

我可能会使用值对象(即保持属性设置器私有) - 然后返回 ProcessedData 的新实例会更合理)【参考方案4】:

首先,你的英语很好。别担心 :)

其次,您要做的只是创建一个具有这些属性的类。

class YourClass 
    public string NewString  get; set; 
    public int NewNumber  get; set; 

然后从你的方法中返回一个实例:

 return new YourClass() 
     NewString = letters.Substring(0, 5),
     NewNumber = numbers + 10
 ;

【讨论】:

【参考方案5】:

为此,您可以创建一个简单的类。

public class Data

    public string NewString  get; set; 
    public int NewNumber  get; set; 

然后你可以从一个方法中返回它。

Data ReadData() 

    return new Data  
        NewString = CalculateNewString(), 
        NewNumber = CalclulateNewNumber() 
    ;

【讨论】:

【参考方案6】:

当您需要返回多个值时,您需要创建自己的类。一个类(除其他外)封装或“打包在一起”一个或多个数据。这是一个例子:

public class MyCustomClass 
    public int MyCustomInt  get; set; 
    public string MyCustomString  get; set; 
    public bool MyCustomYesNo  get; set; 

这个类包含三个属性。属性包含可以读取(获取)或写入(设置)的数据。您现在可以编写一个返回此属性实例的函数:

public MyCustomClass MyFunction()

    return new MyCustomClass() 
        MyCustomInt = 15, MyCustomString = "Hello World!",
        MyCustomYesNo = true
    ;

这个函数将创建我们MyCustomClass 的一个新实例,并用值填充每个属性。现在你可以这样称呼它:

MyCustomClass myVar = MyFunction();
int myInt = myVar.MyCustomInt; // Contains 15
string myString = myVar.MyCustomString; // Contains "Hello World!"
bool myYesNo = myVar.MyCustomYesNo;  // Contains true

当然,你的函数可以做任何它想做的事情。我只是提供一个例子。 希望这是有道理的!

【讨论】:

以上是关于C# - 在函数中返回混合类型的主要内容,如果未能解决你的问题,请参考以下文章

C#函数的使用方法

C#怎么定义泛型集合类型的函数,返回一个集合

C#中如何为一个有返回值的函数添加新线程

怎样在C#中调用DLL中的函数,最好有代码和详细说明

在ASP.NET(C#)中,return的作用是啥,是退出当前过程,还是退出网页的所有程序呢。

用C++封装了Halcon的算法,返回值为Hobject类型,在C#中调用dll怎么用Hobject类型的返回值。