آموزش جامع متد Console.ReadKey در C# و .NET
Console.ReadKey() یکی از اعضای مهم کلاس System.Console است و برای ارتباط برنامه با ورودی، خروجی یا محیط تعاملی فرایند استفاده میشود. این مقاله از تعریف پایه شروع میکند، سپس Syntax، نوع بازگشتی، مدیریت خطا، ده مثال مستقل، ملاحظات پلتفرم و روش استفاده در پروژه واقعی را پوشش میدهد.
متد Console.ReadKey فشردن یک کلید یا کلید تابعی را دریافت میکند و ConsoleKeyInfo شامل نویسه، کد کلید و Modifierها را تحویل میدهد. نکته مهم این است که Console فقط یک پنجره مشکی روی Windows نیست؛ سه جریان استاندارد In، Out و Error میتوانند به Terminal، فایل، Pipe، سیستم جمعآوری لاگ یا میزبان Container متصل شوند. بنابراین طراحی باید هم حالت تعاملی و هم حالت Redirect شده را در نظر بگیرد.
برای دیدن جایگاه این API در کنار سایر اعضای Console، راهنمای جامع توابع و ویژگیهای Console در C# و .NET را نیز مطالعه کنید.
دسترسی سریع
- تعریف، Syntax، پارامترها و نوع خروجی
- ده مثال مستقل از سطح پایه تا سناریوی سازمانی
- مدیریت null، EOF، Redirect و محدودیتهای پلتفرم
- خطاهای رایج، Performance و Best Practice
- ده پرسش متداول، سؤالهای مصاحبه و چکلیست نهایی
تصویر 1: نمای مفهومی و اختصاصی Console.ReadKey() در برنامههای C# و .NET؛ این تصویر ارتباط ورودی یا خروجی استاندارد، کد برنامه و محیط اجرا را نشان میدهد.
تعریف Console.ReadKey()
متد Console.ReadKey فشردن یک کلید یا کلید تابعی را دریافت میکند و ConsoleKeyInfo شامل نویسه، کد کلید و Modifierها را تحویل میدهد.
از دید معماری، فراخوانی Console.ReadKey() یک اثر جانبی در مرز برنامه است. منطق Domain نباید برای محاسبه نتیجه به وضعیت Terminal وابسته باشد. بهتر است تصمیمهای کسبوکار ابتدا در توابع خالص انجام شوند و لایه Presentation یا Infrastructure فقط نتیجه نهایی را از طریق Console نمایش دهد یا دریافت کند.
در تست واحد میتوان Console.In یا Console.Out را با StringReader و StringWriter جایگزین کرد، اما در سامانه بزرگتر، تزریق TextReader، TextWriter یا یک Interface اختصاصی خواناتر است. این جداسازی امکان اجرای همان منطق در رابط وب، Worker Service و تست خودکار را فراهم میکند.
Syntax، پارامترها و نوع خروجی
ConsoleKeyInfo key = Console.ReadKey();
ConsoleKeyInfo hiddenKey = Console.ReadKey(intercept: true);
| بخش | توضیح فنی | نکته کاربردی |
|---|
| Syntax | ConsoleKeyInfo key = Console.ReadKey(); | ConsoleKeyInfo hiddenKey = Console.ReadKey(intercept: true); | overload یا getter/setter مناسب سناریو را انتخاب کنید. |
| پارامترها | پارامتر اختیاری intercept تعیین میکند کلید فشردهشده روی صفحه Echo شود یا نه. خروجی شامل Key، KeyChar و Modifiers است. | ورودی را پیش از فراخوانی اعتبارسنجی کنید. |
| نوع خروجی | ConsoleKeyInfo؛ ساختاری حاوی اطلاعات کلید و وضعیت Alt، Ctrl و Shift. | اثر جانبی و وضعیت محیط را در تست لحاظ کنید. |
| محیط اجرا | Console تعاملی، خروجی Redirect شده، Pipe، Container یا CI | پشتیبانی را روی میزبان واقعی آزمایش کنید. |
پارامتر اختیاری intercept تعیین میکند کلید فشردهشده روی صفحه Echo شود یا نه. خروجی شامل Key، KeyChar و Modifiers است.
ConsoleKeyInfo؛ ساختاری حاوی اطلاعات کلید و وضعیت Alt، Ctrl و Shift.
تصویر 2: نمای مفهومی و اختصاصی Console.ReadKey() در برنامههای C# و .NET؛ این تصویر ارتباط ورودی یا خروجی استاندارد، کد برنامه و محیط اجرا را نشان میدهد.
ده مثال عملی Console.ReadKey()
مثال 1: مثال پایه برای Console.ReadKey()
اجرای ساده API با یک مقدار ثابت و مشاهده مستقیم نتیجه. در این نمونه تمرکز بر رفتار واقعی Console.ReadKey() است تا نتیجه قابل مشاهده و تصمیم فنی روشن باشد.
using System;
public static class Program
{
public static void Main()
{
Console.Write("یک کلید فشار دهید: ");
ConsoleKeyInfo info = Console.ReadKey(intercept: true);
Console.WriteLine("\nKey={0}", info.Key);
}
}
| نتیجه نمونه | تفسیر نتیجه |
|---|
| Key=A (با فشردن A) | خروجی مورد انتظار مثال شماره 1 برای Console.ReadKey() |
intercept مانع Echo شدن نویسه ورودی میشود. در اجرای واقعی، شکل دقیق نمایش میتواند با Terminal، سیستمعامل و Encoding متفاوت باشد، اما قرارداد API و کنترلهای کد باید ثابت بماند.
مثال 2: داده نمونه واقعی برای Console.ReadKey()
کار با دادهای شبیه اطلاعات سفارش، کاربر یا گزارش یک سامانه سازمانی. در این نمونه تمرکز بر رفتار واقعی Console.ReadKey() است تا نتیجه قابل مشاهده و تصمیم فنی روشن باشد.
using System;
public static class Program
{
public static void Main()
{
Console.WriteLine("S=ذخیره، Q=خروج");
ConsoleKey key = Console.ReadKey(true).Key;
Console.WriteLine(key == ConsoleKey.S ? "ذخیره شد" : "خروج");
}
}
| نتیجه نمونه | تفسیر نتیجه |
|---|
| ذخیره شد (با فشردن S) | خروجی مورد انتظار مثال شماره 2 برای Console.ReadKey() |
منوی تککلیدی بدون نیاز به Enter عمل میکند. در اجرای واقعی، شکل دقیق نمایش میتواند با Terminal، سیستمعامل و Encoding متفاوت باشد، اما قرارداد API و کنترلهای کد باید ثابت بماند.
مثال 3: پردازش مجموعه برای Console.ReadKey()
استفاده در حلقه یا روی چند مقدار و کنترل شکل خروجی. در این نمونه تمرکز بر رفتار واقعی Console.ReadKey() است تا نتیجه قابل مشاهده و تصمیم فنی روشن باشد.
using System;
public static class Program
{
public static void Main()
{
for (int i = 0; i < 3; i++)
{
ConsoleKeyInfo key = Console.ReadKey(true);
Console.WriteLine("Key {0}: {1}", i + 1, key.Key);
}
}
}
| نتیجه نمونه | تفسیر نتیجه |
|---|
| سه نام کلید در سه خط | خروجی مورد انتظار مثال شماره 3 برای Console.ReadKey() |
هر فشردن بهصورت یک رخداد مستقل پردازش میشود. در اجرای واقعی، شکل دقیق نمایش میتواند با Terminal، سیستمعامل و Encoding متفاوت باشد، اما قرارداد API و کنترلهای کد باید ثابت بماند.
مثال 4: شرط و اعتبارسنجی برای Console.ReadKey()
ترکیب API با شرط تا فقط داده معتبر یا وضعیت موردنظر پردازش شود. در این نمونه تمرکز بر رفتار واقعی Console.ReadKey() است تا نتیجه قابل مشاهده و تصمیم فنی روشن باشد.
using System;
public static class Program
{
public static void Main()
{
ConsoleKeyInfo key = Console.ReadKey(true);
bool confirmed = key.Key is ConsoleKey.Y or ConsoleKey.Enter;
Console.WriteLine(confirmed ? "تأیید شد" : "لغو شد");
}
}
| نتیجه نمونه | تفسیر نتیجه |
|---|
| تأیید شد (با Enter) | خروجی مورد انتظار مثال شماره 4 برای Console.ReadKey() |
چند کلید معتبر در یک شرط Pattern تعریف شدهاند. در اجرای واقعی، شکل دقیق نمایش میتواند با Terminal، سیستمعامل و Encoding متفاوت باشد، اما قرارداد API و کنترلهای کد باید ثابت بماند.
مثال 5: ترکیب با API دیگر برای Console.ReadKey()
ساخت یک جریان کامل با کمک تبدیل، قالببندی یا قابلیت مکمل Console. در این نمونه تمرکز بر رفتار واقعی Console.ReadKey() است تا نتیجه قابل مشاهده و تصمیم فنی روشن باشد.
using System;
public static class Program
{
public static void Main()
{
ConsoleKeyInfo key = Console.ReadKey(true);
Console.WriteLine("Char={0}; Key={1}; Modifiers={2}", key.KeyChar, key.Key, key.Modifiers);
}
}
| نتیجه نمونه | تفسیر نتیجه |
|---|
| Char=a; Key=A; Modifiers=Shift (نمونه) | خروجی مورد انتظار مثال شماره 5 برای Console.ReadKey() |
KeyChar، Key و Modifier کاربردهای متفاوتی دارند. در اجرای واقعی، شکل دقیق نمایش میتواند با Terminal، سیستمعامل و Encoding متفاوت باشد، اما قرارداد API و کنترلهای کد باید ثابت بماند.
مثال 6: رفتار در مقدار تهی یا پایان جریان برای Console.ReadKey()
مدیریت null، EOF یا محیط Redirect شده بدون شکست برنامه. در این نمونه تمرکز بر رفتار واقعی Console.ReadKey() است تا نتیجه قابل مشاهده و تصمیم فنی روشن باشد.
using System;
public static class Program
{
public static void Main()
{
if (Console.IsInputRedirected)
{
Console.WriteLine("ورودی تعاملی در دسترس نیست.");
}
else
{
Console.WriteLine(Console.ReadKey(true).Key);
}
}
}
| نتیجه نمونه | تفسیر نتیجه |
|---|
| ورودی تعاملی در دسترس نیست. (در Pipe) | خروجی مورد انتظار مثال شماره 6 برای Console.ReadKey() |
پیش از ReadKey، Redirect بودن ورودی بررسی میشود. در اجرای واقعی، شکل دقیق نمایش میتواند با Terminal، سیستمعامل و Encoding متفاوت باشد، اما قرارداد API و کنترلهای کد باید ثابت بماند.
مثال 7: حالت مرزی برای Console.ReadKey()
آزمایش مرزها، نویسههای ویژه یا محدودیت محیط اجرا. در این نمونه تمرکز بر رفتار واقعی Console.ReadKey() است تا نتیجه قابل مشاهده و تصمیم فنی روشن باشد.
using System;
public static class Program
{
public static void Main()
{
Console.WriteLine("برای پایان Escape را بزنید.");
ConsoleKey key;
do
{
key = Console.ReadKey(true).Key;
} while (key != ConsoleKey.Escape);
Console.WriteLine("پایان");
}
}
| نتیجه نمونه | تفسیر نتیجه |
|---|
| پایان (پس از Escape) | خروجی مورد انتظار مثال شماره 7 برای Console.ReadKey() |
Escape یک مسیر خروج قابل پیشبینی ایجاد میکند. در اجرای واقعی، شکل دقیق نمایش میتواند با Terminal، سیستمعامل و Encoding متفاوت باشد، اما قرارداد API و کنترلهای کد باید ثابت بماند.
مثال 8: سناریوی سازمانی برای Console.ReadKey()
کاربرد در ابزار عملیاتی، گزارشگیری یا پردازش دستهای. در این نمونه تمرکز بر رفتار واقعی Console.ReadKey() است تا نتیجه قابل مشاهده و تصمیم فنی روشن باشد.
using System;
public static class Program
{
public static void Main()
{
Console.WriteLine("F1=راهنما، F5=بازخوانی");
ConsoleKey key = Console.ReadKey(true).Key;
string action = key switch
{
ConsoleKey.F1 => "راهنما",
ConsoleKey.F5 => "بازخوانی",
_ => "بدون عملیات"
};
Console.WriteLine(action);
}
}
| نتیجه نمونه | تفسیر نتیجه |
|---|
| بازخوانی (با F5) | خروجی مورد انتظار مثال شماره 8 برای Console.ReadKey() |
کلیدهای تابعی با switch expression نگاشت میشوند. در اجرای واقعی، شکل دقیق نمایش میتواند با Terminal، سیستمعامل و Encoding متفاوت باشد، اما قرارداد API و کنترلهای کد باید ثابت بماند.
مثال 9: روش اشتباه و نسخه اصلاحشده برای Console.ReadKey()
نمایش یک اشتباه متداول و پیادهسازی امنتر همان نیاز. در این نمونه تمرکز بر رفتار واقعی Console.ReadKey() است تا نتیجه قابل مشاهده و تصمیم فنی روشن باشد.
using System;
public static class Program
{
public static void Main()
{
Console.WriteLine("اشتباه: نمایش رمز با Echo");
Console.Write("نسخه امن، یک کلید: ");
ConsoleKeyInfo key = Console.ReadKey(intercept: true);
Console.WriteLine("\nدریافت شد؛ نمایش داده نشد.");
}
}
| نتیجه نمونه | تفسیر نتیجه |
|---|
| دریافت شد؛ نمایش داده نشد. | خروجی مورد انتظار مثال شماره 9 برای Console.ReadKey() |
intercept:true فقط Echo را میبندد و جایگزین سامانه امن رمز عبور نیست. در اجرای واقعی، شکل دقیق نمایش میتواند با Terminal، سیستمعامل و Encoding متفاوت باشد، اما قرارداد API و کنترلهای کد باید ثابت بماند.
مثال 10: کارایی و بهینهسازی برای Console.ReadKey()
کاهش فراخوانی، کنترل I/O و اندازهگیری هزینه در مسیر پرتکرار. در این نمونه تمرکز بر رفتار واقعی Console.ReadKey() است تا نتیجه قابل مشاهده و تصمیم فنی روشن باشد.
using System;
public static class Program
{
public static void Main()
{
DateTime deadline = DateTime.UtcNow.AddSeconds(5);
while (DateTime.UtcNow < deadline && !Console.KeyAvailable)
{
System.Threading.Thread.Sleep(25);
}
Console.WriteLine(Console.KeyAvailable ? $"Key={Console.ReadKey(true).Key}" : "Timeout");
}
}
| نتیجه نمونه | تفسیر نتیجه |
|---|
| Timeout یا نام کلید | خروجی مورد انتظار مثال شماره 10 برای Console.ReadKey() |
Polling با تأخیر کوتاه از حلقه Busy و مصرف کامل CPU جلوگیری میکند. در اجرای واقعی، شکل دقیق نمایش میتواند با Terminal، سیستمعامل و Encoding متفاوت باشد، اما قرارداد API و کنترلهای کد باید ثابت بماند.
خطاهای رایج و راه رفع آنها
وقتی ورودی Redirect شده باشد یا برنامه محیط تعاملی واقعی نداشته باشد، ReadKey انتخاب مناسبی نیست و ممکن است استثنا ایجاد کند.
- وابسته کردن منطق اصلی برنامه به وجود یک Console تعاملی و نداشتن مسیر جایگزین برای CI، سرویس یا Container.
- گرفتن Exception عمومی و ادامه دادن بدون ثبت Context؛ بهتر است استثناهای قابل انتظار بهطور مشخص مدیریت شوند.
- نوشتن اطلاعات حساس، Token، رمز عبور یا داده مشتری در خروجی استاندارد که ممکن است در سامانه مرکزی ذخیره شود.
- نادیده گرفتن Encoding، پایان خط، null، EOF یا محدوده ابعاد و مختصات در ورودی و خروجی متنی.
- اجرای عملیات I/O در حلقه پرتکرار بدون Buffer، Throttle، LogLevel یا اندازهگیری روی مقصد واقعی.
ملاحظات کارایی و مقیاسپذیری
این متد مسدودکننده است؛ برای UI واکنشگرا، سرویس پسزمینه یا وب از مدل رویدادی یا ورودی غیرمسدودکننده مناسب همان محیط استفاده کنید.
هزینه Console.ReadKey() تنها زمان اجرای یک دستور C# نیست؛ قفل داخلی Writer، قالببندی رشته، Encoding، Flush، سرعت Terminal، جمعآوری stdout توسط Container و تعداد مصرفکنندهها میتوانند نتیجه را تغییر دهند. برای ارزیابی، تعداد عملیات در ثانیه، حجم بایت، تخصیص حافظه و Latency صدکهای ۹۵ و ۹۹ را اندازه بگیرید.
در مسیر داغ ابتدا مقدار پیام و نرخ واقعی را اندازهگیری کنید، سپس تولید متن را شرطی، فراخوانیها را تجمیع و خروجی را سطحبندی کنید. حذف کورکورانه همه پیامها نیز درست نیست؛ رخدادهای لازم برای امنیت، حسابرسی و تشخیص خطا باید با بودجه مشخص باقی بمانند.
تصویر 3: نمای مفهومی و اختصاصی Console.ReadKey() در برنامههای C# و .NET؛ این تصویر ارتباط ورودی یا خروجی استاندارد، کد برنامه و محیط اجرا را نشان میدهد.
بهترین روشها
برای پنهان کردن Echo از intercept:true استفاده کنید، Escape را برای خروج تعریف کنید و پیش از استفاده، تعاملی بودن محیط را بسنجید.
- قرارداد ورودی یا خروجی را مستند کنید و مثال قابل اجرای کوچک برای آن نگه دارید.
- پیش از فراخوانی، Redirect بودن جریان و قابلیت پلتفرم را در موارد حساس بررسی کنید.
- مقدار null، EOF، محدوده عددی، طول متن و Encoding را صریح مدیریت کنید.
- منطق کسبوکار را از Console جدا و وابستگی را پشت TextReader، TextWriter یا Interface قرار دهید.
- برای عملیات پرتعداد از Buffer، StringBuilder، Throttle یا Logging ساختیافته استفاده کنید.
- تست را روی Windows، Linux، Terminal هدف و محیط CI یا Container واقعی اجرا کنید.
- خروجی را از داده حساس پاک کنید و سطح دسترسی سامانه جمعآوری لاگ را محدود نگه دارید.
- پس از خطا، رنگ، عنوان، مکاننما یا ابعاد تغییرکرده را در finally به وضعیت مناسب بازگردانید.
کاربرد واقعی در پروژه سازمانی
Console.ReadKey() میتواند در ابزار مهاجرت داده، Job زمانبندیشده، Utility پشتیبانی، نصبکننده، خط فرمان مدیریتی و نمونه آموزشی استفاده شود. در یک معماری حرفهای، لایه Application نتیجه عملیات را به یک مدل وضعیت تبدیل میکند و Adapter کنسولی تصمیم میگیرد آن را چگونه نمایش دهد؛ Adapter دیگری میتواند همان وضعیت را به API، داشبورد یا پیام مانیتورینگ تبدیل کند.
برای عملیات طولانی، شناسه همبستگی، زمان شروع و پایان، تعداد رکورد موفق و ناموفق و کد خروج فرایند را ثبت کنید. پیام انسانی و خروجی قابل پردازش را مخلوط نکنید؛ برای مثال گزارش ماشینخوان را روی stdout و خطاهای تشخیصی را روی stderr بفرستید.
سؤالات متداول
پرسش 1: Console.ReadKey() دقیقاً چه کاری انجام میدهد؟
متد Console.ReadKey فشردن یک کلید یا کلید تابعی را دریافت میکند و ConsoleKeyInfo شامل نویسه، کد کلید و Modifierها را تحویل میدهد. برای استفاده درست باید نوع ورودی یا خروجی، شرایط میزبان و اثر جانبی این API را همزمان در نظر گرفت؛ صرف دیدن یک خروجی در محیط توسعه تضمین نمیکند همان رفتار در Terminal، Container یا Pipeline تولید برقرار باشد.
پرسش 2: برای شروع یادگیری Console.ReadKey() چه پیشنیازهایی لازم است؟
آشنایی مقدماتی با نوعهای پایه C#، متد Main، مدیریت استثنا و مفهوم جریانهای استاندارد کافی است. سپس میتوان مثالهای این مقاله را در یک پروژه Console جدید اجرا کرد و هر بار فقط یک متغیر را تغییر داد تا تفاوت رفتار روشن بماند.
پرسش 3: Console.ReadKey() در نرمافزار تجاری چه کاربردی دارد؟
در ابزارهای مدیریتی، برنامههای خط فرمان، Workerهای عملیاتی و فرایندهای نصب یا مهاجرت داده میتواند مفید باشد. در محصول تجاری باید خروجی قابل پایش، محدود و بدون داده حساس باشد و برای گزارش رسمی، زیرساخت Logging و Telemetry در نظر گرفته شود.
پرسش 4: آیا استفاده از Console.ReadKey() هزینه توسعه پروژه را کاهش میدهد؟
برای نمونه اولیه و ابزار داخلی، API ساده Console زمان توسعه را کم میکند؛ اما اگر نیازهایی مانند جستوجوی لاگ، سطح دسترسی، نگهداری تاریخچه، مانیتورینگ یا رابط چندسکویی وجود دارد، طراحی حرفهای اولیه از هزینه بازنویسی آینده جلوگیری میکند.
پرسش 5: تفاوت رویکرد Console.ReadKey() با ILogger چیست؟
Console.ReadKey() مستقیماً با محیط Console کار میکند، درحالیکه ILogger پیام ساختیافته را از طریق Provider، Category و LogLevel هدایت میکند. برای ابزار کوچک Console API کافی است؛ برای ASP.NET Core و سرویس Production معمولاً ILogger انتخاب قابل کنترلتری است.
پرسش 6: برای پیادهسازی حرفهای Console.ReadKey() در پروژه موجود چه مراحلی لازم است؟
ابتدا سناریوی واقعی، پلتفرمها، Redirect شدن ورودی یا خروجی و الزامات کارایی مشخص میشود. سپس یک Wrapper قابل آزمون، مدیریت خطا، تست روی میزبان هدف و پایش حجم خروجی افزوده میشود؛ مشاوره فنی در پروژههای سازمانی میتواند این تصمیمها را با معماری کل سیستم هماهنگ کند.
پرسش 7: رایجترین خطا هنگام کار با Console.ReadKey() چیست؟
وقتی ورودی Redirect شده باشد یا برنامه محیط تعاملی واقعی نداشته باشد، ReadKey انتخاب مناسبی نیست و ممکن است استثنا ایجاد کند. راه حل، اعتبارسنجی پیششرطها، مدیریت استثناهای مشخص و داشتن مسیر جایگزین برای محیطی است که Console تعاملی ندارد. گرفتن همه Exceptionها بدون ثبت و تحلیل، خطا را پنهان میکند و توصیه نمیشود.
پرسش 8: Console.ReadKey() چه اثری بر Performance دارد؟
این متد مسدودکننده است؛ برای UI واکنشگرا، سرویس پسزمینه یا وب از مدل رویدادی یا ورودی غیرمسدودکننده مناسب همان محیط استفاده کنید. معیار درست، اندازهگیری زمان، تعداد فراخوانی، حجم بایت و رفتار p95 در محیط واقعی است. Microbenchmark تنها بخشی از تصویر را نشان میدهد و باید با Load Test و مشاهده مقصد I/O کامل شود.
پرسش 9: بهترین روش استفاده از Console.ReadKey() چیست؟
برای پنهان کردن Echo از intercept:true استفاده کنید، Escape را برای خروج تعریف کنید و پیش از استفاده، تعاملی بودن محیط را بسنجید. همچنین کد Console را پشت یک abstraction کوچک قرار دهید تا تست واحد بتواند TextReader یا TextWriter مصنوعی تزریق کند و وابستگی مستقیم لایه Domain به محیط اجرای فرایند کاهش یابد.
پرسش 10: Console.ReadKey() با کدام نسخههای C# و .NET سازگار است؟
اعضای اصلی کلاس System.Console سابقه طولانی در .NET دارند، ولی سطح پشتیبانی قابلیتهای پنجره، صدا، رنگ و ورودی تعاملی میان سیستمعاملها و میزبانها یکسان نیست. پروژه باید Target Framework و مستندات همان نسخه را بررسی و رفتار را روی Windows، Linux یا Container هدف آزمایش کند.
سؤالهای مصاحبه
سؤال مصاحبه 1
نوع بازگشتی، اثر جانبی و منبع یا مقصد داده در Console.ReadKey() را توضیح دهید.
سؤال مصاحبه 2
اگر ورودی یا خروجی برنامه Redirect شده باشد، طراحی شما برای Console.ReadKey() چگونه تغییر میکند؟
سؤال مصاحبه 3
چه استثناها یا حالتهای مرزی را پیش از استفاده Production از Console.ReadKey() آزمایش میکنید؟
سؤال مصاحبه 4
چگونه کدی که مستقیماً به Console.ReadKey() وابسته است را قابل تست واحد میکنید؟
سؤال مصاحبه 5
در چه شرایطی ILogger، TextReader یا TextWriter را به Console.ReadKey() ترجیح میدهید؟
سؤال مصاحبه 6
برای سنجش کارایی Console.ReadKey() چه شاخصها و چه محیط آزمایشی انتخاب میکنید؟
چکلیست نهایی
- Syntax و نوع بازگشتی Console.ReadKey() را با Target Framework پروژه تطبیق دادهام.
- حالت تعاملی، Redirect شده، EOF یا محدودیت پلتفرم را آزمایش کردهام.
- هیچ داده حساس یا شخصی بدون ضرورت وارد خروجی و لاگ نمیشود.
- برای خطاهای قابل انتظار مسیر جایگزین و پیام قابل فهم وجود دارد.
- تعداد فراخوانیها و حجم I/O در بار واقعی اندازهگیری شده است.
- کد وابسته به Console از منطق Domain جدا و قابل تست است.
- تغییرات موقت رنگ، عنوان، مکاننما و ابعاد در پایان بازیابی میشوند.
خدمات برنامهنویسی و پایگاه داده
برنامهنویسی اصفهان با بیش از سه دهه تجربه از سال ۱۳۷۵، سفارش طراحی نرمافزار، آموزش برنامهنویسی C# و .NET، آموزش و توسعه SQL Server، سامانههای تحت وب و راهکارهای سازمانی را میپذیرد.
برای مشاوره، آموزش یا سفارش پروژه برنامهنویسی و پایگاه داده میتوانید با شماره 09131253620 تماس بگیرید. در مشاوره فنی، معماری، امنیت، کارایی، تستپذیری و امکان نگهداری راهکار بهصورت یکپارچه بررسی میشود.
- انجام پروژههای C#، ASP.NET Core، WinForms، WPF و سرویسهای پسزمینه
- طراحی و بهینهسازی پایگاه داده SQL Server و گزارشهای مدیریتی
- آموزش برنامهنویسی، رفع خطا و بازبینی معماری نرمافزار
- تولید ابزارهای خط فرمان، اتوماسیون سازمانی و سامانههای مانیتورینگ
جمعبندی
Console.ReadKey() وقتی ارزشمند است که قرارداد آن، محدودیت محیط و اثر کارایی آن روشن باشد. متد Console.ReadKey فشردن یک کلید یا کلید تابعی را دریافت میکند و ConsoleKeyInfo شامل نویسه، کد کلید و Modifierها را تحویل میدهد. با اعتبارسنجی، مدیریت خطا، جداسازی معماری و تست روی میزبان واقعی میتوان از سادگی Console بهره برد و در عین حال کیفیت Production را حفظ کرد.
برای مرور همه APIهای این مجموعه به مقاله مادر توابع Console در C# و .NET بازگردید.