C# 如何从一个方法返回多个值?

C# 如何从一个方法返回多个值?,c#,C#,我想从C#中的方法返回年龄值,如下所示 private int UpdateAges( int age1, int age2, int age3, int age4) { age1++; age2++; age3++; age4++; return (age1, age2, age3, age4); } MessageBox.Show(UpdateAges(45, 30, 45, 30).ToString()); 我可以像下面这样使用它 priv

我想从C#中的方法返回年龄值,如下所示

private int UpdateAges( int age1,  int age2,  int age3,  int age4)
{
    age1++;
    age2++;
    age3++;
    age4++;
    return (age1, age2, age3, age4);
}
MessageBox.Show(UpdateAges(45, 30, 45, 30).ToString());
我可以像下面这样使用它

private int UpdateAges( int age1,  int age2,  int age3,  int age4)
{
    age1++;
    age2++;
    age3++;
    age4++;
    return (age1, age2, age3, age4);
}
MessageBox.Show(UpdateAges(45, 30, 45, 30).ToString());
试试这个:

private Tuple<int, int, int, int> UpdateAges( int age1,  int age2,  int age3,  int age4)
{
    age1++;
    age2++;
    age3++;
    age4++;

    return Tuple.Create(age1, age2, age3, age4);
}
私有元组更新(int-age1、int-age2、int-age3、int-age4)
{
年龄1++;
年龄2++;
年龄3++;
年龄4++;
返回Tuple.Create(年龄1、年龄2、年龄3、年龄4);
}

另请参见:about

如果只想在消息框中显示结果,则返回字符串:

private string UpdateAges(int age1, int age2, int age3, int age4)
{
    age1++;
    age2++;
    age3++;
    age4++;
    return "age1 = " + age1 + ", age2 = " + age2 + ", age3 = " + age3 + ", age4 = " + age4;
}

MessageBox.Show(UpdateAges(45, 30, 45, 30));
如果还希望在显示的消息框后更新年龄值,请为每个参数添加ref关键字

private string UpdateAges(ref int age1, ref int age2, ref int age3, ref int age4)
{
    age1++;
    age2++;
    age3++;
    age4++;
    return "age1 = " + age1 + ", age2 = " + age2 + ", age3 = " + age3 + ", age4 = " + age4;
}

MessageBox.Show(UpdateAges(ref age1, ref age2, ref age3, ref age4));

您也可以像这样使用'out int'

private void UpdateAges(int IAge1, int IAge2, int IAge3, int IAge4, out int OAge1, out int OAge2, out int OAge3, out int OAge4)
{
    OAge1 = IAge1++;
    OAge2 = IAge2++;
    OAge3 = IAge3++;
    OAge4 = IAge4++;
}
UpdateAges( Age1, Age2, Age3, Age4, out Age1, out Age2, out Age3, out Age4 );
当你调用这个时,你需要像这样使用

private void UpdateAges(int IAge1, int IAge2, int IAge3, int IAge4, out int OAge1, out int OAge2, out int OAge3, out int OAge4)
{
    OAge1 = IAge1++;
    OAge2 = IAge2++;
    OAge3 = IAge3++;
    OAge4 = IAge4++;
}
UpdateAges( Age1, Age2, Age3, Age4, out Age1, out Age2, out Age3, out Age4 );
请参阅—

