इस बारे में एक सहकर्मी के साथ मैत्रीपूर्ण बहस होना। इस बारे में हमारे कुछ विचार हैं, लेकिन आश्चर्य है कि एसओ भीड़ इस बारे में क्या सोचती है?
इस बारे में एक सहकर्मी के साथ मैत्रीपूर्ण बहस होना। इस बारे में हमारे कुछ विचार हैं, लेकिन आश्चर्य है कि एसओ भीड़ इस बारे में क्या सोचती है?
जवाबों:
एक कारण यह है कि एक स्थानीय के लिए सीएलआर समर्थन नहीं है। Readonly का अनुवाद CLR / CLI initonly opcode में होता है। यह ध्वज केवल खेतों में लगाया जा सकता है और इसका स्थानीय के लिए कोई अर्थ नहीं है। वास्तव में, इसे स्थानीय में लागू करने की संभावना अपरिवर्तनीय कोड का उत्पादन करेगी।
इसका मतलब यह नहीं है कि C # ऐसा नहीं कर सका। लेकिन यह एक ही भाषा के निर्माण के लिए दो अलग-अलग अर्थ देगा। स्थानीय लोगों के लिए संस्करण में कोई सीएलआर समकक्ष मैपिंग नहीं होगी।
readonly
क्षेत्रों के लिए कीवर्ड CLI द्वारा समर्थित होने की वजह से उसके प्रभाव की जरूरत है अन्य विधानसभाओं के लिए दिखाई दे। इसका मतलब यह होगा कि कंपाइलिंग टाइम में केवल एक ही वेरिएबल है।
const
(जो C ++ में C # readonly
की तरह C # की तरह अधिक है const
, हालांकि यह दोनों भूमिका निभा सकता है)। फिर भी C ++ const
स्थानीय स्वचालित चर के लिए समर्थन करता है । इसलिए readonly
स्थानीय चर के लिए C # के लिए CLR समर्थन की कमी , अप्रासंगिक है।
using
और out
ठीक यही कर रहे हैं और दुनिया का पतन नहीं हुआ है।
मुझे लगता है कि यह सी # आर्किटेक्ट्स की ओर से एक खराब निर्णय है। स्थानीय चरों पर आसानी से संशोधक प्रोग्राम की शुद्धता को बनाए रखने में मदद करता है (ठीक वैसे ही) और कंपाइलर को कोड को अनुकूलित करने में मदद कर सकता है (कम से कम अन्य भाषाओं के मामले में)। यह तथ्य कि यह अभी C # में अस्वीकृत है, एक और तर्क है कि C # की कुछ "विशेषताएं" केवल इसके रचनाकारों की व्यक्तिगत कोडिंग शैली का प्रवर्तन हैं।
जेरेड के जवाब को संबोधित करते हुए, यह शायद केवल एक संकलन-समय की विशेषता होगी - संकलक आपको प्रारंभिक घोषणा के बाद चर को लिखने से रोक देगा (जिसमें एक असाइनमेंट शामिल करना होगा)।
क्या मैं इसमें मूल्य देख सकता हूं? संभावित रूप से - लेकिन बहुत कुछ नहीं, ईमानदार होने के लिए। यदि आप आसानी से यह नहीं बता सकते हैं कि कोई चर विधि में कहीं और सौंपा जा रहा है या नहीं, तो आपकी विधि बहुत लंबी है।
क्या यह की कीमत के लिए, जावा इस सुविधा (का उपयोग करते हुए है final
संशोधक) और मैं गए हैं बहुत मुश्किल से ही देखा यह उन मामलों में जहां यह के अलावा अन्य के लिए इस्तेमाल किया है चर एक गुमनाम आंतरिक वर्ग द्वारा कब्जा कर लिया जा करने के लिए अनुमति देने के लिए प्रयोग की जाने वाली है - और जहां यह है उपयोग किया जाता है, यह मुझे उपयोगी जानकारी के बजाय अव्यवस्था का आभास देता है।
readonly
/ final
मानों को चर val
और var
कीवर्ड से अलग करता है। स्काला कोड में, लोकल val
एस का बहुत बार उपयोग किया जाता है (और, वास्तव में, स्थानीय var
एस पर पसंद किया जाता है )। मुझे संदेह है कि final
जावा में संशोधक का अधिक बार उपयोग नहीं किए जाने के प्राथमिक कारण क) अव्यवस्था और ख) आलस्य हैं।
readonly
अत्यधिक महत्वपूर्ण नहीं होंगे। दूसरी ओर, स्थानीय चर जो क्लोजर में उपयोग किए जाते हैं, readonly
कई मामलों में संकलक को अधिक कुशल कोड उत्पन्न करने देगा। वर्तमान में, जब निष्पादन एक ब्लॉक में प्रवेश करता है जिसमें एक क्लोजर होता है, तो कंपाइलर को क्लोज-ओवर वेरिएबल्स के लिए एक नया हीप ऑब्जेक्ट बनाना होगा, भले ही कोई कोड जो क्लोजर का उपयोग करेगा कभी निष्पादित नहीं होता है । यदि एक चर केवल-पढ़ने के लिए था, तो बंद के बाहर कोड एक सामान्य चर का उपयोग कर सकता है; केवल जब एक प्रतिनिधि को बंद करने के लिए बनाया जाता है ...
C # 7 डिज़ाइन टीम द्वारा एक प्रस्ताव को स्थानीय लोगों और मापदंडों के लिए संक्षेप में चर्चा की गई थी। से जनवरी 21, 2015 के लिए सी # डिजाइन बैठक नोट्स :
पैरामीटर और स्थानीय लोगों को लैम्ब्डा द्वारा कैप्चर किया जा सकता है और इस तरह समवर्ती रूप से एक्सेस किया जा सकता है, लेकिन साझा-पारस्परिक-राज्य के मुद्दों से उन्हें बचाने का कोई तरीका नहीं है: उन्हें आसानी से पढ़ा नहीं जा सकता है।
सामान्य तौर पर, अधिकांश मापदंडों और कई स्थानीय लोगों को उनके प्रारंभिक मूल्य प्राप्त करने के बाद कभी भी सौंपा जाने का इरादा नहीं होता है। उन पर आसानी से अनुमति देने से वह इरादा स्पष्ट रूप से प्रकट होगा।
एक समस्या यह है कि यह सुविधा एक "आकर्षक उपद्रव" हो सकती है। जबकि "सही बात" करने के लिए लगभग हमेशा पैरामीटर और स्थानीय लोगों को आसानी से बनाना होगा, यह ऐसा करने के लिए कोड को काफी अव्यवस्थित करेगा।
आंशिक रूप से इसे कम करने का एक विचार यह है कि किसी स्थानीय चर पर संयोजन को आसानी से वैली या उससे कुछ छोटा करार दिया जाए। आम तौर पर हम केवल एक छोटे कीवर्ड के बारे में सोचने की कोशिश कर सकते हैं, जो कि रीडोनली-नेस को व्यक्त करने के लिए आसानी से स्थापित हो।
C # भाषा डिज़ाइन रेपो में चर्चा जारी है। अपना समर्थन दिखाने के लिए वोट करें। https://github.com/dotnet/csharplang/issues/188
यह c # भाषा डिजाइनर के लिए एक निरीक्षण है। F # में वैल कीवर्ड है और यह CLR पर आधारित है। कोई कारण नहीं है C # में समान भाषा विशेषता नहीं हो सकती।
मैं वह सहकर्मी था और यह अनुकूल नहीं था! (मजाक कर रहा हूं)
मैं इस सुविधा को समाप्त नहीं करूंगा क्योंकि छोटे तरीकों को लिखना बेहतर है। यह कहना थोड़ा सा है कि आपको थ्रेड्स का उपयोग नहीं करना चाहिए क्योंकि वे कठिन हैं। मुझे चाकू दे दो और मुझे खुद को नहीं काटने के लिए जिम्मेदार होने दो।
व्यक्तिगत रूप से, मैं अव्यवस्था से बचने के लिए एक और "var" प्रकार का कीवर्ड चाहता था जैसे "inv" (अपरिवर्तनीय) या "rvar"। मैं देर से के रूप में एफ # का अध्ययन कर रहा हूं और अपील करने वाली अपरिवर्तनीय बात का पता लगाता हूं।
कभी नहीं पता था कि जावा के पास यह है।
मैं स्थानीय री- वेरिएबल को उसी तरह से पसंद करूंगा, जैसे मुझे स्थानीय कॉन्स्टेबल वेरिएबल पसंद हैं । लेकिन अन्य विषयों की तुलना में इसकी प्राथमिकता कम है।
हो सकता है कि इसकी प्राथमिकता C # डिजाइनरों के लिए इस सुविधा को लागू न करने (अभी तक!) के लिए एक ही कारण हो । लेकिन भविष्य के संस्करणों में स्थानीय पठनीय चर का समर्थन करना आसान (और पीछे संगत) होना चाहिए।
केवल पढ़ने का मतलब है कि एक ही स्थान उदाहरण सेट किया जा सकता है जो कंस्ट्रक्टर में है। स्थानीय रूप से एक चर घोषित करते समय इसका कोई उदाहरण नहीं है (यह सिर्फ दायरे में है), और इसे कंस्ट्रक्टर द्वारा छुआ नहीं जा सकता है।
मुझे पता है, यह आपके प्रश्न का उत्तर क्यों नहीं देता है। फिर भी, इस प्रश्न को पढ़ने वाले लोग नीचे दिए गए कोड की सराहना कर सकते हैं।
यदि आप वास्तव में एक स्थानीय चर को ओवरराइड करते समय पैर में अपने आप को गोली मारने से चिंतित हैं, जिसे केवल एक बार सेट किया जाना चाहिए, और आप इसे अधिक विश्व स्तर पर सुलभ चर नहीं बनाना चाहते हैं, तो आप ऐसा कुछ कर सकते हैं।
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
लेकिन यह काम करता है।
यदि आप C # इंटरैक्टिव कंपाइलर का उपयोग कर रहे हैं, तो आप C # में आसानी से स्थानीय चर घोषित कर सकते हैं 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
यहां एक चर नहीं है, यह एक क्षेत्र के लिए संकलित है। यह नाइटपैकिंग नहीं है क्योंकि अंतर स्पष्ट रूप से इंटरेक्टिव C # के रूप में मौजूद है: int x; Console.WriteLine(x)
कानूनी इंटरेक्टिव C # है (क्योंकि 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-reference/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
स्थानीय आपको ऐसा करने की अनुमति देगा।