OneDev is an open source git hosting and CI/CD server. Unlike traditional code hosting platforms, it parses C# code to enable symbol search and navigation, both in source view and diff view
فریمورک دات نت به صورت متن باز بر روی گیت هاب
میتوانید از net SmokeTest. برای این منظور بدون نوشتن حتی یک خط کد استفاده کنید.
نکته جالب اینکه این ابزار به شکل افزونه برای NET Reflector. نیز فراهم شده است.
در نگارشهای اخیر داتنت، NET CLI. به همراه تغییرات قابل توجهی بودهاست که در این مطلب و نظرات آن، موارد مهم این تغییرات را بررسی خواهیم کرد.
console logger بهبود یافتهی داتنت 8
یکی از تغییرات بسیار جالب توجه و مفید NET CLI. در داتنت 8، امکان دسترسی به خروجی لاگهای ساختار یافتهی اعمال خط فرمان آن است:
اگر پروژهی خود را با استفاده از دستور dotnet build، کامپایل میکنید، خروجی پیشفرض این دستور خط فرمان، کلی و بدون ارائهی جزئیات است؛ اما میتوان آنرا در داتنت 8، به شکل تصویر فوق، تغییر داد و به این مزایا رسید:
- امکان مشاهدهی زمان کامپایل هر قسمت به صورت جداگانه
- امکان مشاهدهی پویای درصد انجام عملیات
- امکان مشاهدهی جزئیات کامپایل هر target framework به صورت مجزا
- دسترسی به یک خروجی رنگی و زیباتر
این خروجی را که به صورت پیشفرض فعال نیست، میتوان به دو صورت:
الف) سراسری و با اجرای دستور PowerShell زیر:
[Environment]::SetEnvironmentVariable("MSBUILDTERMINALLOGGER", "auto", "User")
که متغیر محیطی MSBUILDTERMINALLOGGER را به auto تنظیم میکند،
ب) و یا با استفاده از سوئیچ tl-- به ازای هر دستور dotnet build، به صورت جداگانهای فعال کرد:
dotnet build --tl
یک نکته: این قابلیت جالب و مهم، در دات نت 9، به صورت پیشفرض فعال است و نیازی به تنظیم خاصی ندارد.
object text1 = "test"; object text2 = "test"; object num1 = 1; object num2 = 1; Console.WriteLine("text1 == text2 : " + (text1 == text2)); Console.WriteLine("num1 == num2 : " + (num1 == num2));
به نظر شما چه چیزی در خروجی نمایش داده میشود؟
خطی که text2 تعریف شده است را تغییر میدهیم :
object text2 = "test".ToLower();
اما چرا در کد اولی اینگونه نبود؟
بنابراین text1 و text2 در کد اولی واقعا یکی هستند و یک نمونه برای آنها ایجاد شده است.
البته چند نکته در اینجا هست :
اگر text1 و text2 به صورت string تعریف شوند، نتیجه text1==text2 در هر دو حالت فوق برابر true است. چون عملگر == در کلاس string یکبار دیگر overload شده است:
public sealed class String : ... { ... public static bool operator ==(string a, string b) { return string.Equals(a, b); } ... }
این که کدام یک از overloadها اجرا شوند (کلاس پایه، کلاس اصلی، ...) به نوع دو متغییر اطراف == بستگی دارد. مثلا در کد زیر :
string text1 = "test"; string text2 = "test".ToLower(); Console.WriteLine("text1 == text2 (string) : " + (text1 == text2)); Console.WriteLine("text1 == text2 (object) : " + ((object)text1 == (object)text2));
اولین نتیجه true و دومی false است. چون در اولی عملگر == تعریف شده در کلاس string مورد استفاده قرار میگیرد اما در دومی عملگر == تعریف شده در کلاس object.
اگر دقت نشود این رفتار مشکلزا میشود. مثلا حالتی را در نظر بگیرید که text1 ورودی کاربر است و text2 از بانک اطلاعاتی خوانده شده است و با اینکه مقادیر یکسان دارند نتیجه == آنها false است. اگر تعریف عملگرها در کلاس object به صورت virtual بود و در کلاسهای دیگر override میشد، این تغییر نوعها تاثیری نداشت. اما عملگرها به صورت static تعریف میشوند و امکان override شدن ندارند. به همین خاطر کلاس object متدی به اسم Equals در اختیار گذاشته که کلاسها آنرا override میکنند و معمولا از این متد برای سنجش برابری دو کلاس استفاده میشود :
object text1 = "test"; object text2 = "test".ToLower(); Console.WriteLine("text1 Equals text2 : " + text1.Equals(text2)); Console.WriteLine("text1 Equals text2 : " + object.Equals(text1, text2));
یک مورد استفاده آن هنگام lock روی رشتههاست. برای مثال در کد زیر DeviceId یک رشته است که از بانک اطلاعاتی خوانده میشود و باعث میشود که چند job همزمان به یک دستگاه وصل نشوند :
lock (job.DeviceId) { job.Execute(); }
میتوان lock را اینگونه اصلاح کرد :
lock (string.Intern(job.DeviceId)) { job.Execute(); }
In September of 2014, at the ng-Europe conference, the Angular team announced what would be known as Angular 2.Is was a drastic change that left many developers angry. One of the main sources of complaint was the lack of a migration path.