StringValues: ابزاری فراتر از آرایههای رشتهای هوشمند
نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۸/۰۶ ۰۹:۴۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
StringValues از فضای نامی Microsoft.Extensions.Primitives دقیقاً برای حل این چالش طراحی شده است. این ساختار سبک، بهینه و انعطافپذیر، به توسعهدهندگان اجازه میدهد تا بدون نگرانی از تخصیص حافظه غیرضروری یا پیچیدگیهای مدیریت آرایه، با یک یا چند رشته به صورت یکپارچه کار کنند.?tag=csharp&tag=dotnet&tag=performance دریافت میکنید. یا در سرآیندهای HTTP، هدر Accept ممکن است چندین نوع MIME را شامل شود:Accept: text/html, application/xhtml+xml, application/xml
tag یا Accept) میتواند چندین مقدار داشته باشد. سؤال این است: چگونه این دادهها را به شکلی کارآمد، امن و خوانا در کد مدیریت کنیم؟StringValues، توسعهدهندگان معمولاً از ساختارهای عمومی مانند string[] یا List استفاده میکردند:// راهحل قدیمی string[] tags = context.Request.Query["tag"].ToArray();
null است، خالی است یا تکعنصری.string و string[] نیاز به کد اضافی داشت.StringValuesStringValues یک ساختار ارزشی/مقداری (value type) است که به صورت هوشمندانه یک یا چند رشته را نگهداری میکند. این ساختار در کتابخانههای ASP.NET Core بهطور گسترده استفاده میشود؛ بهویژه در IQueryCollection، IHeaderDictionary و IFormCollection.StringValues| ویژگی | توضیح |
| تک یا چندمقداری | میتواند یک string یا یک string[] را نمایندگی کند |
| تبدیل ضمنی | به string یا string[] به صورت خودکار تبدیل میشود |
| اندیسگذاری و تکرارپذیری | مثل آرایه عمل میکند: values[0]، foreach |
| عملکرد بالا | تخصیص حافظه بسیار کم؛ حتی در حالت تکعنصری |
| پشتیبانی از کلید دیکشنری | میتواند به عنوان کلید در Dictionary استفاده شود |
using Microsoft.Extensions.Primitives; StringValues greeting = "سلام، دنیا!"; // دسترسی مستقیم Console.WriteLine(greeting); // خروجی: سلام، دنیا! Console.WriteLine(greeting[0]); // خروجی: سلام، دنیا!
نکته: حتی با یک مقدار، نیازی به ایجاد آرایه نیست.
StringValues tags = new StringValues(new[] { "csharp", "dotnet", "performance" });
// دسترسی با اندیس
Console.WriteLine(tags[1]); // خروجی: dotnet
// تکرار با foreach
foreach (var tag in tags)
{
Console.WriteLine(tag);
}StringValues fruits = new StringValues(new[] { "سیب", "موز", "گیلاس" });
string[] array = fruits; // تبدیل ضمنی!
foreach (var fruit in array)
{
Console.WriteLine(fruit);
}StringValues empty = StringValues.Empty;
if (StringValues.IsNullOrEmpty(empty))
{
Console.WriteLine("هیچ مقداری وجود ندارد");
}نکته:StringValues.Emptyیک نمونه ایستا و بهینهشده است که معادلdefault(StringValues)است و نیازی بهnewندارد.
var cache = new Dictionary<StringValues, string>();
StringValues key = new StringValues(new[] { "user", "123" });
cache[key] = "دادههای کششده";
Console.WriteLine(cache[key]);این قابلیت در سناریوهای کلید ترکیبی (مثل ترکیب کاربر + نقش) بسیار مفید است.
[HttpGet]
public IActionResult Search([FromQuery] string[] tag)
{
StringValues tags = Request.Query["tag"]; // خودکار StringValues است
return Ok(tags);
}در اینجا،Request.Query["tag"]از نوعStringValuesاست؛ حتی اگر فقط یک مقدار ارسال شود.
StringValues.Empty به جای new StringValues() استفاده کنید.string[] فقط در صورت نیاز استفاده کنید؛ در اکثر موارد، مستقیماً با StringValues کار کنید.Count و اندیسگذاری استفاده کنید تا از تخصیصهای IEnumerator جلوگیری شود.for (int i = 0; i < values.Count; i++)
{
Console.WriteLine(values[i]);
}StringValues چیزی فراتر از یک “آرایه رشتهای هوشمند” است؛ این یک ابزار بهینهسازیشده برای دنیای واقعی وب است. با پشتیبانی از تبدیل ضمنی، اندیسگذاری، تکرارپذیری و عملکرد بالا، این ساختار به شما اجازه میدهد کد تمیزتر، سریعتر و کممصرفتر بنویسید.StringValues بهترین دوست شماست. از امروز، به جای string[] یا List رشتهای، در سناریوهای وب از StringValues استفاده کنید؛ تفاوت را در عملکرد و خوانایی کد حس خواهید کرد.string و string[]StringValues، مدیریت رشتههای چندمقداری دیگر یک چالش نیست؛ بلکه یک فرصت برای نوشتن کدی حرفهایتر است.