Перейти к содержанию

Возврат значений из метода C#


Рекомендуемые сообщения

Изначально хотел чтобы метод возвращал два значения, надеялся увидеть нечто вроде


className.methodName(param1,param2).value1;

className.methodName(param1,param2).value2;

смотрел гугл ничего не нашел

Поэтому т.к. значения вытягиваются из ProcessModule решил его так весь и вернуть,


public static ProcessModule FindModule(string moduleName, int process_Id)
{

if (module)
{
return module;
}


}

в случае с "if" означает что модуль найден, все нормально. Однако если модуль не найден то что возвращать то? Пытался создать объект ProcessModule через new, но VS пишет что конструктор для данного класса не определен, вручную конструктор тоже хз как объявить в таком случае. Прошу совета, либо как вернуть два значения из метода, либо вернуть что-нибудь если модуль не найден.

Ссылка на комментарий
Поделиться на другие сайты

можно так:


IntPtr baseAdres;
int MMsize;

private void FindModule(string modulName, int process_Id)
{
var pr = Process.GetProcessById(process_Id);
if (pr.Id != 0)
{
foreach (ProcessModule item in pr.Modules)
{
if (item.ModuleName == modulName)
{
baseAdres = item.BaseAddress;
MMsize = item.ModuleMemorySize;
}
}
}
}

Еще можно возвратит массив значение, если значение однотипные.

Ссылка на комментарий
Поделиться на другие сайты

Оперирование глобальными (по отношению к функции) переменными из самой функции - не есть хороший тон программирования. Для их модификации лучше в функцию передавать указатель на них. К примеру, так:


IntPtr baseAdres = 0;
int MMsize = 0;
private void FindModule(string modulName, int process_Id, IntPtr *ba, int *mmsize)
{
var pr = Process.GetProcessById(process_Id);
if (pr.Id != 0)
{
foreach (ProcessModule item in pr.Modules)
{
if (item.ModuleName == modulName)
{
*ba = item.BaseAddress;
*mmsize = item.ModuleMemorySize;
}
}
}
}

И при вызове функции передать переменные параметрами примерно так:


FindModule(modname, pID, &baseAdres, &MMSize);

В этом случае в функцию будут переданы адреса этих переменных, и в переменные в самой функции уже запишется то, что нужно. Впрочем, вышесказанное справедливо для языка С++, не знаю, насколько это актуально для С#.

Ссылка на комментарий
Поделиться на другие сайты

можно так:


IntPtr baseAdres;
int MMsize;

private void FindModule(string modulName, int process_Id)
{
var pr = Process.GetProcessById(process_Id);
if (pr.Id != 0)
{
foreach (ProcessModule item in pr.Modules)
{
if (item.ModuleName == modulName)
{
baseAdres = item.BaseAddress;
MMsize = item.ModuleMemorySize;
}
}
}
}

Еще можно возвратит массив значение, если значение однотипные.

Значения не однотипные, да и засовывать, потом доставать их оттуда тоже не интересно.

И как функцию тоже не могу использовать т.к. вызов происходит из другого класса, если делать вывод тут же в переменные, то опять придется делать кучу телодвижений.

Оперирование глобальными (по отношению к функции) переменными из самой функции - не есть хороший тон программирования. Для их модификации лучше в функцию передавать указатель на них. К примеру, так:


IntPtr baseAdres = 0;
int MMsize = 0;
private void FindModule(string modulName, int process_Id, IntPtr *ba, int *mmsize)
{
var pr = Process.GetProcessById(process_Id);
if (pr.Id != 0)
{
foreach (ProcessModule item in pr.Modules)
{
if (item.ModuleName == modulName)
{
*ba = item.BaseAddress;
*mmsize = item.ModuleMemorySize;
}
}
}
}

И при вызове функции передать переменные параметрами примерно так:


FindModule(modname, pID, &baseAdres, &MMSize);

В этом случае в функцию будут переданы адреса этих переменных, и в переменные в самой функции уже запишется то, что нужно. Впрочем, вышесказанное справедливо для языка С++, не знаю, насколько это актуально для С#.

То что нужно! Спасибо, немного почитал про указатели, действительно удобно. Только в C# вместо * используется out или ref.

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.