在C#中返回多个值的5种方法实例讲解

作者:微信公众号:【架构师老卢】
4-18 7:47
289

在本文中,我们将探讨在 C# 中创建返回多个值的函数的高级策略。我们将深入探讨各种技术,例如使用元组、输出参数、值元组、自定义类/结构、ref 返回、模式匹配、异步方法、记录、动态对象、泛型、扩展方法、局部函数和丢弃。每种方法都提供了处理多个返回值的独特方法,从而在代码中提供了灵活性和效率。

使用Tuples

C# 中的元组提供了一种返回多个值的方法,而无需定义新的类或结构。让我们浏览一个示例,该示例展示了如何使用元组来计算和返回两个数字的总和和乘积:

public (int Sum, int Product) Calculate(int a, int b)  
{  
    return (a + b, a * b);  
}// How to use tuples  
var result = Calculate(2, 3);  
Console.WriteLine($"Sum: {result.Sum}, Product: {result.Product}");

在上面的代码中,该函数使用元组有效地返回输入数字的总和和乘积。元组提供了一种简洁明了的方法,用于在单个数据结构中处理多个返回值。Calculate

例子:

考虑一个场景,您需要计算电子商务应用程序中产品的总价格和税费。通过使用元组,可以从计算函数返回这两个值,而无需创建自定义类或结构的开销。

代码说明:

  • 该方法采用两个整数并作为输入参数。Calculateab
  • 它计算 和 使用的总和以及使用的产品。aba + ba * b
  • 然后将结果作为元组返回,其中对应于输入数字的总和,并表示它们的乘积。(Sum, Product)SumProduct
  • 当使用值 和 调用函数时,返回的元组存储在变量中。Calculate23result
  • 最后,该语句显示使用 和 从元组中提取的总和值和乘积值。Console.WriteLineresult.Sumresult.Product

通过在 C# 代码中利用元组,可以高效、优雅地简化返回多个值的过程。

Out Parameters

在某些情况下,有必要在方法的主返回值旁边返回其他信息。这就是 C# 中的参数被证明是有价值的地方。让我们浏览一个实际示例,该示例涉及一个分析日期字符串并使用参数返回对象的方法:outDateTimeout

public bool TryParseDate(string dateString, out DateTime date)  
{  
    return DateTime.TryParse(dateString, out date);  
}

// How to utilize out parameters  
if (TryParseDate("2024-02-19", out DateTime resultDate))  
{  
    Console.WriteLine($"Parsed Date: {resultDate.ToShortDateString()}");  
}  
else  
{  
    Console.WriteLine("Invalid Date");  
}

在提供的代码片段中,该函数旨在尝试分析给定的日期字符串,并通过参数返回相应的对象。TryParseDateDateTimeout

例子:

想象一下,在财务应用程序中,需要验证用户输入,包括日期条目。通过使用参数返回分析的日期,应用程序可以确保日期格式正确且可供进一步处理。out

代码说明:

  • 该方法采用一个参数,表示变量中的日期。TryParseDatestringdateString
  • 该方法尝试使用 将输入字符串解析为对象。DateTimeDateTime.TryParse
  • 通过名为 的参数返回解析的日期结果,该方法返回一个布尔值,指示解析操作成功。outdate
  • 在用法示例中,使用 date 字符串调用函数,并在变量中检索分析后的值。TryParseDate"2024-02-19"DateTimeresultDate
  • 如果解析成功,则使用 显示解析的日期。否则,将显示“无效日期”消息。resultDate.ToShortDateString()

在 C# 中使用参数有助于从方法返回其他信息,并增强需要多个返回值的代码的灵活性和功能。out

Using ValueTuple for More Flexibility

C# 中的 ValueTuple 为处理元组操作(包括解构)提供了增强的多功能性。让我们深入研究一个实用的例子,通过创建一个函数来演示 ValueTuple 的实用性,该函数提供结构中几何形状的尺寸:ValueTuple

public (int, int) GetDimensions()  
{  
    return (1024, 768);  
}

// Deconstruction of ValueTuple  
var (width, height) = GetDimensions();  
Console.WriteLine($"Width: {width}, Height: {height}");

在提供的代码段中,我们定义一个来表示形状的尺寸,展示了如何解构元组以有效地访问单个宽度和高度值。ValueTuple

例子:

考虑一个图像处理应用程序,其中需要检索和操作不同的图像大小。通过使用 ValueTuple 返回宽度和高度维度,开发人员可以无缝地提取这些值并将其用于各种图像处理任务。

