csharp(1) General Commands Manual csharp(1)

csharp - شل تعاملی و محیط اجرای اسکریپت‌های C#

csharp [--attach PID] [-e EXPRESSION] [file1 [file2]] [compiler-options] [--|-s script-options]

دستور csharp یک شل تعاملی C# و میزبان اسکریپت‌نویسی است که به کاربر اجازه می‌دهد عبارت‌ها و دستورات C# را از خط فرمان وارد و ارزیابی کند یا اسکریپت‌های C# را به اجرا درآورد. گزینه‌های خط فرمان معمول mcs می‌توانند در این نسخه از کامپایلر استفاده شوند.

فایل‌های مشخص‌شده در خط فرمان به عنوان اسکریپت بارگذاری و اجرا خواهند شد.

از نسخهٔ Mono 2.10 به بعد، دستور csharp می‌تواند به عنوان یک مفسر برای فایل‌هایی که دارای صفت اجرایی یونیکس هستند استفاده شود. برای این کار، سطر اول کد منبع C# خود را به این صورت بنویسید:

#!/usr/bin/csharp
Console.WriteLine ("Hello, World");

از نسخهٔ Mono 5.0 به بعد، آرگومان‌های خط فرمان را می‌توان با مشخص کردن گزینه‌های -s یا -- (گزینه‌های اسکریپت) به دستور csharp ارسال کرد.

گزینهٔ -s برای تفسیر اسکریپت‌های اجرایی که از نحو shebang بهره می‌برند (معرفی‌شده در Mono 2.10) بسیار مناسب است. این قابلیت اجازه می‌دهد آرگومان‌های خط فرمان به اسکریپت ارسال شده و به‌راحتی استفاده شوند:

#!/usr/bin/csharp -s
foreach (var arg in Args)
  Console.WriteLine ($"script argument: {arg}");

این دستور تمام گزینه‌هایی را که برای دستور mcs در دسترس هستند می‌پذیرد؛ بنابراین می‌توانید از طریق خط فرمان به اسمبلی‌ها ارجاع دهید، مسیرها، سطح زبان و سایر موارد را مشخص کنید. علاوه بر این، گزینه‌های خط فرمان زیر نیز پشتیبانی می‌شوند:

این گزینه برای ایجاد اسکریپت‌های اجرایی که از قابلیت shebang در یونیکس استفاده می‌کنند، ایده‌آل است. یونیکس به طور ضمنی مسیر اسکریپت را به عنوان یک آرگومان پیوست خواهد کرد. هنگامی که فایل اجرایی فراخوانی می‌شود، تمام آرگومان‌هایی که به آن منتقل شوند در متغیر عمومی Args در دسترس خواهند بود. مثال: #!/usr/bin/env csharp -s
--
هر آرگومانی که پس از این گزینه بیاید به کامپایلر منتقل نخواهد شد و در عوض در متغیر عمومی Args قرار می‌گیرد. به عنوان مثال: دستور csharp -- a b c منجر به مقدار { "a", "b", "c" } = Args در شل تعاملی خواهد شد.
این یک گزینهٔ پیشرفته است و تنها در صورتی باید استفاده شود که درک عمیقی از چندنخی (multi-threading) داشته باشید. این گزینه در دستور csharp در دسترس است و امکان تزریق کامپایلر به سایر فرآیندها را فراهم می‌کند. این کار با تزریق شل C# در یک نخ (thread) مجزا که به طور هم‌روند با برنامهٔ شما اجرا می‌شود انجام می‌گیرد. این بدان معناست که برای جلوگیری از کرش کردن برنامهٔ مقصد در هنگام استفاده از آن، باید تدابیر ویژه‌ای اتخاذ کنید؛ به عنوان مثال، ممکن است نیاز باشد پیش از اجرای دستوراتی که بر وضعیت فرآیند مقصد اثر می‌گذارند قفل‌های مناسبی ایجاد کنید یا دستورات را از طریق یک توزیع‌کنندهٔ متد ارسال نمایید.
عبارت C# مشخص‌شده در EXPRESSION را ارزیابی کرده و خارج می‌شود..SH "نحوه عملکرد (OPERATION)" پس از اجرای دستور csharp، با اعلان تعاملی زیر مواجه خواهید شد:
$ csharp
Mono C# Shell, type "help;" for help
Enter statements below.
csharp>

تعدادی از فضاهای نام به‌طور پیش‌فرض در C# تعریف شده‌اند که شامل System،‏ System.Linq،‏ System.Collections و System.Collections.Generic می‌شوند. برخلاف حالت کامپایل‌شده، این امکان وجود دارد که در حین نوشتن کد، دستورهای using جدیدی اضافه کنید؛ برای مثال:

