نحوه استفاده از String.Create در سی شارپ

سه شنبه 17 خرداد 1401

مدیریت رشته ها یکی از مهمترین بخش های عملکردی در هر اپلیکیشن به خصوص اپلیکیشن های سی شارپ به شمار می آید. از آنجایی که رشته ها تغییر ناپذیر هستند شما می توانید به راحتی طیف گسترده ای از اشیا رشته ها را جمع آوری کنید. همین عامل نیز باعث می شود تا تخصیص منابع حافظه انجام شده و در نتیجه این موضوع به میزان زیادی روی عملکرد برنامه و اپلیکیشن شما تاثیرگذار خواهد بود.

 نحوه استفاده از String.Create در سی شارپ

زمانی که شما رشته ها را به اپلیکیشن خود اضافه می کنید یا زمانی که زیر رشته ها را از یک رشته استخراج می کنید نمونه های جدیدی را از رشته های خود ایجاد می کنید. زمانی که عملیاتی مانند الحاق رشته را اجرا می کنید به جای استفاده مجدد از موارد موجود، اشیا رشته های جدیدی را ایجاد می کنند. امروزه شما می توانید از کلاس StringBuilder برای بهم پیوستن رشته ها و همینطور کاهش نمونه های ایجاد شده در طول انجام عملیات ها روی رشته ها استفاده کنید که باعث کاهش تخصیص دهی می شود.

استفاده از String.Create در سی شارپ

مطالبی که در این مطلب مطالعه خواهید کرد شامل کار کردن با رشته ها می باشد که در واقع ما در این مطلب قصد داریم از متد String.Create برای این کار استفاده کنیم. این در حالی است که فشرده سازی رشته یک تکنیک عالی برای کاهش مصرف منابع به طور کلی است. String.Create روش دیگری است که می توانید از آن برای مدیریت کارآمد رشته ها در پروژه های سی شارپ خود استفاده کنید ولی باید دقت داشته باشید که این کار تنها در شرایط خاصی قابل انجام است.

برای کار کردن با نمونه کدهای ارائه شده در این محتوا شما باید نسخه 2022 ویژوال استودیو را روی سیستم خود نصب کنید. اگر پیش از این نسخه ای از این ابزار را تهیه نکرده اید بهتر است که ابتدا این ابزار را دانلود و نصب کنید.

ساخت یک پروژه کنسول در ویژوال استودیو 2022

پیش از هر چیز شما باید یک پروژه اپلیکیشن کنسول NET core. را در محیط ویژوال استودیو ایجاد کنید. با فرض این که شما ویژوال استودیو 2022 را روی سیستم خود نصب کرده اید مراحلی که در ادامه بیان می کنیم را باید طی کنید تا بتوانید این کار را به بهترین شکل ممکن انجام دهید:

-          IDE ویژوال استودیو را ایجاد کنید.

-          روی گزینه Create a new project کلیک کنید.

-          در پنجره Create a new project که برای شما باز می شود Console App را از لیست قالب هایی که برای شما باز می شود انتخاب کنید.

-          در ادامه روی گزینه Next کلیک کنید.

-          در پنجره Configure your new project که برای شما نمایش داده می شود نام و مکان پروژه جدید خود را مشخص کنید.

-          در پنجره Additional Information روی گزینه NET 6.0. کلیک کنید تا ران تایم مربوطه را انتخاب کرده باشید و در ادامه روی Next کلیک کنید.

-          روی گزینه Create کلیک کنید.

با ایجاد این پروژه در ویژوال استودیو شما آماده کار کردن با String.Create در سی شارپ خواهید بود.

آشنایی با <Span<T و <Memory<T

<Span<T و <Memory<T ساختارهایی هستند که به نسخه های جدیدتر دات نت اضافه شده اند و به شما کمک می کنند تا بتوانید تخصیص های اپلیکیشن خود را به حداقل برسانید. آنها به عنوان یک نما روی یک رشته کار می کنند و علاوه بر این شما می توانید از آنها در آرایه ها یا بلوک های پیوسته نیز استفاده کنید. قابلیت read-only مربوط به ساختار <Span<T همان <ReadOnlySpan<T است و همینطور قابلیت read-only مربوط به ساختار <Memory<T نیز در واقع همان <ReadOnlyMemory<T است.

متد String.Create در زبان برنامه نویسی سی شارپ

متد String.Create در زبان برنامه نویسی سی شارپ در نسخه اخیر سی شارپ اضافه شده است. در ادامه بیان می کنیم که چگونه متد Create از کلاس String تعریف می شود:

public static string Create<TState> (int length, TState state, System.Buffers.SpanAction<char,TState> action);

دقت داشته باشید که متد String.Create به موارد زیر نیاز دارد:

-          طول رشته برای ایجاد کردن آن

-          داده ای که قصد قرار دادن آن رشته را دارید

-          تابع lambda که می تواند حالت را به یک رشته تبدیل کند.

String.Create بخشی از حافظه را به heap اختصاص می دهد تا دنباله ای از کاراکترها را از این طریق ذخیره سازی کند. اولین پارامتر مربوط به این متد طول رشته نهایی است. دومین پارامتری که این متد دریافت می کند وضعیتی است که برای ساخت شی مربوط به رشته مورد نظر به آن نیاز خواهید داشت. سومین پارامتری که این متد دریافت می کند نیز نماینده ای است که در واقع باید در heap اختصاص داده شده روی داده ها کار کند و شی نهایی مربوط به رشته را ایجاد کند.

نحوه کار کردن با متد String.Create

