সি # তে একটি স্ট্রিংয়ের সামনে @ কী?


602

এটি সি # (বা সম্ভবত ভিবি নেট) এর জন্য নেট নেট প্রশ্ন, তবে আমি নীচের ঘোষণার মধ্যে পার্থক্য কী তা জানার চেষ্টা করছি:

string hello = "hello";

বনাম

string hello_alias = @"hello";

কনসোলে মুদ্রণগুলি কোনও পার্থক্য করে না, দৈর্ঘ্যের বৈশিষ্ট্যগুলি একই the


আরও ভাল ভার্ব্যাটিম স্ট্রিং ফর্ম্যাটিংয়ের জন্য ভিজ্যুয়াল স্টুডিও আইডিইয়ের জন্য আমার পরামর্শটি (এবং উত্তম) দেখুন: মাল্টি-লাইন ভার্ব্যাটিম স্ট্রিং
অলিভিয়ার জ্যাকট-ডেসকোম্বেস

স্পষ্টতই, উপরে বর্ণিত উদাহরণগুলি একই ফলাফল ফলাফলের সাথে বা ছাড়াই উত্পন্ন করছে @
মিরো জে।

উত্তর:


767

এটি স্ট্রিংটিকে ভারব্যাটিম স্ট্রিংকে আক্ষরিক হিসাবে চিহ্নিত করে - স্ট্রিংয়ের যে কোনও কিছু যা সাধারণত পালানোর ক্রম হিসাবে ব্যাখ্যা করা হয় তা উপেক্ষা করা হয়।

তাই "C:\\Users\\Rich"হিসাবে একই@"C:\Users\Rich"