csharp> new XmlDocument ();
<interactive>(1,6): error CS0246: The type or namespace name `XmlDocument' could not be found. Are you missing a using directive or an assembly reference?
csharp> using System.Xml;
csharp> new XmlDocument (); 
System.Xml.XmlDocument

هر بار که دستوری وارد می‌شود، محدودهٔ آن دستور متعلق به کلاسی است که از کلاس Mono.CSharp.InteractiveBase مشتق شده است. این کلاس تعدادی مشخصه و متد ایستا تعریف می‌کند. برای نمایش فهرستی از دستورهای موجود، به مشخصهٔ “help” دسترسی پیدا کنید:

csharp> help;
"Static methods:
  LoadPackage (pkg); - Loads the given Package (like -pkg:FILE)
  [...]
  ShowVars ();       - Shows defined local variables.
  ShowUsing ();      - Show active using decltions.
  help;
"
csharp>

هنگامی که عبارت‌ها وارد می‌شوند، شل C# نتیجهٔ اجرای آن عبارت را نمایش می‌دهد:

csharp> Math.Sin (Math.PI/4); 
0.707106781186547
csharp> 1+1;
2
csharp> "Hello, world".IndexOf (',');
5

شل C# از متد ToString() روی شیء برگشتی برای نمایش آن استفاده می‌کند؛ این امر گاهی می‌تواند محدودکننده باشد، زیرا اشیایی که متد ToString() را بازنویسی نکرده باشند، رفتار پیش‌فرض System.Object را دریافت خواهند کرد که صرفاً نمایش نام نوع دادهٔ آن‌هاست:

csharp> var a = new XmlDocument ();
csharp> a;
System.Xml.Document
csharp> csharp> a.Name;    
"#document"
csharp>

چند نوع داده مانند آرایه‌ها، System.Collections.Hashtable و اشیایی که System.Collections.IEnumerable و IDictionary را پیاده‌سازی کرده‌اند، رفتار ویژه‌ای در شل تعاملی C# دارند و به‌جای استفادهٔ ساده از ToString()، به صورت خاص رندر می‌شوند:

csharp> var pages = new Hashtable () { 
      >  { "Mono",    "http://www.mono-project.com" },
      >  { "Linux",   "http://kernel.org" } };
csharp> pages;
{{ "Mono", "http://www.mono-project.com" }, { "Linux", "http://kernel.org" }}

از آنجا که فضای نام System.Linq هنگام راه‌اندازی وارد شده است، امکان استفادهٔ مستقیم از LINQ در شل تعاملی C# وجود دارد. نمونهٔ زیر فهرستی از تمام فایل‌هایی را دریافت می‌کند که ظرف یک هفتهٔ گذشته در /tmp به آن‌ها دسترسی پیدا نشده است:

csharp> using System.IO;
csharp> var last_week = DateTime.Now - TimeSpan.FromDays (7);
csharp> var old_files = from f in Directory.GetFiles ("/tmp") 
      >   let fi = new FileInfo (f) 
      >   where fi.LastAccessTime < LastWeek select f;
csharp>

همچنین می‌توانید نتایج را در قالب یک دستور واحد نیز چاپ کنید:

csharp> using System.IO;
csharp> var last_week = DateTime.Now - TimeSpan.FromDays (7);
csharp> from f in Directory.GetFiles ("/tmp") 
      >   let fi = new FileInfo (f) 
      >   where fi.LastAccessTime < last_week select f;
[...]
csharp>

ابزار LINQ و شالودهٔ تابعی آن، برای مقادیر بازگشتی IEnumerable کدهای ارزیابی‌شونده برحسب تقاضا (on-demand) تولید می‌کنند. برای مثال، مقدار بازگشتی از عبارت دارای “from” یک IEnumerable است که بنا بر نیاز ارزیابی می‌شود. رندر خودکار مقادیر IEnumerable در خط فرمان موجب می‌شود که خط‌لولهٔ IEnumerable بلافاصله در همان نقطه اجرا شود، به‌جای آنکه اجرای آن تا زمانی دیگر به تعویق بیفتد.

اگر می‌خواهید از رندر شدن شیء IEnumerable در این نقطه جلوگیری کنید، کافی است مقدار آن را به یک متغیر نسبت دهید.

برخلاف C# کامپایل‌شده، در صورت وارد کردن یک تعریف جدید، نوع متغیر می‌تواند تغییر کند؛ برای مثال:

csharp> var a = 1;
csharp> a.GetType ();
System.Int32
csharp> var a = "Hello";
csharp> a.GetType ();
System.String
csharp> ShowVars ();
string a = "Hello"

در صورتی که یک عبارت یا دستور در یک سطر کامل نشود، اعلان ادامه نمایش داده می‌شود؛ برای مثال:

csharp> var protocols = new string [] {
      >    "ftp",
      >    "http",
      >    "gopher" 
      > };
csharp> protocols;
{ "ftp", "http", "gopher" }

محاسبات طولانی را می‌توان با استفاده از کلیدهای ترکیبی Control-C متوقف کرد:

csharp> var done = false;
csharp> while (!done) { }
Interrupted!
System.Threading.ThreadAbortException: Thread was being aborted
  at Class1.Host (System.Object& $retval) [0x00000] 
  at Mono.CSharp.InteractiveShell.ExecuteBlock (Mono.CSharp.Class host, Mono.CSharp.Undo undo) [0x00000] 
csharp>
پوسته تعاملی C# شامل یک ویرایشگر خط است که قابلیت‌های ویرایش خط فرمان پیشرفته‌تری را نسبت به آنچه سیستم‌عامل ارائه می‌دهد، فراهم می‌کند. این قابلیت‌ها در نسخه خط فرمان در دسترس هستند؛ نسخه‌های گرافیکی از کلیدهای میانبر استاندارد Gtk# استفاده می‌کنند.

مجموعه دستورات مشابه بسیاری از برنامه‌های دیگر است (کلیدهای مکان‌نما) و برخی از دستورات Emacs را برای ویرایش و همچنین یک سازوکار تاریخچه در بر می‌گیرد.

ورودی‌های صفحه‌کلید زیر پشتیبانی می‌شوند:

کلید Home،‏ Control-a
به ابتدای خط می‌رود.
کلید End،‏ Control-e
به انتهای خط می‌رود.
کلید جهت‌نمای چپ،‏ Control-b
مکان‌نما را یک نویسه به عقب می‌برد.
کلید جهت‌نمای راست،‏ Control-f
مکان‌نما را یک نویسه به جلو می‌برد.
کلید جهت‌نمای بالا،‏ Control-p
در تاریخچه به عقب می‌رود، خط فعلی را با خط قبلی در تاریخچه جایگزین می‌کند.
کلید جهت‌نمای پایین،‏ Control-n
در تاریخچه به جلو می‌رود، خط فعلی را با خط بعدی در تاریخچه جایگزین می‌کند.
کلید Return
اگر دستور یا عبارت کامل باشد، خط فعلی را اجرا می‌کند، در غیر این صورت منتظر ورودی بیشتر می‌ماند.
ویرایش خط فعلی را لغو می‌کند. این کار هرگونه ویرایش در حال انجام یا ویرایش ناقص را متوقف کرده و به تعریف سطح بالا بازمی‌گردد.
کلید Backspace
نویسه پیش از مکان‌نما را حذف می‌کند.
کلید Delete،‏ Control-d
نویسه موجود در موقعیت فعلی مکان‌نما را حذف می‌کند.
محتوای خط را تا انتهای آن پاک کرده و نتیجه را در بافر برش و چسباندن قرار می‌دهد.
کلمه را از موقعیت فعلی مکان‌نما حذف کرده و آن را به بافر برش و چسباندن اضافه می‌کند. با فشردن مکرر Alt-d، می‌توان چندین کلمه را به بافر چسباندن پیوست کرد.
محتوای بافر حذف (kill buffer) را در موقعیت فعلی مکان‌نما می‌چسباند.
این نویسه نقل‌قول (quote) است. به کاربر اجازه می‌دهد نویسه‌های کنترلی را وارد کند که در غیر این صورت توسط قابلیت ویرایش دستور دریافت می‌شوند. کلید Control-Q و سپس نویسه مورد نظر برای درج را فشار دهید تا دقیقاً همان‌طور که هست در خط فرمان وارد شود.
برنامه را خاتمه می‌دهد. این دستور ورودی برنامه را به پایان می‌رساند.

از آنجا که متدها و ویژگی‌های کلاس پایه‌ای که دستورها و عبارت‌ها از آن اجرا می‌شوند ایستا (static) هستند، می‌توان آن‌ها را مستقیماً از پوسته فراخوانی کرد. ویژگی‌ها و متدهای موجود عبارتند از:

آرایه‌ای با استفاده آسان از هر آرگومان مشخص‌شده پس از -s یا -- در خط فرمان. ایده‌آل برای اسکریپت‌های خوداجرا که از گزینه -s استفاده می‌کنند.
اسمبلی داده‌شده را بارگذاری می‌کند. این معادل با ارسال پرچم -r: با رشته مشخص‌شده به کامپایلر است.
بسته مشخص‌شده را وارد می‌کند. این معادل فراخوانی کامپایلر با پرچم -pkg: با رشته مشخص‌شده است.
اعلان مورد استفاده توسط پوسته. مقدار پیش‌فرض آن "csharp> " است. string ContinuationPrompt { get; set } اعلانی که توسط پوسته در مواقع نیاز به ورودی بیشتر برای تکمیل عبارت یا دستور استفاده می‌شود.
تمام متغیرهایی را که تاکنون تعریف شده‌اند و نوع آن‌ها را نمایش می‌دهد. در پوسته csharp، اعلان متغیرهای جدید بر اعلان‌های قبلی متغیرها سایه می‌اندازد (shadowing)؛ این با رفتار C# در زمان کامپایل متفاوت است. void ShowUsing() تمام دستورهای using فعال را نمایش می‌دهد. TimeSpan Time (Action a) روالی کاربردی برای اندازه‌گیری زمانی که اجرای یک قطعه کد طول می‌کشد. پارامتر آن یک دلیگیت Action است و مقدار بازگشتی یک TimeSpan می‌باشد. برای مثال:
csharp> Time (() => { for (int i = 0; i < 5; i++) Console.WriteLine (i);});
0
1
2
3
4
00:00:00.0043230
csharp>

مقدار بازگشتی یک TimeSpan است که می‌توانید آن را برای اهداف ارزیابی کارایی (benchmarking) در یک متغیر ذخیره کنید..SH "متدها و مشخصه‌های رابط گرافیکی (GUI METHODS AND PROPERTIES)" علاوه بر متدها و ویژگی‌های موجود در نسخهٔ کنسول، چند ویژگی اضافی در نسخهٔ رابط کاربری گرافیکی (GUI) در دسترس است. برای نمونه، یک Gtk.Container با نام "PaneContainer" ارائه شده است که می‌توانید در حین پیش‌نمونه‌سازی، برای میزبانی ویجت‌های Gtk# از آن استفاده کنید، یا ویژگی "MainWindow" که به شما امکان دسترسی به پنجرهٔ سطح بالا (toplevel) فعلی را می‌دهد.

پوستهٔ C# تمام اسمبلی‌های Mono و فایل‌های اسکریپت C# موجود در دایرکتوری ~/.config/csharp را در سیستم‌های Unix بارگذاری می‌کند. این اسمبلی‌ها پیش از فایل‌های منبع بارگذاری می‌شوند.

فایل‌های اسکریپت C# فایل‌هایی با پسوند .cs هستند و تنها باید شامل دستورها و عبارت‌ها باشند؛ این فایل‌ها نمی‌توانند شامل تعاریف کامل کلاس باشند (دست‌کم تا نسخهٔ Mono 2.0). تعاریف کامل کلاس باید به صورت dll کامپایل شده و در آن دایرکتوری ذخیره شوند.

کامپایلر Mono C# توسط Miguel de Icaza، Ravi Pratap، Martin Baulig، Marek Safar و Raja Harinath نوشته شده است. بودجهٔ توسعهٔ آن توسط Ximian، Novell و Marek Safar تأمین شده است.

مجموعه کامپایلر Mono تحت شرایط مجوزهای GNU GPL یا MIT X11 منتشر شده است. لطفاً برای جزئیات، فایل `COPYING` همراه برنامه را بخوانید. شرایط مجوزدهی جایگزین برای کامپایلر از طریق Novell در دسترس است.

gmcs(1), mcs(1), mdb(1), mono(1), pkg-config(1)

برای گزارش باگ‌ها در کامپایلر، باید آن‌ها را در سامانهٔ ردیابی اشکال ما ثبت کنید در: http://www.mono-project.com/community/bugs

فهرست‌های پستی Mono در نشانی http://www.mono-project.com/community/help/mailing-lists فهرست شده‌اند.

کامپایلر Mono C# توسط شرکت Novell توسعه یافته است (http://www.novell.com) و بر اساس استاندارد زبان ECMA C# است که در اینجا در دسترس است: http://www.ecma.ch/ecma1/STAND/ecma-334.htm

صفحهٔ اصلی کامپایلر Mono C# در نشانی http://www.mono-project.com/docs/about-mono/languages/csharp قرار دارد؛ اطلاعات مربوط به حالت تعاملی برای C# در نشانی http://mono-project.com/docs/tools+libraries/tools/repl در دسترس است.

22 March 2017