दिलचस्प पोस्ट
रिएक्ट वेरिएबल स्टेटमेंट्स (जेएसएक्स) के साथ एचटीएमएल सम्मिलित करें आर में एक सच्चे गर्मी का नक्शा एंड्रॉइड कपकेक में जीपीएस को प्रोग्राम करने के लिए कैसे करें अजगर में आइटम को घोषित करने और जोड़ने के लिए कैसे करें? गूगल ड्राइव mime- प्रकार लिस्टिंग? जावा में एक रिक्त संदर्भ पर स्थिर फ़ील्ड ओरेकल में कई पंक्तियों से कॉलम मूल्यों को जोड़ने के लिए SQL क्वेरी JQuery में "फोकस" और "ब्लर" का अनुकरण करना। Live () विधि एंड्रॉइड पर एसएमएस यूआरएल बाएं संक्रमण से सीएसएस 3 स्लाइड-इन एंड्रॉइड- मैं पाठ का दृश्य पर पाठ चयन कैसे दिखा सकता हूं? क्या प्रिंटफ़ ("% x", 1) अनिर्धारित व्यवहार को लागू करता है? कैसे करता है # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # एसक्यूएल: एक मेज में याद आ रही आईडी खोजें क्यों उपखंड की तुलना में शार्क और मर्जुरियल में आसान विलय कर रहा है?

पासिंग ऑब्जेक्ट्स रेफरल या वैल्यू इन सी #

सी # में, मैंने हमेशा सोचा है कि गैर-आदिम वेरिएबल मूल्य द्वारा पारित संदर्भ और आदिम मानों द्वारा पारित किए गए थे।