代码说明:

  • 该方法用于返回表示形状尺寸的 a,在本例中指定为 (1024, 768)。GetDimensionsValueTuple
  • 通过解构,从返回的宽度和高度值中提取并分别分配给变量和。ValueTuplewidthheight
  • 然后使用 显示提取的宽度和高度值,以准确呈现形状的尺寸。Console.WriteLine

通过在 C# 编程中利用 ValueTuple,可以简化元组操作的处理,例如返回多个值并解构它们,以便于访问和操作。此功能有助于提高代码的可读性,并增强使用元组数据结构的灵活性。

返回自定义类或结构

在处理错综复杂的互连数据集时,创建自定义类或结构可以增强代码的清晰度和组织性。让我们深入研究一个示例,在该示例中,我们定义了一个自定义类,该类被命名为封装计算结果:OperationResult

public class OperationResult  
{  
    public int Sum { get; set; }  
    public int Product { get; set; }  
}

public OperationResult PerformCalculation(int a, int b)  
{  
    return new OperationResult { Sum = a + b, Product = a * b };  
}

// Utilizing the Custom Class  
var result = PerformCalculation(5, 4);  
Console.WriteLine($"Sum: {result.Sum}, Product: {result.Product}");

在呈现的代码片段中,我们创建了一个带有属性的自定义类,用于存储计算操作产生的总和和乘积值。OperationResult

例子:

想象一下,在银行应用程序中,需要对用户投资进行利息计算。通过使用自定义类(如管理和返回计算结果)来管理计算结果,代码变得更加结构化且更易于维护。OperationResult

代码说明:

  • 该类使用属性定义,用于保存计算的总和和乘积值。OperationResultSumProduct
  • 该方法计算两个输入整数的总和 () 和乘积 (),并返回使用这些值初始化的类的实例。PerformCalculationa + ba * bOperationResult
  • 使用输入 和 调用函数时,返回的对象包含计算的总和和乘积值。PerformCalculation54result
  • 该语句显示从对象中提取的总和值和乘积值,并显示自定义类中多个返回值的封装。Console.WriteLineresult

通过利用自定义类或结构来管理和返回复杂的数据结构,开发人员可以提高代码的可读性和可维护性,尤其是在处理多方面的计算结果时。

使用 Ref Return 和 Ref Locals

在需要直接修改数据而不进行不必要的复制的情况下,C# 提供了 ref 返回和 ref 局部变量的概念。让我们来探讨一个实际示例,该示例演示了如何使用 ref returns 在数组中查找和返回对特定名称的引用:

public ref string FindName(string[] names, string target)  
{  
    for (int i = 0; i < names.Length; i++)  
    {  
        if (names[i] == target)  
        {  
            return ref names[i]; // Return a reference to the array element  
        }  
    }    throw new Exception("Name not found");  
}

// How to apply ref return and ref locals  
string[] names = { "Alice", "Bob", "Charlie" };  
ref string foundName = ref FindName(names, "Bob");  
foundName = "Bobby"; // Directly modifies the array  
Console.WriteLine(string.Join(", ", names)); // Outputs: Alice, Bobby, Charlie

在上面的代码段中,该方法在数组中搜索特定名称,并返回对该元素的引用,以允许直接操作数组内容。FindName

例子:

考虑一个任务管理应用程序,用户可以在其中更新任务的状态。使用 ref 返回可以促进对任务属性的快速直接更新,而无需额外的内存开销。

代码说明:

  • 该函数在数组中搜索目标名称,并使用关键字返回对匹配元素的引用。FindNamenamesref
  • 如果找到目标名称,则返回对该数组元素的引用以进行直接修改。
  • 在实际实现中,名称“Bob”位于数组中,并且通过方法将对此元素的引用分配给该元素。namesfoundNameFindName
  • 更新为“Bobby”会直接修改数组元素,从而显示 ref 返回对数据结构的直接影响。foundName
  • 该语句显示更新的数组元素,演示对数组内容的直接修改。Console.WriteLine

通过在 C# 中利用 ref returns 和 ref locals,开发人员可以有效地管理和更新数据结构,从而在处理大型数据集时提高性能并减少内存消耗。

实现这些方法不仅增强了代码的可读性和可维护性,而且在处理多个返回值方面提供了灵活性和效率。对于开发人员来说,了解每种技术的优势和用例以在项目中有效利用它们至关重要。

相关留言评论
昵称:
邮箱:
阅读排行