آموزش رشته ها در سی شارپ به زبان ساده
یک رشته در واقع قسمتی از یک متن می باشد. رشته معمولاً شامل دو کاراکتر یا بیشتر می باشد؛ زمانی که می خواهید یک کاراکتر به کار ببرید؛ باید در عوض از یک Char استفاده کنید. با این حال، رشته ها را می توان به صورت خالی یا حتی تهی و پوچ به کار برد؛ چرا که آن یک نوع مرجع است.
یک رشته را می توان بیشتر شبیه انواع دیگر داده هایی بیان کرد که تاکنون با آنها کار کرده ایم:
string s;
اگر بخواهید می توانید هنگام تعریف آن؛ مقداری را نیز به آن اختصاص دهید:
string name = “John Doe”;
هر چیزی که در مجموعه ای از نقل قول های دوتایی در سی شارپ وجود داشته باشد، مانند مثال بالا یک رشته محسوب می شود – با قرار دادن یک یا چند کاراکتر بین نقل قول های دوتایی به سادگی می توانید به کامپایلر بگویید که موارد بین آن دو علامت نقل قول به جای مثلاً یک کلیدواژه یا یک فرمان؛ باید به عنوان یک رشته کامپایل شود.
رشته ها تغییر ناپذیر هستند
در سی شارپ، رشته ها تغییر ناپذیر هستند، که اساساً بدان معنی است که به محض ایجاد شدن ، آنها دیگر قابل تغییر نیستند. این امر بدیهی است که در استفاده روزانه چندان کاربردی نیست ، بنابراین این چارچوب به ما کمک می کند – به جای این که بخواهیم رشته های جدید را برای ایجاد تغییرات بکار گیریم ، به سادگی هر بار تغییر حالت فعلی ، رشته جدیدی را برای شما ایجاد می کند. این امر یک فرآیند یکپارچه را ایجاد می کند ، اما می تواند کد شما را حتی بدون این که خودتان متوجه شوید، کارآمدتر کند. در اینجا مثالی برای نمایش این موضوع آورده شده است:
string numbers = “”;
for (int i = 0; i < 10000; i++)
numbers += i.ToString();
در این مثال، ما ۱۰,۰۰۰ بار حلقه زدیم؛ که هر دفعه به شاخص فعلی رشته بستگی دارد. با دانشی که به دست آورده اید؛ اکنون می دانید که به جای تغییر رشته های موجود برای آنکه بتواند آخرین عدد را شامل شود؛ یک رشته جدید ایجاد می شود و سپس به متغیر قبلی تخصیص داده می شود؛ و مقدار قبلی توسط چارچوب پاک می شود. و این اتفاق ۱۰,۰۰۰ بار اتفاق می افتد. البته به طور کلی پیشنهاد می کنیم که اگر می دانید که می خواهید یک رشته را در چندین عملیات ایجاد کنید؛ از یک به اصطلاح StringBuilder استفاده کنید:
StringBuilder numbers = new StringBuilder();
for (int i = 0; i < 10000; i++)
numbers.Append(i);
Console.WriteLine(numbers.ToString());
عملیات اساسی روی رشته
با تمام این حرفها در مورد رشته های غیرقابل تغییر ، شما همچنان خواهید دید که به دستکاری و کار با رشته های ساده مشغول خواهید شد. از این بابت نگران نباشید – مگر اینکه در حال کار با یک حلقه غول پیکر هستید- زیرا احتمالاً مشکلی نخواهید داشت. در اینجا برخی از عملیات اساسی که می توانید روی رشته ها انجام دهید آورده شده است:
می توانید دو یا چند رشته را به سادگی با “اضافه کردن” آنها (با استفاده از عملگر به علاوه) به هم الحاق کنید:
string name = “John” + ” ” + “Doe”;
می توانید همین کار را با متغیرها انجام دهید؛ یعنی رشته هایی که درون نقل قول های دوتایی بیان می شوند؛ و متغیرهایی که یا رشته هستند یا می توانند به رشته ها تبدیل شوند (با استفاده از متد ToString() که در همه اشیاء یافت می شود) با هم ترکیب کنید. با این حال ، روش بهتری برای انجام این کار با متد Format انجام می شود که در کلاس String وجود دارد:
string name = “John Doe”;
int age = 42;
string userString = String.Format(“{0} is {1} years old and lives in {2}”, name, age, “New York”);
توجه کنید که چگونه از متغیرهای شماره دار ({۰}, {۱},…) استفاده می کنیم و سپس مقادیر مربوط به آن را به عنوان پارامتر به متدها ارائه می دهم. فقط به یاد داشته باشید که ایندکس ها و میزان متغیرها باید با پارامترهای منتقل شده مطابقت داشته باشد!
ویژگی “Lenght” به شما امکان می دهد طول فعلی یک رشته رابه عنوان مثال برای اهداف اعتبارسنجی بررسی کنید. ویژگی طول همچنین در ترکیب با سایر ویژگی ها و متدها به عنوان مثال متدهای ()Substring و ()IndexOf بسیار مفید است. متد Substring به شما امکان می دهد بخشی از رشته را بازیابی کنید، در حالی که متد IndexOf به شما امکان می دهد اولین شاخص از یک کاراکتر / رشته را پیدا کنید. به مثال زیر توجه کنید:
string name = “John Doe”;
int indexOfSpace = name.IndexOf(‘ ‘) + 1;
string lastName = name.Substring(indexOfSpace, name.Length – indexOfSpace);
Console.WriteLine(lastName);
توضیح سریع: ما یک نام را تعریف کرده ایم؛ سپس از متد ()IndexOf برای یافتن موقعیت یک کاراکتر فضایی استفاده می کنیم. سپس از متد ()Substring استفاده می کنیم تا هرچیزی را بعد از کاراکتر فضایی به واسطه تهیه یک موقعیت شروع و نیز طول دریافت کنیم.
متد جالب کمک کننده دیگری که روی کلاس String وجود دارد؛ متد ()Replace می باشد. این متد به شما اجازه می دهد تا یک رشته را اتخاذ کرده و سپس یک عملیات جستجو/ جایگزینی را روی آن اعمال کنید:
string name = “John Doe”;
Console.WriteLine(name.Replace(“John”, “Jane”));
برنامه نویسی سی شارپ رو قورت بده! بدون کلاس، سرعت 2 برابر، ماندگاری 3 برابر، پولسازی با ساخت اپلیکیشن، توسعه وب ... دانلود:
متد ()Replace اصلاً سختگیر نیست – اگر رشته ای که در جستجوی آن هستید (اولین پارامتر) موجود نباشد، هیچ اتفاقی نخواهد افتاد (سیستم هیچ خطایی نمی دهد). در صورت وجود، پارامتر دوم جایگزین می شود. اما، اگر می خواهید قبل از جایگزینی؛ بررسی را انجام دهید؛ می توانید از روش ()Contains استفاده کنید:
string name = “John Doe”;
if (name.Contains(“John”))
Console.WriteLine(name.Replace(“John”, “Jane”));
else
Console.WriteLine(“John was not found!”)
گاهی اوقات می خواهید بدانید که آیا رشته با یک char خاص آغاز می شود یا به پایان می رسد. برای این منظور؛ کلاس String می تواند با متدهای ()StartWith و ()EndWith به شما کمک کند؛ که دقیقاً کاری انجام دهد که نام نشان می دهد:
string name = “John Doe”;
if ((name.StartsWith(“John”)) && (name.EndsWith(“Doe”)))
Console.WriteLine(“Hello, Mr. Doe!”);
البته متدهای String جالب تری نیز وجود دارد و قطعاً نسبت به این مثال های کوچکی که برای تان زدیم؛ راه های بیشتری برای استفاده از آنها وجود دارد. اگر می خواهید در مورد آنها بدانید به لینک زیر مراجعه کنید: MSDN documentation for the String class.
رشته های کلمه به کلمه و فاصله گذاری
هنگام تعریف یک رشته ، به زودی خواهید فهمید که کاراکترهای خاص، اهداف خاصی دارند. مهمترین مثال در این دست، خود نقل قول دوتایی است، زیرا نقل قول ها برای مشخص کردن شروع و انتهای یک رشته و معرفی رشته به کامپایلر استفاده می شود و سؤال این است که چگونه می توانید از این نقل قول ها در داخل خود رشته تان استفاده کنید؟ ساده ترین پاسخ برای این مسئله فاصله گذاری است، جایی که شما به کامپایلر نشان می دهید که به جای کارکرد معمول خود، باید با کاراکتر به صورت ویژه ای رفتار شود. در اینجا مثالی آورده شده است:
Console.WriteLine(“What do you mean by ”Hello, world” ??”);
هنگامی که اجرا می شود؛ نتیجه به شکل زیر می باشد:
What do you mean by “Hello, world” ??
به عبارت دیگر، ما به سادگی از اسلش رو به عقب قبل از نقل قول های دوتایی استفاده می کنیم؛ تا نشان بدهیم که این بخش انتهای رشته نیست و ما در واقع می خواهیم از نقل قول دوتایی استفاده کنیم. بنابراین شاید برای تان سؤال شود که اگر بخواهیم اسلش رو به عقب استفاده کنیم و از آن برای فاصله گذاری کاراکترهای دیگر استفاده نکرده باشیم؛ چه باید کرد؟ برای این منظور شما باید دوباره از فاصله گذاری – با یک اسلش رو به عقب دیگر استفاده کنید.
Console.WriteLine(“Right here \ Right now”);
نتیجه به شکل زیر می باشد:
Right here Right now
زیرا اسلش رو به عقب فقط برای فاصله گذاری نقل قول های دوتایی به کار نمی رود – به عنوان پیشوند در بسیاری از کاراکترها به کار می رود تا به آنها معنای خاصی داده شود. برای مثال؛ n یک خط جدید ایجاد می کند؛ t یک کاراکتر tab می باشد و … . شما می توانید لیست جالبی از این قبیل را در لینک زیر مشاهده کنید:
رشته های کلمه به کلمه
به عنوان یک جایگزین برای تمام این فاصله گذاری ها؛ شما می توانید از رشته کلمه به کلمه استفاده کنید که مانند یک رشته معمولی بیان می شود؛ اما کاراکتر با یک پیشوند @ آغاز می شود و درون این قسمت؛ با تمام کلمه ها به صورت عادی رفتار می شود:
Console.WriteLine(@”In a verbatim string everything is literal: n & t”);
خروجی دقیقاً مانند ورودی به شکل زیر می باشد:
In a verbatim string everything is literal: n & t
فقط یک استثنا از این قانون وجود دارد: یک نقل قول مضاعف نیز همچنان باید فاصله گذاری شود. واضح است که باید این طور باشد؛ زیرا در غیر این صورت ، کامپایلر چگونه می تواند بداند که آیا می خواهید رشته را خاتمه دهید یا خیر؟ با این حال، در یک رشته کلمه به کلمه، علامت نقل قول دوتایی با یک اسلش رو به عقب فاصله گذاری نمی شود؛ بلکه در عوض با یک علامت نقل قول دوتایی دیگر، مانند زیر می آید:
Console.WriteLine(@”What do you mean by “”Hello, world”” ??”);
نتیجه به شکل زیر خواهد بود:
What do you mean by “Hello, world” ??
خلاصه
رشته ها برای همه برنامه نویسان موضوع بسیار مهمی هستند – به احتمال زیاد وقتی که مدت زمانی را صرف نوشتن کد می کنید؛ بخشی از زمان را به نوعی به پردازش رشته ها اختصاص می دهید. خوشبختانه همان طور که در این مقاله مطرح شد؛ سی شارپ تمام ابزارهایی را که برای پردازش رشته ها نیاز دارید، در اختیار دارد.