इसलिए जब कोई विधि किसी भी गैर-आदिम वस्तु से गुजरती है, तो वस्तु में वस्तु के साथ किया गया कोई भी वस्तु वस्तु पारित हो जाएगी। (सी # 101 सामान)

हालांकि, मैंने देखा है कि जब मैं एक सिस्टम पास करता हूं। ड्रॉइंग। छवि ऑब्जेक्ट, यह ऐसा मामला नहीं लगता है? अगर मैं एक सिस्टम विधि बदलता हूं। छवि को किसी अन्य विधि पर भेजना है, और उस वस्तु पर एक छवि लोड करना है, तो उस पद्धति को गुंजाइश से बाहर जाने दें और वापस कॉलिंग पद्धति पर जाएं, वह छवि मूल वस्तु पर लोड नहीं की गई है?

ऐसा क्यों है?

Solutions Collecting From Web of "पासिंग ऑब्जेक्ट्स रेफरल या वैल्यू इन सी #"

ऑब्जेक्ट्स को बिल्कुल भी पारित नहीं किया गया है। डिफ़ॉल्ट रूप से, तर्क का मूल्यांकन किया जाता है और इसका मान मूल्य के अनुसार पारित किया जाता है, जैसा कि आप जिस पद्धति को कॉल कर रहे हैं उसके पैरामीटर का प्रारंभिक मान। अब महत्वपूर्ण मुद्दा यह है कि मूल्य संदर्भ प्रकार के लिए एक संदर्भ है – किसी ऑब्जेक्ट (या रिक्त) को पाने का एक तरीका उस ऑब्जेक्ट में परिवर्तन कॉलर से दिखाई देगा। हालाँकि, पैरामीटर के मान को बदलने के लिए एक अलग ऑब्जेक्ट को संदर्भित नहीं किया जायेगा, जब आप मूल्य से पास का उपयोग कर रहे हैं, जो सभी प्रकारों के लिए डिफ़ॉल्ट है

अगर आप पास-बाय-रेफरेंस का उपयोग करना चाहते हैं, तो आपको इसका उपयोग करना चाहिए या ref , चाहे पैरामीटर प्रकार एक वैल्यू टाइप या संदर्भ प्रकार है। उस स्थिति में, प्रभावी ढंग से चर स्वयं को संदर्भ द्वारा पारित किया जाता है, इसलिए पैरामीटर उसी भंडारण स्थान का उपयोग तर्क के रूप में करता है – और पैरामीटर में परिवर्तन कॉलर द्वारा ही देखा जाता है।

इसलिए:

 public void Foo(Image image) { // This change won't be seen by the caller: it's changing the value // of the parameter. image = Image.FromStream(...); } public void Foo(ref Image image) { // This change *will* be seen by the caller: it's changing the value // of the parameter, but we're using pass by reference image = Image.FromStream(...); } public void Foo(Image image) { // This change *will* be seen by the caller: it's changing the data // within the object that the parameter value refers to. image.RotateFlip(...); } 

मेरे पास एक लेख है जो इस बारे में और अधिक विस्तार में आता है । असल में, "संदर्भ से पास" का अर्थ यह नहीं है कि आप क्या सोचते हैं इसका मतलब है।

एक और कोड नमूना:

 void Main() { int k = 0; TestPlain(k); Console.WriteLine("TestPlain:" + k); TestRef(ref k); Console.WriteLine("TestRef:" + k); string t = "test"; TestObjPlain( t); Console.WriteLine("TestObjPlain:" +t); TestObjRef(ref t); Console.WriteLine("TestObjRef" + t); } public static void TestRef(ref int i) { i = 5; } public static void TestPlain(int i) { i = 5; } public static void TestObjRef(ref string s) { s = "TestObjRef"; } public static void TestObjPlain(string s) { s = "TestObjPlain"; } 

और आउटपुट:

TestPlain: 0

TestRef: 5

TestObjPlain: परीक्षण

TestObjRefTestObjRef

मुझे लगता है कि जब आप इसे इस तरह करते हैं, तो इसका स्पष्ट लगता है। मैं इस तरह से चीजों का परीक्षण करने के लिए लिंकपैड को डाउनलोड करने की सलाह देता हूं।

 void Main() { var Person = new Person(){FirstName = "Egli", LastName = "Becerra"}; //Will update egli WontUpdate(Person); Console.WriteLine("WontUpdate"); Console.WriteLine($"First name: {Person.FirstName}, Last name: {Person.LastName}\n"); UpdateImplicitly(Person); Console.WriteLine("UpdateImplicitly"); Console.WriteLine($"First name: {Person.FirstName}, Last name: {Person.LastName}\n"); UpdateExplicitly(ref Person); Console.WriteLine("UpdateExplicitly"); Console.WriteLine($"First name: {Person.FirstName}, Last name: {Person.LastName}\n"); } //Class to test public class Person{ public string FirstName {get; set;} public string LastName {get; set;} public string printName(){ return $"First name: {FirstName} Last name:{LastName}"; } } public static void WontUpdate(Person p) { //New instance does jack... var newP = new Person(){FirstName = p.FirstName, LastName = p.LastName}; newP.FirstName = "Favio"; newP.LastName = "Becerra"; } public static void UpdateImplicitly(Person p) { //Passing by reference implicitly p.FirstName = "Favio"; p.LastName = "Becerra"; } public static void UpdateExplicitly(ref Person p) { //Again passing by reference explicitly (reduntant) p.FirstName = "Favio"; p.LastName = "Becerra"; } 

और यह उत्पादन होना चाहिए

WontUpdate

पहला नाम: ईग्लि, अंतिम नाम: बेसर्रा

UpdateImplicitly

प्रथम नाम: फ़ेविओ, अंतिम नाम: बेसर्रा

UpdateExplicitly

प्रथम नाम: फ़ेविओ, अंतिम नाम: बेसर्रा

आपने विधि को ऑब्जेक्ट कैसे पास किया?

क्या आप वस्तु के लिए उस विधि के अंदर नया कर रहे हैं, यदि आपको विधि में रेफरी का इस्तेमाल करना है

निम्नलिखित लिंक आपको बेहतर विचार प्रदान करते हैं।

http://dotnetstep.blogspot.com/2008/09/passing-reference-type-byval-or-byref.html http://msdn.microsoft.com/en-us/library/0f66670z(vs.71)। aspx # vclrfpassingmethodparameters_referencetypes

जब आप सिस्टम को निकालते हैं। ड्रॉपिंग। इमेज प्रकार ऑब्जेक्ट एक विधि में आप वास्तव में उस ऑब्जेक्ट के संदर्भ की प्रति भेज रहे हैं।

इसलिए यदि उस पद्धति के अंदर आप एक नई छवि लोड कर रहे हैं जो आप नए / प्रतिलिपि संदर्भ का उपयोग कर लोड कर रहे हैं। तो आप ओरिगल में परिवर्तन नहीं कर रहे हैं

 YourMethod(System.Drawing.Image image) { //now this image is a new reference //if you load a new image image = new Image().. //you are not changing the original reference you are just changing the copy of original reference } 

स्वीकार्य जवाब थोड़ा गलत और भ्रामक लगता है। एक संदर्भ की एक "प्रतिलिपि" क्या है?

निम्नलिखित बयान कैसे समझ में आता है?

"हालांकि, पैरामीटर के मान को बदलने के लिए एक अलग ऑब्जेक्ट को संदर्भित नहीं किया जायेगा, जब आप मूल्य से पास का उपयोग कर रहे हैं, जो कि सभी प्रकार के लिए डिफ़ॉल्ट है।" मूल्य से पास सभी प्रकार के लिए डिफ़ॉल्ट नहीं है

उनके लिंक में उनका उदाहरण एक रिक्त स्थान का एक उदाहरण सेट करने की कोशिश करता है। स्वत: कचरा संग्रह के कारण ऑब्जेक्ट को सफलतापूर्वक सेट नहीं किया गया था। इसे इस तरह से हटाया नहीं जा सकता।

यहां एक माइक्रोसॉफ्ट आलेख है जो जावा और सी # की तुलना करता है।

https://msdn.microsoft.com/en-us/library/ms836794.aspx से

"सभी ऑब्जेक्ट्स संदर्भ हैं

संदर्भ प्रकार सी ++ में पॉइंटर्स के समान होते हैं, विशेषकर जब किसी नए क्लास इंस्टालेशन में पहचानकर्ता सेट करते हैं। लेकिन इस संदर्भ प्रकार के गुणों या विधियों तक पहुंचने पर, "।" ऑपरेटर, जो स्टैक पर बनाए गए सी ++ में डेटा इंस्टेंस तक पहुंचने के समान है। नए ऑपरेटर का उपयोग करके सभी वर्ग के उदाहरणों को ढेर पर बनाया जाता है, लेकिन हटाए जाने की अनुमति नहीं है, क्योंकि दोनों भाषाओं में अपनी गड़बड़ी संग्रह योजनाओं का उपयोग किया गया है, नीचे चर्चा की। "

संदर्भ से पास में आप केवल समारोह पैरामीटर में "रेफरी" को जोड़ते हैं और एक और चीज है जिसे आप मुख्य "स्थिर" (# public void main(String[] args) कारण कार्य "स्थिर" घोषित करना चाहिए!

 namespace preparation { public class Program { public static void swap(ref int lhs,ref int rhs) { int temp = lhs; lhs = rhs; rhs = temp; } static void Main(string[] args) { int a = 10; int b = 80; Console.WriteLine("a is before sort " + a); Console.WriteLine("b is before sort " + b); swap(ref a, ref b); Console.WriteLine(""); Console.WriteLine("a is after sort " + a); Console.WriteLine("b is after sort " + b); } } }