এ সম্পর্কে কোনও সহকর্মীর সাথে বন্ধুত্বপূর্ণ বিতর্ক করা। এ সম্পর্কে আমাদের কিছু চিন্তাভাবনা আছে তবে অবাক হয়ে যাচ্ছেন যে এসও জনতা এ সম্পর্কে কী ভাববে?
এ সম্পর্কে কোনও সহকর্মীর সাথে বন্ধুত্বপূর্ণ বিতর্ক করা। এ সম্পর্কে আমাদের কিছু চিন্তাভাবনা আছে তবে অবাক হয়ে যাচ্ছেন যে এসও জনতা এ সম্পর্কে কী ভাববে?
উত্তর:
একটি কারণ হ'ল কেবল পঠনযোগ্য স্থানীয়দের জন্য কোনও সিএলআর সমর্থন নেই। পঠনযোগ্য সিএলআর / সিএলআই প্রাথমিকভাবে অপকোডে অনুবাদ করা হয়েছে। এই পতাকাটি কেবল ক্ষেত্রগুলিতে প্রয়োগ করা যেতে পারে এবং কোনও স্থানীয়দের কাছে এর কোনও অর্থ নেই। প্রকৃতপক্ষে, কোনও স্থানীয়কে এটি প্রয়োগ করা সম্ভবত অবিশ্বাস্য কোড তৈরি করবে।
এর অর্থ এই নয় যে সি # এটি করতে পারে না। তবে এটি একই ভাষা গঠনের জন্য দুটি পৃথক অর্থ দেবে। স্থানীয়দের জন্য সংস্করণে কোনও সিএলআর সমতুল্য ম্যাপিং থাকবে না।
readonly
ক্ষেত্রের জন্য শব্দ CLI দ্বারা সমর্থিত হবে কারণ তার প্রভাব দরকার হয় অন্যান্য সমাহারগুলি কাছে দৃশ্যমান। এর অর্থ কেবল এটিই হ'ল সংকলন সময়ে চলকটির কেবল পদ্ধতিতে একটি অ্যাসাইনমেন্ট থাকে।
const
(যা সি ++ তে সি # এর readonly
চেয়ে সি # এর মতো const
, যদিও এটি উভয় ভূমিকা পালন করতে পারে)। তবুও সি ++ const
স্থানীয় স্বয়ংক্রিয় চলকটির জন্য সমর্থন করে । সুতরাং readonly
স্থানীয় ভেরিয়েবলের জন্য সি # র সিএলআর সমর্থনের অভাব অপ্রাসঙ্গিক।
using
এবং out
ঠিক তা-ই করছে এবং বিশ্ব ভেঙে পড়েনি।
আমি মনে করি এটি সি # আর্কিটেক্টের পক্ষে একটি দুর্বল রায়। স্থানীয় ভেরিয়েবলগুলিতে কেবলমাত্র পঠনযোগ্য সংশোধক প্রোগ্রামের যথার্থতা বজায় রাখতে সহায়তা করে (ঠিক যেমন দাবি করে) এবং সংকলকটিকে কমপিটেট অপ্টিমাইজ করতে সহায়তা করতে পারে (কমপক্ষে অন্যান্য ভাষার ক্ষেত্রে)। এটি এখনই সি # তে অনুমোদিত নয়, এটি অন্য যুক্তি যে সি # এর কিছু "বৈশিষ্ট্য" কেবল এটির নির্মাতাদের ব্যক্তিগত কোডিং শৈলীর প্রয়োগ।
জ্যারেডের উত্তরে সম্বোধন করা, এটি সম্ভবত একটি সংকলন-সময় বৈশিষ্ট্য হতে হবে - সংকলক প্রাথমিক ঘোষণার পরে পরিবর্তনশীলটিতে আপনাকে লেখা লিখতে নিষেধ করবে (যার মধ্যে একটি অ্যাসাইনমেন্ট অন্তর্ভুক্ত থাকতে হবে)।
আমি কি এর মূল্য দেখতে পারি? সম্ভাব্য - তবে অনেক বেশি নয়, সত্য বলতে হবে। যদি আপনি কোনও পদ্ধতিতে অন্য কোনও ভেরিয়েবল নির্ধারণ করা হচ্ছে কিনা তা আপনি যদি সহজেই বলতে না পারেন তবে আপনার পদ্ধতিটি খুব দীর্ঘ।
কি এটা মূল্য জন্য, জাভা এই বৈশিষ্ট্য (ব্যবহার হয়েছে final
পরিবর্তক) এবং আমি করেছি খুব কমই দেখা যায় এটা ক্ষেত্রে যেখানে এটা ছাড়া অন্য ব্যবহার হয়েছে পরিবর্তনশীল একটি বেনামী ভেতরের বর্গ ক্যাপচার করার অনুমতি ব্যবহার করা হবে - এবং যেখানে এটি হয় ব্যবহৃত, এটি আমাকে দরকারী তথ্যের চেয়ে বিশৃঙ্খলার ছাপ দেয়।
readonly
/ final
মানকে পৃথক করে । স্কালা কোডে, স্থানীয় sগুলি খুব ঘন ঘন ব্যবহৃত হয় (এবং বাস্তবে স্থানীয় এসগুলির চেয়ে পছন্দসই হয় )। আমি সন্দেহ করি যে জাভাতে সংশোধক বেশি ঘন ঘন ব্যবহার করা হয় না সেগুলি প্রাথমিক কারণগুলি হ) ক) নড়বড়ে এবং খ) অলসতা। val
var
val
var
final
readonly
না, এটি অত্যধিক গুরুত্বপূর্ণ হবে না। অন্যদিকে, স্থানীয় ভেরিয়েবলগুলির জন্য যা ক্লোজারে ব্যবহৃত হয়, readonly
অনেক ক্ষেত্রে সংকলকটি আরও কার্যকর কোড তৈরি করতে দেয়। বর্তমানে, যখন এক্সিকিউশনটি কোনও ক্লোজারযুক্ত ব্লকে প্রবেশ করে, সংকলক অবশ্যই ক্লোজড-ওভার ভেরিয়েবলগুলির জন্য একটি নতুন হিপ অবজেক্ট তৈরি করতে হবে, এমনকি যদি কোনও কোড যা ক্লোজার ব্যবহার করে তা কার্যকর করা হয় না । যদি কোনও ভেরিয়েবল কেবল পঠনযোগ্য হয় তবে বন্ধের বাইরের কোডটি একটি সাধারণ ভেরিয়েবল ব্যবহার করতে পারে; বন্ধের জন্য যখন কোনও প্রতিনিধি তৈরি করা হয় কেবল তখনই ...
একটি প্রস্তাব কেবলমাত্র স্থানীয়দের এবং পরামিতি সি # 7 নকশা দল দ্বারা আলোচনা হয়েছিল সংক্ষিপ্তভাবে। থেকে জানুয়ারী 21, 2015 জন্য C # ডিজাইন সভা নোট :
প্যারামিটার এবং স্থানীয়দের ল্যাম্বডাস দ্বারা ক্যাপচার করা যায় এবং এর মাধ্যমে একই সাথে অ্যাক্সেস করা যায় তবে তাদের ভাগ করে নেওয়া-পারস্পরিক-রাষ্ট্রীয় সমস্যাগুলি থেকে রক্ষা করার কোনও উপায় নেই: সেগুলি কেবল পঠনযোগ্য নয়।
সাধারণভাবে, বেশিরভাগ পরামিতি এবং অনেক স্থানীয় তাদের প্রাথমিক মান পাওয়ার পরে কখনই নির্ধারিত হয় না। তাদের উপর কেবলমাত্র পঠন করার অনুমতি দেওয়া সেই উদ্দেশ্যটি স্পষ্টভাবে প্রকাশ করবে।
একটি সমস্যা হ'ল এই বৈশিষ্ট্যটি সম্ভবত "আকর্ষণীয় উপদ্রব" হতে পারে। যেখানে "সঠিক জিনিস "টি প্রায় সর্বদা পরামিতিগুলি এবং স্থানীয়দের কেবল পঠনযোগ্যভাবে তৈরি করা হত, তা করার জন্য কোডটি উল্লেখযোগ্যভাবে বিশৃঙ্খলা করবে।
আংশিকভাবে এটিকে হ্রাস করার একটি ধারণা হ'ল স্থানীয় ভেরিয়েবলের মধ্যে কেবল পঠনযোগ্য ভারে সংমিশ্রণটি ভাল বা এর মতো সংক্ষিপ্ত কিছুতে সংকোচনের অনুমতি দেওয়া। আরও সাধারণভাবে আমরা কেবলমাত্র পাঠ্য-নেসটি প্রকাশ করার জন্য প্রতিষ্ঠিত পাঠ্যপুস্তকের চেয়ে সংক্ষিপ্ত কীওয়ার্ডটি চিন্তা করার চেষ্টা করতে পারি।
সি # ল্যাঙ্গুয়েজ ডিজাইনের রেপোতে আলোচনা অব্যাহত রয়েছে। আপনার সমর্থন দেখানোর জন্য ভোট দিন। https://github.com/dotnet/csharplang/issues/188
এটি সি # ভাষা ডিজাইনারের জন্য একটি তদারকি। এফ # এর ভাল কীওয়ার্ড রয়েছে এবং এটি সিএলআর ভিত্তিক। সি # তে একই ভাষার বৈশিষ্ট্য থাকতে পারে না এমন কোনও কারণ নেই।
আমি সেই সহকর্মী এবং এটি বন্ধুত্বপূর্ণ ছিল না! (শুধু মজা করছি)
আমি বৈশিষ্ট্যটি মুছে ফেলব না কারণ সংক্ষিপ্ত পদ্ধতিগুলি লেখাই ভাল। এটি কিছুটা বলার মতো যা আপনার থ্রেড ব্যবহার করা উচিত নয় কারণ তারা শক্ত। আমাকে ছুরি দিন এবং আমাকে নিজেকে কাটা না দেওয়ার জন্য দায়বদ্ধ করুন।
ব্যক্তিগতভাবে, আমি বিশৃঙ্খলা এড়াতে "ইনভ" (আগত) বা "রাভার" এর মতো আরও একটি "বার" টাইপ কীওয়ার্ড চাইছিলাম। আমি দেরী হিসাবে এফ # অধ্যয়ন করেছি এবং অপরিবর্তনীয় জিনিস খুঁজে পেলাম।
জাভা এটি কখনও জানত না।
আমি স্থানীয় চাই কেবলমাত্র একই পদ্ধতিতে ভেরিয়েবল যেমন আমি স্থানীয় পছন্দ const ভেরিয়েবল। তবে অন্যান্য বিষয়ের তুলনায় এর কম অগ্রাধিকার রয়েছে।
হয়তো এর অগ্রাধিকার হ'ল সি # ডিজাইনারদের এই বৈশিষ্ট্যটি বাস্তবায়ন না করার (এখনও!) একই কারণ । তবে ভবিষ্যতের সংস্করণগুলিতে স্থানীয় পঠনযোগ্য ভেরিয়েবলগুলি সমর্থন করা সহজ (এবং পিছনে সামঞ্জস্যপূর্ণ) হওয়া উচিত।
কেবলমাত্র পঠনযোগ্য অর্থ হল কনস্ট্রাক্টরটিতে ইনস্ট্যান্স ভেরিয়েবল সেট করা যায়। স্থানীয়ভাবে ভেরিয়েবল ঘোষণার সময় এর কোনও উদাহরণ নেই (এটি কেবল সুযোগে রয়েছে), এবং এটি নির্মাণকারীর দ্বারা স্পর্শ করা যায় না।
আমি জানি, এটি কেন আপনার প্রশ্নের উত্তর দেয় না। যাইহোক, যারা এই প্রশ্নটি পড়ছেন তারা তবুও নীচের কোডটির প্রশংসা করতে পারেন।
কোনও স্থানীয় পরিবর্তনশীল যা কেবল একবার সেট করা উচিত নয় এবং আপনি এটিকে আরও বিশ্বব্যাপী অ্যাক্সেসযোগ্য ভেরিয়েবল করতে চান না যদি আপনি সত্যই পায়ে নিজেকে গুলি করার বিষয়ে উদ্বিগ্ন হন তবে আপনি এরকম কিছু করতে পারেন।
public class ReadOnly<T>
{
public T Value { get; private set; }
public ReadOnly(T pValue)
{
Value = pValue;
}
public static bool operator ==(ReadOnly<T> pReadOnlyT, T pT)
{
if (object.ReferenceEquals(pReadOnlyT, null))
{
return object.ReferenceEquals(pT, null);
}
return (pReadOnlyT.Value.Equals(pT));
}
public static bool operator !=(ReadOnly<T> pReadOnlyT, T pT)
{
return !(pReadOnlyT == pT);
}
}
ব্যবহারের উদাহরণ:
var rInt = new ReadOnly<int>(5);
if (rInt == 5)
{
//Int is 5 indeed
}
var copyValueOfInt = rInt.Value;
//rInt.Value = 6; //Doesn't compile, setter is private
সম্ভবত হিসাবে কম কোড না rvar rInt = 5
কিন্তু এটি কাজ করে।
আপনি যদি সি # ইন্টারেক্টিভ সংকলক ব্যবহার করেন তবে আপনি সি # তে পঠনীয় স্থানীয় ভেরিয়েবলগুলি ঘোষণা করতে পারেন csi
:
>"C:\Program Files (x86)\MSBuild\14.0\Bin\csi.exe"
Microsoft (R) Visual C# Interactive Compiler version 1.3.1.60616
Copyright (C) Microsoft Corporation. All rights reserved.
Type "#help" for more information.
> readonly var message = "hello";
> message = "goodbye";
(1,1): error CS0191: A readonly field cannot be assigned to (except in a constructor or a variable initializer)
আপনি .csx
স্ক্রিপ্ট ফর্ম্যাটে পঠনযোগ্য স্থানীয় ভেরিয়েবলগুলিও ঘোষণা করতে পারেন ।
message
এখানে একটি পরিবর্তনশীল নয়, এটি একটি ক্ষেত্রের মধ্যে সংকলিত হয়। এটি নিটপিকিং নয় কারণ পার্থক্যটি ইন্টারেক্টিভ সি # তেও স্পষ্টভাবে উপস্থিত রয়েছে: int x; Console.WriteLine(x)
আইনী ইন্টারেক্টিভ সি # (কারণ x
এটি একটি ক্ষেত্র এবং অন্তর্নিহিত সূচনা) তবে void foo() { int x; Console.WriteLine(x); }
এটি নয় (কারণ x
এটি একটি পরিবর্তনশীল এবং এটি নির্ধারিত হওয়ার আগে ব্যবহৃত হয়)। এছাড়াও, Expression<Func<int>> y = x; ((MemberExpression) y.Body).Member.MemberType
প্রকাশ করবে যে x
সত্যই ক্ষেত্র এবং স্থানীয় পরিবর্তনশীল নয়।
কিছুটা আলাদা সিনট্যাক্সে হলেও সি # এর ইতিমধ্যে একটি পঠনযোগ্য বৈচিত্র রয়েছে:
নিম্নলিখিত লাইনগুলি বিবেচনা করুন:
var mutable = myImmutableCalculationMethod();
readonly var immutable = mutable; // not allowed in C# 8 and prior versions
return immutable;
তুলনা করা:
var mutable = myImmutableCalculationMethod();
string immutable() => mutable; // allowed in C# 7
return immutable();
স্বীকার করা, প্রথম সমাধান সম্ভবত কম কোড লিখতে পারে। ভেরিয়েবলটি উল্লেখ করার পরে ২ য় স্নিপেটটি কেবল পঠনযোগ্যভাবে স্পষ্ট করে তুলবে।
readonly var im = new List<string>(); im.Add("read-only variable, mutable object!");
।
const
কেবলমাত্র পাঠ্যকে পরিবর্তনশীল করতে কীওয়ার্ডটি ব্যবহার করুন ।
রেফারেন্স: https://docs.microsoft.com/en-us/dotnet/csharp/language-references/keywords/const
public class SealedTest
{
static void Main()
{
const int c = 707;
Console.WriteLine("My local constant = {0}", c);
}
}
const
যেখানে ভেরিয়েবলটি কেবলমাত্র তার সূচনাকালীন সময়ে নির্ধারিত হতে পারে - সিশার্প-স্টাইল নয় const
যেখানে কেবল সংকলন-সময় এক্সপ্রেশন ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, আপনি পারবেন না const object c = new object();
তবে একটি readonly
স্থানীয় আপনাকে এটি করার অনুমতি দেবে।