زمانی که متد String.Create را فراخوانی می کنید رشته جدیدی را ایجاد می کند که دارای اندازه ای از پیش تعریف شده است و اندازه آن نیز با استفاده از مقادیر آرگومان شما تبدیل می شود. از آنجایی که این متد عضوی از کلاس String  است می توان به نمونه کد <Span<char که نشان دهنده داده های کاراکتر داخلی در نمونه رشته جدید است اشاره کرد.

<Span<char خود یک pointer است که در داخل پشته قرار دارد اما می تواند روی حافظه پشته نیز به خوبی کار کند. action lambda که وظیفه heavy lifting رشته را بر عهده دارد در نهایت به شما بازگردانده می شود. به عبارت دیگر زمانی که اجرای تابع لامبدا کامل شد این متد مرجعی را به نمونه رشته جدیدی که ایجاد کرده بر می گرداند.

چه زمانی باید از متد String.Create استفاده کنیم؟

متد String.Create دارای چند کاربرد مخصوص در زبان برنامه نویسی سی شارپ است. در گام اول شما باید بدانید که از متد String.Create تنها در زمان های حیاتی از نظر عملکردی در اپلیکیشن خود استفاده کنید. در واقع شما باید تنها زمانی از String.Create استفاده کنید که بخواهید یک شی رشته ایجاد کنید که اندازه و قالب آن رشته برای شما مشخص است. به عنوان مثال فرض کنید که شما قصد دارید یک correlation Id را به یک فایل Log متصل کنید که این کار با هر فراخوانی برای هر یک از درخواست های کاربر صورت می گیرد. در چنین شرایطی شما ممکن است از این متد برای ایجاد کارآمد چنین نمونه هایی از رشته ها استفاده کنید. علاوه بر این شما می توانید از متد String.Create در سی شارپ برای ترکیب هایی که نسبت به عملکرد حساس هستند نیز استفاده کرده و از مزایای آنها بهره مند شوید.

نکاتی درباره استفاده از متد String.Create در سی شارپ

در ادامه قصد داریم یک مثال ساده از نحوه استفاده از متد String.Create در زبان برنامه نویسی سی شارپ را برای شما بیاوریم:

char[] buffer = { 'a', 'e', 'i', 'o', 'u' }; 
string result = string.Create(buffer.Length, buffer, (c, b) => { 
    for (int i = 0; i < c.Length; i++) c[i] = b[i]; 
});

در ادامه یک مثال دیگر را برای شما آورده ایم که نشان می دهد شما چگونه می توانید از String.Create برای ساخت correlation Idها استفاده کنید. برای این کار کافی است که قطعه کدی که در ادامه برای شما آورده ایم را در فایل Program.cs مربوط به اپلیکیشن کنسول خود وارد کنید.

private static readonly char[] charactersToEncode = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".ToCharArray();
private static string GetCorrelationId(long id)
    {
        return string.Create(10, id, (buffer, value) =>
        {
            char[] characters = charactersToEncode;
            buffer[9] = characters[(value >> 5) &amp; 31];
            buffer[8] = characters[(value >> 10) &amp; 31];
            buffer[7] = characters[(value >> 15) &amp; 31];
            buffer[6] = characters[(value >> 20) &amp; 31];
            buffer[5] = characters[(value >> 25) &amp; 31];
            buffer[4] = characters[(value >> 30) &amp; 31];
            buffer[3] = characters[(value >> 35) &amp; 31];
            buffer[2] = characters[(value >> 40) &amp; 31];
            buffer[1] = characters[(value >> 45) &amp; 31];
            buffer[0] = characters[(value >> 50) &amp; 31];
        });
    }

حال برای دریافت یک correlation Id جدید شما می توانید متد GetCorrelationId را فراخوانی کنید که این کار از طریق متد Main و به شکل زیر انجام می شود:

static async Task Main(string[] args)
    {
        Console.WriteLine(GetCorrelationId(DateTime.UtcNow.Ticks));
        Console.ReadKey();
    }

محدودیت های متد String.Create و بهترین شیوه ها برای حل این محدودیت ها در سی شارپ

زمانی که از متد String.Create در سی شارپ استفاده می کنید اول از همه باید محدودیت های آن را در نظر داشته باشید. شما باید اندازه رشته ای که قصد ایجاد کردن آن را دارید در اختیار داشته باشید که این مسئله در بسیاری از پروژه ها و شرایط مختلف امکان پذیر نیست. علاوه بر این زمانی که قصد استفاده از این متد در زبان برنامه نویسی سی شارپ را دارید باید دو نکته برتر را رعایت کنید. اولین نکته این است که سعی کنید حتما عملکرد برنامه خود را به خوبی محک بزنید تا اطمینان حاصل کنید که استفاده از String.Create عملا برای شما نتایج بهتری را به همراه خواهد داشت. نکته دوم این است که اگر از چندین محک برای وضعیت استفاده می کنید حتما سعی کنید از ValueTuples نیز استفاده کنید.

نکات پایانی درباره این متد

نکته مهم دیگری که در زمان استفاده از این متد در سی شارپ باید به آن دقت داشته باشید این است که استفاده از این متد ممکن است در برخی از سناریوهای خاص گزینه چندان مطلوبی به نظر نرسد. زمانی که خوانایی کدها برای شما از اهمیت بالایی برخوردار است به هیچ وجه نباید از این متد استفاده کنید. بنابراین تصمیم گیری برای این که شما باید از این متد استفاده کنید یا خیر در واقع جدالی بین جنبه های مثبت و منفی آن است. توصیه ای که در این جا برای شما داریم این است که ابتدا کدهای خود را به خوبی محک بزنید، نتایج را به خوبی مشاهده کرده و سپس اقدام به تصمیم گیری کنید. 

 

برنامه نویسان

نویسنده 3352 مقاله در برنامه نویسان
  • C#.net
  • 253 بازدید
  • 1 تشکر

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

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید