2010-02-24 7 views
24

मैं तो मैं कह सकता हूँ कि विस्तार तरीकों लिखने के लिए सक्षम होना चाहते हैं:मूल वस्तु को बदलने के लिए मुझे विस्तार विधि कैसे प्राप्त हो सकती है?

lines.ForceSpaceGroupsToBeTabs(); 
बजाय

:

lines = lines.ForceSpaceGroupsToBeTabs(); 

हालांकि, निम्नलिखित कोड वर्तमान आउटपुट:

....one 
........two 

के बजाय:

Tone 
TTtwo 

क्या मैं निम्नलिखित कोड में बदलने के लिए है यह उत्पादन बनाने के लिए:

Tone 
TTtwo 

(ध्यान दें दृश्यता के लिए कि, . = space, T = \t):

using System; 
using System.Collections.Generic; 

namespace TestExtended82343 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<string> lines = new List<string>(); 
      lines.Add("....one"); 
      lines.Add("........two"); 

      lines.ForceSpaceGroupsToBeTabs(); 

      lines.ForEach(l => Console.WriteLine(l)); 
      Console.ReadLine(); 
     } 
    } 

    public static class Helpers 
    { 
     public static void ForceSpaceGroupsToBeTabs(this List<string> originalLines) 
     { 
      string spaceGroup = new String('.', 4); 
      List<string> lines = new List<string>(); 
      foreach (var originalLine in originalLines) 
      { 
       lines.Add(originalLine.Replace(spaceGroup, "T")); 
      } 
      originalLines = lines; 
     } 
    } 
} 

उत्तर

36

आप सामग्री को संशोधित करने के लिए है List<string> का विस्तार विधि तक पास किया गया, न कि वेरिएबल जो सूची का संदर्भ रखता है:

public static void ForceSpaceGroupsToBeTabs(this List<string> lines) 
{ 
    string spaceGroup = new String('.', 4); 
    for (int i = 0; i < lines.Count; i++) 
    { 
     lines[i] = lines[i].Replace(spaceGroup, "T"); 
    } 
} 
+0

दरअसल। आप "विस्तारित" संदर्भित ऑब्जेक्ट को स्विच नहीं कर सकते हैं, लेकिन आप किसी की सामग्री को बदल सकते हैं –

15

आपको मूल सूची के सामग्री को बदलना होगा - बस एक अलग मान होने के लिए पैरामीटर को पुन: असाइन करना ऐसा नहीं होगा। कुछ इस तरह:

public static void ForceSpaceGroupsToBeTabs(this List<string> lines) 
{ 
    string spaceGroup = new String('.', 4); 
    for (int i = 0; i < lines.Count; i++) 
    { 
     lines[i] = lines[i].Replace(spaceGroup, "T"); 
    } 
} 

कि इस कुछ भी नहीं विस्तार तरीकों के साथ क्या करना है यह ध्यान देने योग्य है। कल्पना कीजिए कि आप बस बुलाएंगे:

Helpers.ForceSpaceGroupsToBeTabs(lines); 

... क्योंकि कोड का प्रभावी रूप से अनुवाद किया गया है। इस तथ्य के बारे में कुछ खास नहीं है कि यह एक विस्तार विधि है; यदि आप कोड बदलते हैं ताकि "सामान्य" स्थैतिक विधि काम करेगी, तो यह एक विस्तार विधि के रूप में भी काम करेगी। जैसा कि टिप्पणियों में उल्लेख किया गया है, एक बात यह है कि आप एक्सटेंशन विधि के साथ पहले पैरामीटर को ref पैरामीटर बना सकते हैं।

(संपादित करें:।। मुझे लगता है यह ठीक उसी कोड है कि पोस्ट DTB है, हालांकि हम वहाँ पहुंचे स्वतंत्र रूप से मैं इस सवाल का जवाब भी ध्यान में रखते हुए कर रहा हूँ, के रूप में यह कोड से ज्यादा मिला है)

+1

यह सटीक कोड नहीं है, आपके पास स्पेस ग्रुप ("टी") है, क्या आप किसी और चीज के बारे में सोच रहे थे या यह सिर्फ एक टाइपो था (यह नहीं करता संकलित नहीं) –

+0

@ जोन: अंतर है, हेल्पर्स के साथ।ForceSpaceGroupsToBeTabs वह पैरामीटर को "रेफरी" पैरामीटर के रूप में बदल सकता है, जिस स्थिति में उसका मौजूदा कोड * वांछित प्रभाव होगा। विस्तार विधियों के साथ, आप परम रेफरी नहीं कर सकते ... – BFree

+0

@BFree: यह सच है - संपादित होगा। –

10

यदि यह एक संदर्भ प्रकार है , आपको इसकी सामग्री बदलनी होगी। यदि यह एक मूल्य प्रकार है जिसमें आप गुजर रहे हैं, तो आप भाग्य से बाहर हैं। सी # में कार्यात्मक प्रतिमानों का समर्थन करने के लिए विस्तार विधियों का अस्तित्व स्थापित किया गया है, और उनके कार्यात्मक प्रतिमान, उनके सार के अनुसार, प्रकारों की अपरिवर्तनीयता की ओर रुख करते हैं, इसलिए मूल्य विधि को बदलने की अक्षमता जिसमें से एक्सटेंशन विधि कहा जाता है।

दूसरे शब्दों में, जबकि आप कर सकते हैं, यह कार्यात्मक प्रोग्रामिंग की "भावना" को ध्यान में रखते हुए नहीं हो सकता है।

+3

मुझे लगता है कि इस उत्तर का दूसरा भाग भ्रामक है। विस्तार विधियों के लिए भारी उपयोग केस इंटरफेस पर है, जो संदर्भ प्रकार हैं, और उन मामलों में उत्परिवर्तन पर कोई विशेष सीमा नहीं है: क्षमताओं सामान्य तरीकों के समान हैं, 'a.SomeMethod(); '' 'कुछ और देखें, लेकिन उस ऑब्जेक्ट को बदल सकता है जो इसका संदर्भ देता है। –

संबंधित मुद्दे

 संबंधित मुद्दे