天天看點

C#一個方法如何傳回多個值一、使用元組實作傳回多個值(ValueTuple和Tuple) 二、使用清單(list<T>)或數組實作傳回多個值 三、使用類或結構體傳回多個值 四、使用out參數實作

C#中,函數方法想傳回多個值,通過元組、清單、數組、類、結構體和out參數實作的方法及示例代碼。

一、使用元組實作傳回多個值(ValueTuple和Tuple)

1.1 使用ValueTuple實作

ValueTuple命名為元組(在C#7.1中可用),優點是它最簡潔,不可變且易于構造。

private (double first, double second) GetHeight()
{
   return (1,2);
}
var result = GetHeight();
Console.WriteLine($"{result.first}, {result.second}");
var (first, second) = GetHeight();
Console.WriteLine($"{first}, {second}");
           

1.2 使用Tuple實作

.NET Framework已經具有通用的Tuple類。但是,這些類有兩個主要限制。首先,Tuple類将其屬性命名為Item1,Item2,依此類推。這些名稱不包含語義資訊。使用這些元組類型不能實作傳達每個屬性的含義。新的語言功能使您可以為元組中的元素聲明和使用語義上有意義的名稱。

public Tuple<int, int> ViaClassicTuple()
{
   return new Tuple<int, int>(1,2);
}
var tuple = ViaClassicTuple();
Console.WriteLine($"{tuple.Item1}, {tuple.Item2}");
           

二、使用清單(list<T>)或數組實作傳回多個值

2.1 使用List清單實作

private List<double> GetHeight()
{
   return new List<double>(){1,2};
}
var result = GetHeight();
Console.WriteLine($"{result[0]}, {result[1]}");
           

2.2 使用數組實作

private double[] GetHeight()
{
      return new double[2]{ 1,2};
}
var result = GetHeight();
Console.WriteLine($"{result[0]}, {result[1]}");
           

三、使用類或結構體傳回多個值

3.1 使用類實作

public class SomeClass
{
   public int First { get; set; }
   public int Second { get; set; }
   public SomeClass(int first, int second)
   {
      First = first;
      Second = second;
   }
}
public SomeClass ViaSomeClass()
{
   return new SomeClass(1, 2);
}
var someClass = ViaSomeClass();
Console.WriteLine($"{someClass.First}, {someClass.Second}");
           

3.2 使用結構體實作

public struct ClassicStruct
{
   public int First { get; set; }
   public int Second { get; set; }
   public ClassicStruct(int first, int second)
   {
      First = first;
      Second = second;
   }
}
public ClassicStruct ViaClassicStruct()
{
   return new ClassicStruct(1, 2);
}
var classicStruct = ViaClassicStruct();
Console.WriteLine($"{classicStruct.First}, {classicStruct.Second}");
           

四、使用out參數實作

參數進行的任何操作都是在自變量上進行的。就像ref關鍵字一樣,除了ref要求在傳遞變量之前先對其進行初始化。它也類似于in關鍵字,除了in不允許調用的方法修改參數值。要使用out參數,方法定義和調用方法都必須顯式使用out關鍵字。

4.1 多個out參數實作

public bool ViaOutParams(out int first, out int second)
{
   first = 1;
   second = 2;
   return someCondition;
}
if(ViaOutParams(out var firstInt, out var secondInt))
   Console.WriteLine($"{firstInt}, {secondInt}");
           

4.2使用out ValueTuple實作

public bool ViaOutTuple(out (int first,int second) output)
{
   output = (1, 2);
   return someCondition;
}
if (ViaOutTuple(out var output))
   Console.WriteLine($"{output.first}, {output.second}");
           

4.3 用out關鍵字。

using System;
 
namespace test
{
    class Testout
    {
        public int getParts(double n, out double frac)
        {
            int whole;
 
            whole = (int)n;
 
            frac = n - whole; //pass fractional小數 part back through frac 
            return whole;     //return integer portion 傳回整數部分   
        }
    }
 
    class Useout
    {
        static void Main()
        {
            Testout Tout = new Testout();
 
            int i;
            double f;
 
            i = Tout.getParts(1234.56789, out f);
 
            Console.WriteLine("整數部分:" + i);
            Console.WriteLine("小數部分:{0:#.###}" , f);
            Console.WriteLine("小數部分:" + f);
            Console.ReadKey();  //監聽鍵盤事件,按任意鍵執行退出
        }
    }
}


 

  /// <summary>
    /// Ping指令檢測網絡是否暢通
    /// </summary>
    /// <param name="urls">URL資料</param>
    /// <param name="errorCount">ping時連接配接失敗個數</param>
    /// <returns></returns>
    public static bool MyPing(string[] urls, out int errorCount)
    {
        bool isconnected = true;
        System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping();
        errorCount = 0;
        try
        {
            PingReply pr;
            for (int i = 0; i < urls.Length; i++)
            {
                pr = ping.Send(urls[i]);
                if (pr.Status != IPStatus.Success)
                {
                    isconnected = false;
                    errorCount++;
                    Debug.LogFormat("目标伺服器{0}不可達,錯誤計數errorCount={1}", urls[i], errorCount);
                }
                // Console.WriteLine("Ping " + urls[i] + "    " + pr.Status.ToString());
                Debug.Log("Ping " + urls[i] + "    " + pr.Status.ToString());
            }
        }
        catch
        {
            isconnected = false;
            errorCount = urls.Length;
        }
        //if (errorCount > 0 && errorCount < 3)
        //  isconn = true;
        return isconnected;
    }
 
 
 
 
/// <summary>
    /// 檢測網絡連接配接狀态
    /// </summary>
    /// <param name="urls"></param>
    //public static void CheckServeStatus(string[] urls)
    public bool CheckNetStatus(string[] urls)
    {
 
        int errCount = 0;//ping時連接配接失敗個數
 
        //if (!LocalConnectionStatus())
        //{
        //    Console.WriteLine("網絡異常~無連接配接");
        //}
        if (!MyPing(urls, out errCount))
        {
            if ((double)errCount / urls.Length >= 0.3)
            {
                Debug.Log("網絡連接配接異常");
                return false;
                //Console.WriteLine("網絡異常~連接配接多次無響應");
            }
            else
            {
                Debug.Log("網絡連接配接正常");
                return true;
            }
        }
        else
        {
                Debug.Log("網絡連接配接正常");
            return true;
            //Console.WriteLine("網絡正常");
        }
    }