- Linux support for tier-1, mission-critical workloads – SQL Server 2017 support for Linux includes the same high availability solutions on Linux as Windows Server, including Always On availability groups integrated with Linux native clustering solutions like Pacemaker.
- Graph data processing in SQL Server – With the graph data features available in SQL Server 2017and Azure SQL Database, customers can create nodes and edges, and discover complex and many-to-many relationships.
- Adaptive query processing – Adaptive query processing is a family of features in SQL Server 2017 that automatically keeps database queries running as efficiently as possible without requiring additional tuning from database administrators. In addition to the capability to adjust batch mode memory grants, the feature set includes batch mode adaptive joins and interleaved execution capabilities.
- Python integration for advanced analytics – Microsoft Machine Learning Services now brings you the ability to run in-database analytics using Python or R in a parallelized and scalable way. The ability to run advanced analytics in your operational store without ETL means faster time to insights for customers while easy deployment and rich extensibility make it fast to get up and running on the right model.
اشتراکها
نگهداری WPF به تیمی در هند واگذار شد
اشتراکها
Marten 3.0 منتشر شد
Marten 3.0 is live on Nuget. It didn’t turn out to be a huge release, but we needed to accommodate the Npgsql 4.* dependency and I felt like that was a breaking change, so here we go.
اشتراکها
ویدیوهای NET Conf 2021.
These are the customer-reported issues addressed in this version:
Visual Studio crashes when you open a solution with a test project.
Visual Studio Freezes in Debug with Chrome.
Failure to install HelpViewer.
UI delay while typing R code.
C# 7.0 Regression in Tuples.
Xamarin - Dynamic Type Platform not supported exception.
Xamarin – Dynamic object is not supported.
Xamarin - Xamarin.iOS: ArgumentNullException for instruction parameter in Mono.Linker's MarkException() method.
نگاهی به روند تکاملی نحوهی تعریف خواص از C# 1.0 تا C# 9.0
در C# 1.0 برای تعریف خواص، نیاز به نوشتن مقدار زیادی کد بود:
در اینجا تعریف backing fieldها (مانند public string _firstName) و استفادهی دستی از آنها الزامی بود.
در C# 2.0 از لحاظ ساده سازی این تعاریف، اتفاق خاصی رخنداد. فقط امکان تعریف سطوح دسترسی مانند private بر روی getterها و setterها میسر شد:
در C# 6.0، امکان حذف private setterها از تعریف یک خاصیت میسر شد. یعنی مثال زیر را
به این نحو سادهتر و واضحتر نیز میتوان نوشت:
بهعلاوه در همین زمان بود که امکان مقدار دهی اولیهی خواص نیز در همان سطر تعریف آنها ممکن شد:
پیش از این برای مقدار دهی اولیهی خواص در همان کلاسی که آنها را تعریف میکند، میبایستی از طریق مقدار دهی آنها در سازندهی کلاس اقدام میشد.
همچنین در C# 6.0 با معرفی expression bodied members که بر روی خواص نیز قابل اعمال است، امکان تعریف خواص readonly محاسبه شدهی بر اساس مقدار سایر خواص نیز میسر شد:
و در C# 9.0، با معرفی واژهی کلیدی init، امکان تعریف سادهتر خواص immutable ممکن شدهاست که در مطلب جاری به آن خواهیم پرداختیم.
روش غیرقابل مقدار دهی کردن خواص، در نگارشها پیش از C# 9.0
در بسیاری از موارد میخواهیم که خاصیتی از یک کلاس مدل، در خارج از آن قابل تغییر نباشد (مانند خواص شیءای که به محتوای فایل config ثابت برنامه اشاره میکند). راه حل فعلی آن تا پیش از C# 9.0 به صورت زیر است:
که در این حالت دیگر نمیتوان مقدار خاصیت Name را در خارج از کلاس User مقدار دهی کرد:
وبا اینکار خطای کامپایلر زیر را دریافت میکنیم:
در این تعریف باتوجه به وجود private set، برای مقداردهی خاصیت Name میتوان از یکی از دو روش زیر در داخل کلاس User استفاده کرد:
- تنظیم مقدار خاصیت Name در سازندهی کلاس
- و یا تنظیم این مقدار در یک متد ثالث دیگر مانند SetName
در هر دو حالت، از مقدار دهی مستقیم خاصیت Name توسط Object Initializer (یا همان روش متداول new User { Name = "some name"}) محروم میشویم. همچنین در ادامه شاید نیاز باشد که این خاصیت پس از مقدار دهی اولیه، دیگر قابل تغییر نباشد؛ یا به عبارتی immutable شود. در مثال فوق هنوز هم امکان تغییر مقدار خاصیت Name درون کلاس User، با فراخوانیهای بعدی متد SetName، وجود دارد.
معرفی خواص Init-Only در C# 9.0
برای رفع دو مشکل یاد شده (امکان تنظیم مقدار خاصیتها با همان روش متداول object initializer و همچنین غیرقابل تغییر شدن آنها)، اکنون در C# 9.0 میتوان بجای private set از واژهی کلیدی init استفاده کرد:
در اینجا تنها تغییر صورت گرفته، استفاده از واژهی کلیدی init، در حین تعریف خاصیت Name است. به این ترتیب به دو مزیت زیر دسترسی پیدا میکنیم:
الف) امکان مقدار دهی خاصیت Name، در خارج بدنهی کلاس User و توسط روش متداول کار با object initializerها هنوز هم وجود دارد و در این حالت الزامی به تعریف یک سازنده و یا متد خاصی درون کلاس User برای مقدار دهی آن نیست:
ب) پس از اولین بار مقدار دهی این خاصیت init-only، دیگر نمیتوان مقدار آنرا تغییر داد:
این نکته در مورد متدهای داخل کلاس User هم صدق میکند:
میتوان یک خاصیت init-only را برای بار اول، در سازندهی همان کلاس نیز مقدار دهی کرد؛ اما مقدار دهی ثانویهی آن در سایر متدهای داخل کلاس User نیز به خطای زمان کامپایل یاد شده، ختم میشود و مجاز نیست.
روش تعریف immutable properties در نگارشهای پیشین #C
با استفاده از واژهی readonly در نگارشهای قبلی #C نیز میتوان به صورت زیر، یک خاصیت را به صورت غیرقابل تغییر یا immutable در آورد:
هرچند این روش کار میکند اما دیگر همانند init-only properties نمیتوان از طریق object initializers خاصیت Name را مقدار دهی کرد و این مقدار دهی حتما باید از طریق سازندهی کلاس باشد. همچنین ایجاد یک اصطلاحا backing filed هم برای آن، کدها را طولانیتر میکند.
یک نکته: امکان استفادهی از فیلدهای readonly با خواص init-only هم وجود دارد؛ از این جهت که این نوع خواص تنها در زمان نمونه سازی اولیهی شیء، اجرا و مقدار دهی میشوند، با مفهوم readonly، سازگاری دارند:
در C# 1.0 برای تعریف خواص، نیاز به نوشتن مقدار زیادی کد بود:
public class Person { public string _firstName; public string FirstName { get { return _firstName; } set { _firstName = value; } } }
در C# 2.0 از لحاظ ساده سازی این تعاریف، اتفاق خاصی رخنداد. فقط امکان تعریف سطوح دسترسی مانند private بر روی getterها و setterها میسر شد:
public string _firstName; public string FirstName { get { return _firstName; } private set { _firstName = value; } }
در C# 3.0 بود که با ارائهی auto-implemented properties، نحوهی تعریف خواص، بسیار ساده شد و دیگر نیازی به تعریف backing fieldها نبود؛ چون کامپایلر به صورت خودکار آنها را در پشت صحنه ایجاد میکرد/میکند:
public class Person { public string FirstName { get; set; } }
در C# 6.0، امکان حذف private setterها از تعریف یک خاصیت میسر شد. یعنی مثال زیر را
public class User { public string Name { get; private set; } }
public class User { public string Name { get; } }
public class Foo { public string FirstName { get; set; } = "Initial Value"; }
همچنین در C# 6.0 با معرفی expression bodied members که بر روی خواص نیز قابل اعمال است، امکان تعریف خواص readonly محاسبه شدهی بر اساس مقدار سایر خواص نیز میسر شد:
public class Foo { public DateTime DateOfBirth { get; set; } public int Age => DateTime.Now.Year - DateOfBirth.Year; }
و در C# 9.0، با معرفی واژهی کلیدی init، امکان تعریف سادهتر خواص immutable ممکن شدهاست که در مطلب جاری به آن خواهیم پرداختیم.
روش غیرقابل مقدار دهی کردن خواص، در نگارشها پیش از C# 9.0
در بسیاری از موارد میخواهیم که خاصیتی از یک کلاس مدل، در خارج از آن قابل تغییر نباشد (مانند خواص شیءای که به محتوای فایل config ثابت برنامه اشاره میکند). راه حل فعلی آن تا پیش از C# 9.0 به صورت زیر است:
public class User { public string Name { get; private set; } }
var user = new User { Name = "User 1" // Compile Error };
The property or indexer 'User.Name' cannot be used in this context because the set accessor is inaccessible [CS9Features]csharp(CS0272)
- تنظیم مقدار خاصیت Name در سازندهی کلاس
- و یا تنظیم این مقدار در یک متد ثالث دیگر مانند SetName
public class User { public User(string name) { this.Name = name; } public void SetName(string name) { this.Name = name; } public string Name { get; private set; } }
معرفی خواص Init-Only در C# 9.0
برای رفع دو مشکل یاد شده (امکان تنظیم مقدار خاصیتها با همان روش متداول object initializer و همچنین غیرقابل تغییر شدن آنها)، اکنون در C# 9.0 میتوان بجای private set از واژهی کلیدی init استفاده کرد:
public class User { public string Name { get; init; } }
الف) امکان مقدار دهی خاصیت Name، در خارج بدنهی کلاس User و توسط روش متداول کار با object initializerها هنوز هم وجود دارد و در این حالت الزامی به تعریف یک سازنده و یا متد خاصی درون کلاس User برای مقدار دهی آن نیست:
var user = new User { Name = "User 1" };
// Compile Time Error // Init-only property or indexer 'User.Name' can only be assigned in an object initializer, // or on 'this' or 'base' in an instance constructor or an 'init' accessor. [CS9Features]csharp(CS8852) user.Name = "Test";
public class User { public string Name { get; init; } public User(string name) { this.Name = name; // Works fine } public void SetName(string name) { this.Name = name; // Compile Time Error } }
روش تعریف immutable properties در نگارشهای پیشین #C
با استفاده از واژهی readonly در نگارشهای قبلی #C نیز میتوان به صورت زیر، یک خاصیت را به صورت غیرقابل تغییر یا immutable در آورد:
public class Product { public Product(string name) { _name = name; } private readonly string _name; public string Name => _name; }
یک نکته: امکان استفادهی از فیلدهای readonly با خواص init-only هم وجود دارد؛ از این جهت که این نوع خواص تنها در زمان نمونه سازی اولیهی شیء، اجرا و مقدار دهی میشوند، با مفهوم readonly، سازگاری دارند:
public class Person { private readonly string _name; public string Name { get => _name; init => _name = value; } }
اشتراکها
مقایسهای بین قابلیتهای #C و #F
اشتراکها
کتاب C# Succinctly
با سلام؛ قبل از هر چیز ممنون از آموزش خوبتون. یک سوال در رابطه با قسمت اول این آموزش داشتم. من دقیقا با آموزش شما پیش رفتم و در قسمت هفتم آموزشتون در اجرای پروژه دچار مشکل شدم و در مرورگرم با خطای زیر مواجه شدم:
HTTP Error 403.14 - Forbidden The Web server is configured to not list the contents of this directory. Most likely causes: A default document is not configured for the requested URL, and directory browsing is not enabled on the server. Things you can try: If you do not want to enable directory browsing, ensure that a default document is configured and that the file exists. Enable directory browsing using IIS Manager. Open IIS Manager. In the Features view, double-click Directory Browsing. On the Directory Browsing page, in the Actions pane, click Enable. Verify that the configuration/system.webServer/directoryBrowse@enabled attribute is set to true in the site or application configuration file. Detailed Error Information: Module DirectoryListingModule Notification ExecuteRequestHandler Handler StaticFile Error Code 0x00000000 Requested URL http://localhost:80/3724/ Physical Path C:\inetpub\wwwroot\3724\ Logon Method Anonymous Logon User Anonymous