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

时间:2014-05-29 22:17:43

标签: c# object return

我有一些不同的数据类型需要在函数中执行某些操作。这些数据需要在函数中处理并作为一个对象返回,我相信它被称为。

这是我刚刚在这里写的一些没有经过测试的代码,但我认为它显示了我想要做的事情..我希望你们能帮我解决这个问题。

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#的新手..

如果你没有得到我想做的事,请问!因为我的英语不是最好的我认为这样会最好地向你展示我想要的东西..

6 个答案:

答案 0 :(得分:3)

嗯,你走在正确的轨道上(除了使用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 For:

Tuple

Object

答案 1 :(得分:3)

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

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();
}

答案 2 :(得分:2)

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

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)可以使成为可能动态地找到&#34;运行时的属性,但定义一个类并静态键入返回类型到目前为止更安全。

答案 3 :(得分:0)

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

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

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

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

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

答案 4 :(得分:0)

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

public class Data
{
    public string NewString { get; set; }
    public int NewNumber { get; set; }
}

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

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

答案 5 :(得分:0)

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

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

此类包含三个属性。属性包含可以从(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

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