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

C# 如何从一个方法返回多个变量?,c#,.net,winforms,C#,.net,Winforms,此方法仅返回进程文件名: public static string GetProcessInfo(IntPtr hwnd) { uint pid = 0; GetWindowThreadProcessId(hwnd, out pid); Process proc = Process.GetProcessById((int)pid); return proc.MainModule.FileName.ToString(); } 但我还想返回进程名称: proc.Pr

此方法仅返回进程文件名:

public static string GetProcessInfo(IntPtr hwnd)
{
    uint pid = 0;
    GetWindowThreadProcessId(hwnd, out pid);
    Process proc = Process.GetProcessById((int)pid);
    return proc.MainModule.FileName.ToString();
}
但我还想返回进程名称:

proc.ProcessName;

您可以创建并返回描述结果的对象:

public class ProcessInfo
{
    public string ProcessName { get; set; }
    public string FileName { get; set; }
}

public ProcessInfo GetProcessInfo(IntPtr hwnd)
{
    uint pid = 0;
    GetWindowThreadProcessId(hwnd, out pid);
    Process proc = Process.GetProcessById((int)pid);

    return new ProcessInfo 
    {
        FileName = proc.MainModule.FileName.ToString(),
        ProcessName = proc.ProcessName
    }
 }
或者(我个人不太喜欢这个),一个
元组

公共元组GetProcessInfo(IntPtr hwnd)
{
uint-pid=0;
GetWindowThreadProcessId(hwnd,输出pid);
Process proc=Process.GetProcessById((int)pid);
返回Tuple.Create(proc.MainModule.FileName.ToString(),
进程名称);
}

既然两者都是
字符串
,不如返回一个
元组

public static Tuple<string, string> GetProcessInfo(IntPtr hwnd)
{
    uint pid = 0;
    GetWindowThreadProcessId(hwnd, out pid);
    Process proc = Process.GetProcessById((int)pid);
    Tuple<string, string> t = new Tuple<string, string>
    (
         proc.MainModule.FileName,
         proc.ProcessName
    );
    return t;
}
公共静态元组GetProcessInfo(IntPtr hwnd)
{
uint-pid=0;
GetWindowThreadProcessId(hwnd,输出pid);
Process proc=Process.GetProcessById((int)pid);
Tuple t=新的Tuple
(
proc.MainModule.FileName,
进程名
);
返回t;
}

最后一个选项将使用out参数:

public voidstring GetProcessInfo(IntPtr hwnd, out string fileName, out string processName{
    uint pid = 0;
    GetWindowThreadProcessId(hwnd, out pid);
    Process proc = Process.GetProcessById((int)pid);
    fileName = proc.MainModule.FileName.ToString();
    processName = proc.ProcessName;
}

我相信你有四个选择(按优先顺序)

  • 直接返回
    proc.MainModule
    ,并从调用者提取必要的信息

您可以将返回类型更改为
过程

    public static Process GetProcessInfo(IntPtr hwnd)
    {
        uint pid = 0;
        GetWindowThreadProcessId(hwnd, out pid);
        return Process.GetProcessById((int)pid);
     }
然后从返回的对象中获取所需的数据:

var proc = GetProcessInfo(hwnd);
var processName = proc.ProcessName;
var moduleFileName = proc.MainModule.FileName.ToString();

out
params。。2002年就是这样;P@Yuval伊扎科夫:是的。这是一个丑陋的选择,但语言允许这样做。我永远不会这么做,只是提到它来涵盖所有选项。元组方法在早期开发中非常好,但我同意它应该在工作时重构为显式类。@DavidArno我讨厌(目前)在C#中使用元组。我希望他们在C#7.0中得到更好的支持。目前它们完全不可读,使代码看起来像垃圾。 public class ProcessInformation { public string FileName; public string ProcessName; } public static ProcessInformation GetProcessInfo(IntPtr hwnd) { uint pid = 0; GetWindowThreadProcessId(hwnd, out pid); Process proc = Process.GetProcessById((int)pid); var pi = new ProcessInformation { proc.MainModule.FileName, proc.MainModule.ProcessName } return pi; } public static Tuple<string, string> GetProcessInfo(IntPtr hwnd) { uint pid = 0; GetWindowThreadProcessId(hwnd, out pid); Process proc = Process.GetProcessById((int)pid); return return Tuple.Create(proc.MainModule.FileName,proc.MainModule.ProcessName); } string GetProcessInfo(IntPtr hwnd, out fileName, out processName)
    public static Process GetProcessInfo(IntPtr hwnd)
    {
        uint pid = 0;
        GetWindowThreadProcessId(hwnd, out pid);
        return Process.GetProcessById((int)pid);
     }
var proc = GetProcessInfo(hwnd);
var processName = proc.ProcessName;
var moduleFileName = proc.MainModule.FileName.ToString();