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

Man*_*hia 4 .net c# 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();
}
Run Code Online (Sandbox Code Playgroud)

但是我想要返回进程名称:

proc.ProcessName;
Run Code Online (Sandbox Code Playgroud)

Cla*_*edi 8

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

  • proc.MainModule直接返回并从调用者中提取必要的信息.
public static ProcessModule GetProcessInfo(IntPtr hwnd)
{
    uint pid = 0;
    GetWindowThreadProcessId(hwnd, out pid);
    Process proc = Process.GetProcessById((int)pid);
    return proc.MainModule;
}
  • 创建一个包含两个值的类并返回该值
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;
}
  • 从方法中返回一个元组 Tuple<string, string>
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);
}
  • out在你的方法上创建2个参数(我从未见过实现过两个参数,我不鼓励这个,因为它确实有气味,但它是C#提供的一个选项)
string GetProcessInfo(IntPtr hwnd, out fileName, out processName)

  • `out` params ..就是2002年; P (2认同)

Yuv*_*kov 5

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

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
    }
 }
Run Code Online (Sandbox Code Playgroud)

或者(我个人更喜欢这个),a Tuple<string, string>:

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

    return Tuple.Create(proc.MainModule.FileName.ToString(),
                        proc.ProcessName);
}
Run Code Online (Sandbox Code Playgroud)