آرزو باقری
آرزو باقری
خواندن ۶ دقیقه·۹ ماه پیش

ویژگی Collection Expressions در سی شارپ 12

در نسخه 12 زبان سی شارپ ، ویژگی های جدیدی اضافه شده است ، یکی از این ویژگی ها Collection Expressions می باشد. این ویژگی به ما امکان می دهد مقداردهی اولیه به مجموعه ها را با یک نحو کوتاه انجام دهیم.

نمونه هایی از این قابلیت ها عبارتند از :

1) آرایه ها : تعریف آرایه با مقادیر اولیه

2) استفاده از Spread Operator برای ترکیب آرایه ها

3) لیست ها : تعریف لیست با مقادیر اولیه

قبل از اینکه به مثال ها بپردازیم ، ببینیم مشکل سی شارپ 11 چی بوده و Collection Expression اومده چی رو برامون حل کنه؟ قبلنا وقتی می خواستیم با Collection ها کار کنیم و این Collection ها فرقی نداره ، آرایه باشه ، Span , ReadOnlySpan , List یا ImmutableObject ، باشن ، هر چیزی که ماهیت یک مجموعه ، ماهیت یک Collection رو داره ، رفتارهای متفاوت یا Syntax متفاوتی داشته. به طور مثال : وقتی آرایه [ ] int می خواستیم بسازیم باید با { } initialize می کردیم ، همون رو می تونیم با [ ]new int هم initialize کنیم ، همون رو دوباره می تونستیم با new آرایه initialize کنیم. یعنی برای یه initialize کردن int سه روش متفاوت داریم :

public void Test() { int[] ints = { 1, 2, 3 }; int[] ints2 = new int[] { 1, 2, 3 }; int[] ints3 = new[] { 1, 2, 3 }; }

حالا عین همون رو برای Collection های متفاوت ، مثلا برای span یه مدل :

Span<int> span = new Span<int>(new[] { 1, 2, 3 });

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

List<int> list = new() { 1, 2, 3 };

یا مثلا برای ImmutableObject ها :

ImmutableArray<int> immutableArray = ImmutableArray.Create(new[] { 1, 2, 3 });

باید با ImmutableArray.Create یه object بسازیم. پس این تفاوت در Syntax ، تفاوت در نگاهی که به Collection ها داریم ، باعث گیج شدنمون میشه. اول ببینیم اصلا این Expression چیه؟ به این میگن یه Statement :

int[] ints = { 1, 2, 3 };

یعنی یک خط دستوری ، هر چیزی که اونور تساوی باشه ، ;{ 1,2,3 } ، بهش میگن Expression ، هر چیزی که بیاد اینور تساوی int[ ] ints ، بهش میگن Expression یا این شکلی <= int[ ] ints ، حالا Expression که داره روی Collection ها کار میکنه ، پس باید دنبال یه Syntax باشیم که اولا اینور تساوی باشه ، یعنی : ;{ 1,2,3 } دوما روی Collection ها باشه. خب حالا اگه همین Syntax رو تبدیل به دات نت 8 و سی شارپ 12 کنیم ، ببینیم چیکار می تونیم بکنیم ؟ اینکه این رو ;int[ ] ints = { 1, 2, 3 } ، وقتی آرایه است چرا initialize با { } باشه ؟ به عنوان یه Collection می بینیم که خودش هم یه کالکشن [ ] int ، پس عین همون رو استفاده کنیم و init کنیم :

int[] ints = [ 1, 2, 3 ];

در خط زیر هم ، هم چنین ، { } [ ]new int رو بر می داریم ، عین قبلی [ ] بکنیم :

int[] ints2 = [ 1, 2, 3 ];

و Syntax بعدی رو هم بر می داریم :

int[] ints3 = [ 1, 2, 3 ];

پس روی آرایه ها می بینیم که به یه شکل داریم کار می کنیم. روی Span ها قبلا Target Expression داشتیم، یعنی : Target Typed Expression ،،، Target Typed Expression میگه دیگه نیازی نیست جلوی new حتما اون Type رو بگی ، چون اینور میدونی چی هستش :

Span<int> span = new Span<int>(new[] { 1, 2, 3 });