从函数返回多个值的方法很少

  • 参考参数
  • 输出参数
  • 返回数组
  • 返回类/结构类型的对象--这是我们通常遵循的方法
  • 返回元组
  • -在C#7中,由于
    元组类型
    元组文字
    ,您可以从一个方法返回多个值

    (int, int, int, int) UpdateAges(int age1,  int age2,  int age3,  int age4) // tuple return type
    {   
        age1++;
        age2++;
        age3++;
        age4++;
    
        return (age1, age2, age3, age4);
    }
    
    使用:

    使用元组:

    private Tuple<int, int, int, int> UpdateAges(int age1, int age2, int age3, int age4)
    {
        age1++;
        age2++;
        age3++;
        age4++;
    
        return Tuple.Create(age1, age2, age3, age4);
    }
    
    私有元组更新(int-age1、int-age2、int-age3、int-age4)
    {
    年龄1++;
    年龄2++;
    年龄3++;
    年龄4++;
    返回Tuple.Create(年龄1、年龄2、年龄3、年龄4);
    }
    
    您可以通过多种方式解决此问题

  • 使用元组

    private Tuple<int, int, int, int> UpdateAges(int age1, int age2, int age3, int age4)
    {
        return Tuple.Create(++age1, ++age2, ++age3, ++age4);
    }
    
  • 使用参考参数

    private List<int> UpdateAges(ref int age1, ref int age2, ref int age3, ref int age4)
    {
        age1++;
        age2++;
        age3++;
        age4++;
    }
    
    私有列表更新(ref-int-age1、ref-int-age2、ref-int-age3、ref-int-age4)
    {
    年龄1++;
    年龄2++;
    年龄3++;
    年龄4++;
    }
    

  • 如何使用列表执行此操作:

    private static List<int> UpdateAges(int age1, int age2, int age3, int age4)
    {
        return new List<int> { ++age1, ++age2, ++age3, ++age4 };
    }
    
    好的,希望有帮助。

    1。使用out:

    private Tuple<int, int, int, int> UpdateAges(int age1, int age2, int age3, int age4)
    {
        age1++;
        age2++;
        age3++;
        age4++;
    
        return Tuple.Create(age1, age2, age3, age4);
    }
    
    2。Usng KeyValuePair:

    private Tuple<int, int, int, int> UpdateAges(int age1, int age2, int age3, int age4)
    {
        age1++;
        age2++;
        age3++;
        age4++;
    
        return Tuple.Create(age1, age2, age3, age4);
    }
    
    静态KeyValuePair更新(年龄1、年龄2)
    {
    返回新的KeyValuePair(age1++,age2++);
    }
    国际年龄1;
    国际年龄2;
    var对=GetTwoNumbers(年龄1,年龄2);
    控制台写入线(配对键);
    控制台写入线(对值);
    
    3。使用元组:

    static Tuple<int, int> UpdateAges(age1, age2)
    {
        return new Tuple<int, int>(age1++, age2++);
    }
    
    int age1;
    int age2;
    var tuple = UpdateAges(age1,age2);
    int a = tuple.age1;
    int b = tuple.age2;
    
    静态元组更新(年龄1、年龄2)
    {
    返回新元组(age1++,age2++);
    }
    国际年龄1;
    国际年龄2;
    var tuple=UpdateAges(年龄1,年龄2);
    int a=tuple.age1;
    int b=tuple.age2;
    
    虽然您可以使用
    Tuple
    ref
    来实现所需,但我不确定这是否是您的最佳实践

    您可以使用专用类封装所有逻辑:

    public class Ages
    {
        public int Age1 { get; set; }
        public int Age2 { get; set; }
        public int Age3 { get; set; }
        public int Age4 { get; set; }
    
        private void UpdateAges()
        {
            this.Age1++;
            this.Age2++;
            this.Age3++;
            this.Age4++;
        }
    
        private string ToString() => 
            $"Age1 = {this.age1}, Age2 {this.age2}, Age3 = {this.age3}, Age4 {age4}";
    }
    
    这样,与处理年龄相关的所有内容都放在一个地方,并且可以跨代码重用

    当然,您可以更进一步,用
    列表或数组替换“age”属性

    public class Ages
    {
        public int[] Ages { get; }
    
        public Ages (params int[] ages)
        {
            this.Ages = ages;
        }
    
        private void UpdateAges() =>
            for (int i = 0; i < this.Ages.Length; i++) this.Ages[i]++;
    
        private string ToString() =>  
            string.Join(", ", 
                this.Ages.Select((age, i) => $"Age{i} = {age}"));
    }
    
    
    var ages = new Ages(31, 40, 12, 18);
    ages.UpdateAges();
    MessageBox.Show(ages.ToString());
    
    公共课年龄
    {
    公共int[]年龄{get;}
    公共年龄(参数int[]年龄)
    {
    这个。年龄=年龄;
    }
    私有void UpdateAges()=>
    对于(inti=0;i
    string.Join(“,”,
    Select((age,i)=>$“age{i}={age}”);
    }
    变量年龄=新年龄(31,40,12,18);
    ages.UpdateAges();
    Show(ages.ToString());
    带有方法参数的
    , 您可以传递在可枚举、列表数组等中返回的任意数量的参数。
    灵活调用
    Increment(1,2,3),
    Increment(1,2)
    Increment(myIntArray)
    Increment(1)`

    对于显示器,您可以使用<代码>字符串.连接(“,”结果)


    iEnumerable,tuple,你自己的类。。。有很多选择。将“private int”替换为“private(int,int,int,int)”如果你没有团队负责人或其他人指导你,我建议你阅读编程书籍,阅读开源(c#/java)代码,并学习如何编写代码。对于您的情况,您如何处理结果?您是否使用这些值?或者将它们转发给另一个函数?真正的答案需要更多的信息,技术上的答案应该是元组,或者创建“holder类”,然后返回一个包含这4个int值的类。命名元组更甜。KeyValuePair不应像元组那样使用。age1怎么可能是age2的键?@Emaro它是用来定义age1-like键和age2-like值的。我知道它是如何工作的。然而,它在语义上被滥用,我认为这是不好的做法。值元组
    (inta1,inta2)
    将是一个更好的选择。此解决方案不必要且复杂<代码>无效更新(out int i)=>i++就足够了(例如,您只需要out变量,不需要将参数数量增加一倍)@Emaro,是的,我知道。op code
    更新(45,30,45,30)
    立即敲响此铃。只是忘了把它包括在答案里。谢谢你。更新答案以使其清晰
    static IEnumerable<int> Increment(params int[] args)
    {
        return args.Select(x => x + 1);
    }
    
    var result = Increment(45, 30, 45, 30);
    // {46, 31, 46, 31}
    
    static void Main(string[] args)
    {
        var uniqueValue = 99;
        var multipleValues = new[] { 1, 2, 6 };
    
    
        var uvResult = Increment(uniqueValue);
        var mvResult = Increment(multipleValues);
    
    
        Console.WriteLine($"uniqueValue = {uniqueValue}  => {string.Join(", ",uvResult)}");
        Console.WriteLine($"multipleValues = {string.Join(", ",multipleValues)}  => {string.Join(", ",multipleValues)}");
    
    }