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

C#-在函数中返回混合类型,c#,object,return,C#,Object,Return,我需要在函数中处理一些不同的数据类型。这些数据需要在函数中处理,并作为一个对象返回,我相信它是被调用的 这是我刚刚在这里编写的一些未经测试的代码,但我认为它显示了我试图做的事情。。我希望你们能帮我解决这个问题 private void Button_Click(object sender, RoutedEventArgs e) { // Here im calling the function which returns data to the object object t

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

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

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#还是很陌生


如果你不明白我想做什么,请问!因为我的英语不是最好的,所以我想用这种方式向你展示我想要的东西是最好的

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

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

class YourClass {
    public string NewString { get; set; }
    public int NewNumber { get; set; }
}
然后从您的方法中返回此方法的实例:

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

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

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
)可以在运行时动态地“查找”属性,但是定义一个类并静态地键入返回类型要安全得多。

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

public class Data
{
    public string NewString { get; set; }
    public int NewNumber { get; set; }
}
然后可以从方法返回它

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

好吧,你的思路是正确的(除了使用
对象
关键字/类)!
对象
类是C#中每个引用类型的基类,它有3或4个函数,没有属性。您很少直接使用这个类

最简单的方法是使用
元组

这看起来像:

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 void DoSomething(Data data)
{
     data.Letters = data.Letters.Substring(0,5);
     data.Number += 10;
     data.Thing.Something();
}
MSDN适用于:


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

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
因此,类是一个类,DoSomething方法中对其成员的所有更改都将反映在您的
数据
对象引用中。因此,更改可以如下所示:

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 void DoSomething(Data data)
{
     data.Letters = data.Letters.Substring(0,5);
     data.Number += 10;
     data.Thing.Something();
}

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

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
当然,你的函数可以做任何它想做的事情。我只是举个例子。
希望这有意义

C#是静态类型的。这意味着您声明的类型对编译器允许您编写或不允许编写的内容有很大的影响。这里,
SomeTestObject
返回
object
。为什么它返回
object
,而不是其他类型?不确定为什么是downvote。有明确的例子代码与OP向我们展示了他们想要什么,英语是好的。似乎还有5个答案。。所以这个问题并不像一个人认为的那么清楚+1+1最重要的事情之一,尤其是对于初学者来说,就是要养成代码可读的心态。将数据封装到一个类型中,并给出一个合适的名称,这将大大有助于使代码自我记录。@Jay谢谢!坦率地说,这不是最好的名称,但我从给出的信息中做得最好:)无论如何,具有描述性名称的数据类型和描述性成员名称要比具有Item1、Item2等的元组好得多:)提出名称肯定很难:)如果你真的不打算使用元组,我只建议使用元组,除非将其用作返回值。我只是把它作为“最快”的方法包含在我的答案中,即使这样,你也应该知道你在做什么(不可否认,一个新的程序员很少这样做)。对于Tuple打算做的事情(替换小的、一次性的类型类),它做得相当好(当然,它降低了可读性)。好吧,我认为在其他地方使用不是从Tuple切换到自定义类的唯一原因——代码的可维护性对我来说是第一位的。数据类型应清晰且自描述性。否则,您需要进入方法以了解在Item2中传递的内容(多次这样做,我不太喜欢这样做),因此,+1表示自定义类:)我可能会使用值对象(即保持属性设置器私有)-然后返回ProcessedData的新实例将更合理)