پس می تونیم new Span<int>(new[ ] { }) رو برداریم :

Span<int> span = [ 1, 2, 3 ];

میبینیم که خود Span رو هم عین Array می تونیم init کنیم. این ReadOnlySpan هم همین طور :

ReadOnlySpan<int> span2 = stackalloc[] {1,2,3};

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

ReadOnlySpan<int> span2 = [1,2,3];

پس تمام Syntax ها یه شکل میشن. روی List ها هم همین :

List<int> list = [ 1, 2, 3 ];

مهم ترین قسمت روی ImmutableObject ها بود :

ImmutableArray<int> immutableArray = ImmutableArray.Create(new[] {1, 2, 3 });

روی این هم ، این قابلیت رو داریم که Simplified کنیم :

ImmutableArray<int> immutableArray = [1, 2, 3 ];

اما همچین چیزی نمی تونیم داشته باشیم :

var nums = [ 1, 2, 3 ];

همچین چیزی رو کامپایلر به ما اجازه نمیده ، چون گفتیم Target Typed Expression ، یعنی وقتی اینور تساوی Expression هستش ، باید بفهمه که این Collection رو باید به چی مپ کنه؟ اینور هنوز نمیدونه var nums !!! اگه ;int[ ] nums = [ 1, 2, 3 ] کنیم میفهمه.

آیا به عنوان پارامتر هم می تونیم Collection Expression بفرستیم بدون اینکه دوباره New کنیم ؟
Calculator calculator = new(); calculator.Sum([1,2,3]);

اوکی ، روی پارامتر هم می تونیم.

تا قبل از سی شارپ 12 ما می تونستیم این دو تا کاراکتر رو با همدیگه یک Array جدید بسازیم :

string hydrogen ="H";
string helium ="He";

string[ ] elements = new string[ ] { hydrogen, helium };

اما مشکلی که داشتیم توی سی شارپ 11 ، این بود که ما دو تا Array رو نمی تونستیم Concat کنیم ، نمی تونستیم به هم دیگه بچسبونیمش و یک Array جدید درست کنیم :


string[ ] vowels = new string[ ] { "a", "e", "i", "o", "u"};

string[ ] consonants = { "b", "c", "d", "z" };

یعنی vowels رو + consonants کنیم و یک Array جدید درست کنیم ، باید توی این vowels می چرخیدیم ، While می کردیم ، Foreach می کردیم و روی consonants هم Foreach می کردیم و روی Array سوم Append ش می کردیم. اما حالا می بینیم که می تونیم همه رو با همدیگه از قابلیت Collection Expression استفاده کنیم. اما اگه بخواییم Concat بکنیم چی؟! وقتی بخواییم Concat بکنیم یک دستور جدیدی اومده ، ابتدا همه رو به صورت Collection می کنیم که یه شکل بشن :

string[ ] vowels = [ "a", "e", "i", "o", "u" ];

string[ ] consonants = [ "b", "c", "d", "z" ];

می خواییم یه Array جدید درست کنیم :

string[] alphabet = [.. vowels, .. consonants];

اینجا یه دستور جدیدی اومده به نام Spread Element ، میگه شما با این دو تا .. (دات) میتونی بگی کل Element های Array اول + کل Element های Array دوم ، در قالب یه Collection جدید Append ش کن.

آیا این Spread Element رو می تونیم روی Condition ها هم داشته باشیم ؟ مثل این :
int x = 2; int y = 5; bool z = false; List<int> f = z ? [1, 2, 3] : []; List<int> final = [x, y, .. f];

پس می تونیم توی initialize کردن یه Collection ، هم int داشته باشیم و هم List ، در کنارش Spread کنیم با قابلیت Spread Element

همه این Collection Expression روی init کردن لیست های متفاوت ، روی ارسال به عنوان یک پارامتر ، در زمان return کردن ، در زمان init کردن روی ImmutableObject ها و ... قابلیت داره.
یکی از بهترین ویژگی هایی هستش که سی شارپ 12 در اختیارمون قرار داده.


سی شارپسی شارپ ۱۲collection expressionدات نت 8برنامه نویسی
علاقه مند به مهندسی نرم افزار
شاید از این پست‌ها خوشتان بیاید