একটি ব্যতিক্রম রয়েছে: ডাবল উদ্ধৃতিটির জন্য একটি পালানোর ক্রম প্রয়োজন। একটি ডাবল উদ্ধৃতি এড়াতে, আপনি একটি সারিতে দুটি ডাবল উদ্ধৃতি প্রয়োজন। উদাহরণস্বরূপ, @""""মূল্যায়ন "


1
@ রিচার্ড এভারেট আমি উত্তরটি বুঝতে পেরেছি, তবে আমার সন্দেহ এই বৈশিষ্ট্যটির আসল ব্যবহার কী?
অরুণ

24
@ অরুন নিয়মিত অভিব্যক্তি সংজ্ঞা মতো জিনিসগুলি সহ স্ট্রিংয়ের সাথে কাজ করার সময় এটি বেশ কার্যকর যেগুলি প্রায়শই নিজেকে এড়িয়ে যাওয়ার প্রয়োজন হয়
জেমস থর্প

25
+ একাধিক-লাইনের সামগ্রী
জয়দার

4
আপনি {{যদি কোনও string.Formatকলটিতে নিয়মিত ব্রেস ব্যবহার করতে চান তবে আপনাকে এখনও ধনুর্বন্ধনী দ্বিগুণ করতে হবে।
ডেভ কাজিনো

4
লাইনটিকে টুকরো টুকরো করে না ফেলে @ রিচার্ড এভারেট মাল্টি লাইন স্ট্রিং লিটারাল তৈরির জন্য এটি খুব দরকারী।
জন মোট

256

এটি একটি ভারব্যাটিম স্ট্রিং আক্ষরিক । এর অর্থ এই যে পলায়ন প্রয়োগ করা হয়নি। এই ক্ষেত্রে:

string verbatim = @"foo\bar";
string regular = "foo\\bar";

এখানে verbatimএবং regularএকই বিষয়বস্তু আছে।

এটি মাল্টি-লাইন সামগ্রীগুলিকেও মঞ্জুরি দেয় - যা এসকিউএল এর জন্য খুব কার্যকর হতে পারে:

string select = @"
SELECT Foo
FROM Bar
WHERE Name='Baz'";

ভারব্যাটিম স্ট্রিং লিটারালগুলির জন্য যে এক পালনের দরকার তা হ'ল দ্বিগুণ উদ্ধৃতি (") পাওয়া যা আপনি দ্বিগুণ করে যাচ্ছেন:

string verbatim = @"He said, ""Would you like some coffee?"" and left.";
string regular = "He said, \"Would you like some coffee?\" and left.";

16
এটি পরিবর্তনশীল নাম এবং স্টাফ হিসাবে সংরক্ষিত শব্দ ব্যবহার করার অনুমতি দেয়। পাবলিক ইন্ট গেটভ্যালিউআরডিফল্ট (ইন্ট @ ডিফল্ট) এর মতো;
Svish

5
Svish: সত্য তবে এই নির্দিষ্ট প্রশ্নের সাথে সম্পর্কিত নয়।
জন স্কিটি

63

একটি '@' এরও অন্য একটি অর্থ রয়েছে: এটি একটি ভেরিয়েবল ঘোষণার সামনে রাখার ফলে আপনি ভেরিয়েবলের নাম হিসাবে সংরক্ষিত কীওয়ার্ড ব্যবহার করতে পারবেন।

উদাহরণ স্বরূপ:

string @class = "something";
int @object = 1;

আমি এর জন্য কেবল একটি বা দুটি বৈধ ব্যবহার পেয়েছি। আপনি যখন এ জাতীয় কিছু করতে চান তখন মূলত এএসপি.নেট এমভিসি তে:

<%= Html.ActionLink("Text", "Action", "Controller", null, new { @class = "some_css_class" })%>

যা এইচটিএমএল লিঙ্ক তৈরি করে:

<a href="/Controller/Action" class="some_css_class">Text</a>

অন্যথায় আপনাকে 'ক্লাস' ব্যবহার করতে হবে যা কোনও সংরক্ষিত কীওয়ার্ড নয় তবে বড় 'সি' এইচটিএমএল মান অনুসরণ করে না এবং ঠিক সঠিক দেখাচ্ছে না।


18

যেহেতু আপনি স্পষ্টভাবে ভিবিও চেয়েছিলেন, কেবল আমাকে যুক্ত করুন যে এই ভারব্যাটিম স্ট্রিং সিনট্যাক্সটি ভিবিতে নেই, কেবল সি # তে in পরিবর্তে, সমস্ত স্ট্রিংগুলি ভিবিতে ভারব্যাটিম (সি # ভারব্যাটিম স্ট্রিংগুলির বিপরীতে লাইন ব্রেকগুলি ধারণ করতে পারে না তা বাদে):

Dim path = "C:\My\Path"
Dim message = "She said, ""Hello, beautiful world."""

ভিবিতে এস্কেপ সিকোয়েন্স বিদ্যমান নেই (উদ্ধৃতি চরিত্রের দ্বিগুণ ব্যতীত, সি # ভারব্যাটিম স্ট্রিংয়ের মতো) যা কয়েকটি বিষয়কে আরও জটিল করে তোলে। উদাহরণস্বরূপ, ভিবিতে নিম্নলিখিত কোডটি লিখতে আপনাকে সংক্ষিপ্তকরণ (বা স্ট্রিং তৈরির জন্য অন্য কোনও উপায়) ব্যবহার করতে হবে

string x = "Foo\nbar";

ভিবিতে এটি নিম্নরূপ লেখা হবে:

Dim x = "Foo" & Environment.NewLine & "bar"

( &এটি ভিবি স্ট্রিং কনটেনটেশন অপারেটর equally +সমানভাবে ব্যবহৃত হতে পারে))


1
ওহ আমার, এটি বিরক্তিকর শোনায় ... আরও বেশি আনন্দিত যে আমি এখন সি # ব্যবহার করছি: পি
সুইভিশ

আপনি সি # এর ভার্বাটিম স্ট্রিং লিটারালগুলিতে প্রবেশ করতে পারলেও ভিবি স্ট্রিং লিটারেলগুলিতে লাইন ব্রেকগুলি এম্বেড করতে পারবেন না। তারা এইভাবে এক না।
জোয়

