How can I return more than one variable from a method?

This method returns only the process file name:

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

But I also want to return the process name:

proc.ProcessName;
+4
source share
5 answers

You can create and return an object that describes your result:

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
    }
 }

Or (I personally like it less) 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);
}
+5
source

I believe you have four options (in order of preference)

  • Return proc.MainModuledirectly and extract the necessary information from the caller.
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);
}
  • 2 out ( , , , #)
string GetProcessInfo(IntPtr hwnd, out fileName, out processName)
+8

string, a Tuple<string, string> ?

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;
}
+3

out-params:

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;
}
+2
source

You can change the return type to Process:

    public static Process GetProcessInfo(IntPtr hwnd)
    {
        uint pid = 0;
        GetWindowThreadProcessId(hwnd, out pid);
        return Process.GetProcessById((int)pid);
     }

and then get the necessary data from the returned object:

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

All Articles