PDA

View Full Version : سوال: Overload کردن متد Main در کلاس Program



alireza_tavakol
یک شنبه 08 شهریور 1388, 06:23 صبح
من یک برنامه دارم که می خواهم در کلاس program دو تا متد main وجود داشته باشه

تا در مواقعی که کاربر فایل اجرایی من رو از طریق CMD اجرا کرد و آرگومانی وروردی وارد کرد متد زیر اجرا شود

static void Main(string [] args)
{
Console.Write("hi world");
Console.Read();
}
و در مواقعی که کاربر برنامه من رو از طریق دابل کیلک روی فایل exe اجرا کرد متد زیر اجرا شود

static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
Application.Run(new Form1());
}

همان طوری که می بینید می خواهم متد Main رو با دو نوع signature متفاوت تعریف کنم تا compiler به صورت اتوماتیک تشخیص دهد در مواقعی که با پارامتر است نسخه مناسب را اجرا کند و در مواقعی که بدون پارامتر است نسخه مورد نظر را اجرا کند

ولی ظاهرا" این کار امکان پذیر نیست (Error) :افسرده:

SMRAH1
یک شنبه 08 شهریور 1388, 13:20 عصر
سلام

شما نیاز به بازنویسی ندارید.می توانید از

Environment.GetCommandLineArgs()
استفاده کنید.مانند :

String[] arguments = Environment.GetCommandLineArgs();
foreach (string s in arguments)
{
//Do with s
}

البته باید یاد آوری شود که در حالت معمولی حداقل یک آرگومان دارید.این آرگومان (یا اولین آرگومان لیست بالا)،نام برنامه (یا نام و مسیر برنامه،یستگی به نوع اجرای برنامه دارد) می باشد.به عبارت دیگر،اگر برنامه ای با آرگومان فراخوانی شود (این اتفاق معمولا از طریق خط دستور cmd می افتد ولی می تواند به روش های دیگری هم باشد) از آرگومان های دوم به بعد (در لیست می شود ایندکس یک به بعد قرار دارد).

موفق باشید

alireza_tavakol
یک شنبه 08 شهریور 1388, 13:58 عصر
البته باید یاد آوری شود که در حالت معمولی حداقل یک آرگومان دارید.

مشکل من دقیقا" همینجا خلاصه میشه

1-من می خواهم برنامه ای بنویسم که اگه آرگومان داشت اجرا بشه و اگه آرگومان هم نداشت اجرا بشه!

2- چرا نمیشه متد main() رو Overload کنیم:متفکر:

با تشکر از شما دوست فهیم:لبخندساده:

SMRAH1
یک شنبه 08 شهریور 1388, 14:10 عصر
سلام

1) هر برنامه ای رو اجرا کنید ،حداقل یک نام به عنوان آرگومان داره (نام خوده برنامه) البته به شرطی که از روش بالا استفاده کنید.
2) همونطور که گفتم شما می تونید با روش بالا به آرگومان ها دسترسی داشته باشید (حالا اینکه در چه حالتی برنامه اجرا شود یا ادامه پیدا نکند یا کارخاصی انجام دهد با شما است).
3) یاد آوری می شود که حالت تابع main در نوع Windows Form Application و Consol Application معمولا متفاوت است (در مثال پست یک،اولی مربوط به حالت فرم است و دومی مربوط به حالت Consol) .با این حال الزامی به رعایت این حالات ندارید، مثلا در حالت فرم می توان داشت :

static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
MessageBox.Show(args.Length.ToString());
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
Form f = new Form5();
Application.Run(f);
}
}که البته در این صورت اگر برنامه بدون آرگومان اجرا شود args.Length ، صفر خواهد بود (تعداد از صفر است بر عکس روش قبلی که حداقل یک آرگومان داریم).
4) شما باید یک برنامه فرم بسازید و کد های گفته شده را چه در تابع Main یا هر جای دیگر (مثل Form_Load) قرار بدید و تصمیم گیری کنید.

موفق باشید

alireza_tavakol
یک شنبه 08 شهریور 1388, 17:12 عصر
با تشکر

سوال بدون حاشیه : چرا در هنگام Overload کردن متد main با خطا مواجه می شوم و چگونه این خطا را مرتفع گردانم؟

به علت نا مرتبت شدن بحث با عنوان تاپیک ادامه سولات مربوط به این مفهوم را در تاپیک زیر مطرح کردم
http://www.barnamenevis.org/forum/showthread.php?t=176618

navid_8x
دوشنبه 09 شهریور 1388, 01:33 صبح
ببین همه ی برنامه ها یک تابع اصلی دارن که لینکر اونو به عنوان شروع کننده ی برنامه ثبت می کنه. اگه تابع main را overload کنی اون وقت لینکر کدوم تابع رو اصلی بشناسه. تازه این نگاه که سیستم عامل تابع overload درست رو پیدا می کنه دیدگاه غلتی هستش. لینکر فقط یک تابع رو به عنوان تابع اصلی می شناسه. بهتره جدا کردن برنامه ی خودت را بعد از تابع main قرار بدی

alireza_tavakol
دوشنبه 09 شهریور 1388, 03:05 صبح
تازه این نگاه که سیستم عامل تابع overload درست رو پیدا می کنه دیدگاه غلتی هستش.

مگه قرار سیستم عامل نسخه مناسب متد های Over load شده رو انتخاب کنه؟:متعجب:

قائدتا" سیستم عامل اگه ورودی وارد شده باشه به تابع main پاس میکنه و اگه ورودی وارد نشده باشه چیزی واسه main ارسال نمیکنه و از اینجا به بعد وظیفه کامپایلر که تشخیص بده کدوم نسخه از متد اجرا شود


بهتره جدا کردن برنامه ی خودت را بعد از تابع main قرار بدی

میشه بفرمایید چطوری جدا کننده رو داخل متد main بگذارم تا پروژه دو حالت پیدا کنه ( حالتی که خروجی win app باشه و حالتی که خروجی console داشته باشه )