@ সুইশ, অপেক্ষা কর আমি কি কিছু মিস করছি? এটি মোটামুটি ভিবি-র পক্ষে নয়। প্রকৃতপক্ষে এটি এমন এক জায়গা যেখানে ভিবি সি # জয়ী। এটা এই ভাবে করতে ভালো এবং স্পষ্টভাবে নতুন লাইন এবং পরিবর্তে মধ্যে সব বিশেষ অক্ষর নিক্ষেপ বিশেষ অক্ষর CONCAT "এবং "
পেসারিয়ার

পছন্দ করুন আপনি তুচ্ছ স্ট্রিং প্রসেসিংয়ের চেয়ে বেশি কিছু করার সাথে সাথে সঠিক স্ট্রিং বিল্ডিং সুবিধা অনিবার্য এবং সংক্ষিপ্তভাবে বিশেষ অক্ষরগুলি পরিচালনা করার ক্ষমতা এগুলির মধ্যে সর্বাগ্রে। তবে, সি # এবং ভিবি উভয়েরই রয়েছে String.Format, যা এটি করার অনুমতি দেয়। আসলে, আমি এখন কখনই লিখব না"x" & Environment.NewLine , এবং পরিবর্তে সর্বদাString.Format("x{0}", Environment.Newline) ইত্যাদি ব্যবহার করব Still তবুও, সি # এখানে আরও সুবিধাজনক।
কনরাড রুডল্ফ

@KonradRudolph, আমি বেছে নিতে চাই "x" & nl & nlবা "x" + nl + nlবা "x" . $nl . $nlএর বেশী কোনো দিন "x\n\n"। এছাড়াও "x" + bs + bs শেষ "x\\\\"। এবং "x" + q + qওভার "x\"\""/ "x"""""। এখন হিসাবে String.Format, এটি অন্য যে বিষয়টি আমরা উপরে তুলনা করছি তা সম্পর্কিত নয়।
পেসারিয়ার

10

http://msdn.microsoft.com/en-us/library/aa691090.aspx

সি # দুটি স্ট্রিং লিটারালকে সমর্থন করে: নিয়মিত স্ট্রিং লিটারাল এবং ভার্ব্যাটিম স্ট্রিং লিটারালস।

একটি নিয়মিত স্ট্রিং আক্ষরিক শূন্য বা আরও বেশি অক্ষর সমন্বিত থাকে যা "হ্যালো" এর মতো ডাবল উদ্ধৃতিতে আবদ্ধ থাকে এবং এতে দুটি সহজ পালানোর অনুক্রম (যেমন ট্যাব অক্ষরের জন্য \ t) এবং হেক্সাডেসিমাল এবং ইউনিকোড এস্কেপ সিকোয়েন্স অন্তর্ভুক্ত থাকতে পারে।

একটি ভারব্যাটিম স্ট্রিং আক্ষরিক একটি @ অক্ষর এবং তারপরে একটি ডাবল-উদ্ধৃতি অক্ষর, শূন্য বা আরও বেশি অক্ষর এবং একটি সমাপ্ত ডাবল-উদ্ধৃতি অক্ষর থাকে। একটি সহজ উদাহরণ হ'ল @ "হ্যালো"। একটি ভারব্যাটিম স্ট্রিং আক্ষরিক ক্ষেত্রে, ডিলিমেটারগুলির মধ্যে অক্ষরগুলি বর্ণনামূলক ভারব্যাটিম হয়, কেবল ব্যতিক্রম একটি উদ্ধৃতি-পলায়ন-ক্রম হয়। বিশেষত, সরল অবলম্বন সিকোয়েন্স এবং হেক্সাডেসিমাল এবং ইউনিকোড এস্কেপ সিকোয়েন্সগুলি ভার্বাটিম স্ট্রিং লিটারে প্রসেস করা হয় না। একটি ভারব্যাটিম স্ট্রিং আক্ষরিক একাধিক লাইন বিস্তৃত হতে পারে।


9

এটি একটি ভারব্যাটিম স্ট্রিং, এবং পালানোর নিয়মগুলিকে পরিবর্তন করে - কেবলমাত্র যে চরিত্রটি এখন পালানো হয়েছে তা হ'ল ", পালিয়ে" "" file এটি বিশেষত ফাইল পাথ এবং রেজেক্সের জন্য দরকারী:

var path = @"c:\some\location";
var tsql = @"SELECT *
            FROM FOO
            WHERE Bar = 1";
var escaped = @"a "" b";

ইত্যাদি


আপনি কি উদাহরণটি মার্ককে মিস করছেন না? বা আমি যখন var ব্যবহার করি তখন এটি কি ডিফল্ট হয়? সামান্য বিভ্রান্ত ...
ডার্ক ভোলমার

1
ঠিক আছে - এটি সত্যিই অদ্ভুত। আমি ভাবছি এডিটর ওরা কি মাঞ্চ করে দিয়েছে?
মার্ক Gravell

9

এমএসডিএন থেকে অনুলিপি করা :

সংকলনের সময়, ভারব্যাটিম স্ট্রিংগুলি সমস্ত একই পালানোর ক্রমগুলির সাথে সাধারণ স্ট্রিংগুলিতে রূপান্তরিত হয়। অতএব, আপনি যদি ডিবাগার ওয়াচ উইন্ডোতে একটি ভারব্যাটিম স্ট্রিংটি দেখেন তবে আপনি আপনার উত্স কোড থেকে ভার্ব্যাটিম সংস্করণ নয়, পালক অক্ষরগুলি সংকলক দ্বারা যুক্ত হওয়া দেখতে পাবেন। উদাহরণস্বরূপ, ভার্চিয়াম স্ট্রিংটি @"C:\files.txt"ওয়াচ উইন্ডো হিসাবে প্রদর্শিত হবে "C:\\files.txt"


মাইক্রোসফ্ট ডকুমেন্টেশনের একটি সাধারণ বিভ্রান্তিমূলক অংশ যা আইএমএইচও! উপরের ফলাফলটি শেষ ফলাফল হিসাবে যা বলেছে তা সঠিক, তবে অন্তর্নিহিত সত্যটি হ'ল সি # তে থাকা স্ট্রিংগুলি বাইটের (বা মাল্টি-বাইট চরিত্রের কোড) প্রাসঙ্গিক ক্রমে রূপান্তরিত হয়। @ # ... "বা" ... "এর সাথে সি # অন্তর্নিহিত স্ট্রিং উপস্থাপনের জন্য দুটি ভিন্ন উপায়ে অনুমতি দেয়। ডিবাগার সর্বদা "..." উপায় চয়ন করে এবং প্রথমে কোনটি ব্যবহৃত হয়েছিল তা বলতে পারে না। (এস্কেপ সিকোয়েন্সগুলি যেমন \ n বা "" কেবল প্রোগ্রামিং এবং ডিসপ্লে স্তরের স্ট্রিং উপস্থাপনার সাথে প্রাসঙ্গিক এবং এটিকে অন্তর্নিহিত স্ট্রিংয়ে কখনও সংরক্ষণ করা হয় না!)
এটিকে

8

একটি ফেলে @একটি স্ট্রিং সামনে আপনি বিশেষ কোড বা পালাবার অক্ষর ব্যবহার না করেও এই ধরনের একটি ব্যাকস্ল্যাশ বা ডবল-কোট বিশেষ অক্ষর ব্যবহার করতে সক্ষম করে।

সুতরাং আপনি লিখতে পারেন:

string path = @"C:\My path\";

পরিবর্তে:

string path = "C:\\My path\\";

3

ব্যাখ্যা সহজ। স্ট্রিং উপস্থাপন করতে "string\", সংকলকটির প্রয়োজন "string\\"কারণ \একটি পালানোর চরিত্র। @"string\"পরিবর্তে আপনি যদি ব্যবহার করেন তবে আপনি ভুলে যেতে পারেন \\

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.