2013-04-03 6 views
5

के रूप में पारित किया गया था क्या किसी ऑब्जेक्ट को किसी विधि में पास करने के लिए स्वीकार्य अभ्यास है, फिर विधि के अंदर एक नई वस्तु बनाने के बजाय उसी ऑब्जेक्ट को वापस कर दें?विधि उसी ऑब्जेक्ट को वापस कर रहा है जो पैरामीटर

एक उदाहरण के रूप: अगर एक इकाई वर्ग है इस प्रकार है:

class UserDetails { 
    int UserID { get; set; } 
    string UserName { get; set; } 
    string UserAge { get; set; } 
} 

और फिर मैं, इस प्रकार एक पद्धति के लिए इस वर्ग का एक उदाहरण पारित:

UserDetails UserInfo = new UserDetails(); 
UserInfo = Get_Details(UserInfo); 

इसके लिए उचित है निम्नलिखित करने का तरीका?

public UserDetails Get_Details(UserDetails user) { 
    // SQL Operations... 
    user.age = 32; 
    return user; 
} 
+3

एक अवलोकन, तो आप उन्हें –

+2

एक छोटी सी बात :-P हो रही के बजाय सेटिंग ब्यौरे में कर रहे हैं: अपने कार्य का नाम है (मुझे लगता है कि नहीं होगा नाम के एक समारोह 'Get_Details' अपने इनपुट परिवर्तन) को गुमराह। अन्य तो आप जिस अभ्यास को झुकाव देते हैं वह उचित है। – Oren

+1

शायद यह कोड समीक्षा स्टैक एक्सचेंज पर होना चाहिए? – James

उत्तर

1

यह builder pattern साथ उपयोगी हो सकता है (जब आप कदम से एक जटिल वस्तु कदम का निर्माण करना चाहते)।

एक बहुत बुरा उदाहरण के रूप में:

class FooBuilder { 
    FooBuilder WithAge(int age); 
    FooBuilder WithUrl(Url url); 

    Foo ToFoo(); 
} 

new FooBuilder().WithAge(12).WithUrl(new Url("http://www.happybirthday.com/").ToFoo(); 

अपने विशेष मामले में, मैं प्रारंभकर्ता वाक्य रचना के साथ एक ही बार में सब कुछ प्रारंभ करने में पसंद करेंगे।

new User { Age = 45, UserName = "Bob", Id = 101 }; 
0

यह एक संभावित दृष्टिकोण है और जब आपके पास एक काम करने के लिए केवल एक आइटम है, तो सबसे अच्छा भी। तुम भी ref, जो पारित कर दिया पैरामीटर

public void Get_Details(ref UserDetails user) 
{ 
    // SQL Operations. . . 
    user.age= 32; 
} 

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

+1

यदि आप वास्तविक संदर्भ को बदलना चाहते हैं तो आप केवल 'रेफरी' कीवर्ड का उपयोग करेंगे। 'Ref' कीवर्ड के बिना इसे पास करने से ऑब्जेक्ट की एक प्रति नहीं बनती है, यह केवल संदर्भ की एक प्रति बनाता है। – Guffa

+0

यह समझ में नहीं आता है ... फिर वहां 'रेफरी' क्यों है? –

+0

'ref' कीवर्ड संदर्भ को धारण करने वाले वेरिएबल का संदर्भ बनाता है (या वैरिएबल वैल्यू होल्डिंग मान यदि यह मान प्रकार है)। आप विधि के अंदर से पारित चर को बदल सकते हैं। – Guffa

0

आपको रिपोजिटरी पैटर्न और ओओडी की अवधारणाओं को देखने के लिए अच्छा प्रदर्शन हो सकता है। आम तौर पर, मैं अनुमान या पूरी तरह से लोड की गई संस्थाओं को पसंद करता हूं।

public UserDetailsProjection GetDetailsByUserId(Guid userID) 
{ 
    // Code goes here 
    return user; 
} 

नोट: रेफरी आवश्यक नहीं है, क्योंकि सभी ऑब्जेक्ट संदर्भ द्वारा पारित किए जाते हैं।

2

आईएमओ, ऑब्जेक्ट वापस करने की कोई आवश्यकता नहीं है। चूंकि यह को पर संदर्भ द्वारा पारित किया गया है, कॉलर के पास पहले से ही एक ही ऑब्जेक्ट का संदर्भ है (विधि पूर्ण होने के बाद अद्यतन मानों के साथ)।

class X 
{ 
    public X DoThis(int number) 
    { 
    // do something 
    return this; 
    } 
    public X DoThat(string name) 
    { 
    // do something else 
    return this; 
    } 
} 

यह बहुत पठनीय कोड लिखने की अनुमति देता है:

दूसरी ओर, कुछ स्थितियों में उपयोगी हो सकता है जो एक धाराप्रवाह इंटरफ़ेस है, जहां एक वर्ग के उदाहरण-तरीकों फिर से उदाहरण लौटने के लिए, उदाहरण के लिए है , जैसे:

var x = new X().DoThis(23).DoThat("asdf"); 
0

ऐसा करने से काम हैं जो आप कर कुछ भी नहीं बदलता है के रूप में, बल्कि व्यर्थ है।

इस तरह यह कॉलिंग:

Get_Details(UserInfo); 

संदर्भ रिटर्निंग केवल भ्रमित हो सकता है, अग्रणी किसी को उस पर विश्वास करना:

UserInfo = Get_Details(UserInfo); 

यह बुला और वापसी मान अनदेखी के रूप में ही परिणाम देता है विधि एक नया उदाहरण देता है, क्योंकि संदर्भ को वापस करने का एकमात्र तार्किक कारण होगा।

इसे और अधिक समझ बनाने होगा कक्षा में है कि विधि के लिए, ताकि आप के रूप में यह कहते हैं:

UserInfo.Get_Details(); 

अपने विधि वस्तु आरंभ माना जाता है, तो आप के बजाय कोड डाल यह निर्माता उदाहरण बनाने के बाद यह बुला से:

UserDetails UserInfo = new UserDetails(); 
:

class UserDetails { 

    int UserID { get; set; } 
    string UserName { get; set; } 
    string UserAge { get; set; } 

    public UserDetails() { 
    Get_Details(this); 
    } 

} 

तो फिर तुम सिर्फ इंस्टेंस बनाएं और निर्माता डेटा लोड

1

इसमें कुछ भी गलत नहीं है लेकिन कुछ अवलोकन;

  • आप एक विधि के अंदर सेटिंग ब्यौरे में कर रहे हैं कहा जाता get शायद load अधिक उपयुक्त है।
  • यदि आप केवल UserDetails में गुजर रहे हैं क्योंकि आप अपने आईडी के लिए आईडी चाहते हैं तो पैरामीटर केवल id होना चाहिए। यह इंटरफ़ेस को एकजुट रखता है।
  • इसे आम तौर पर किसी विधि के भीतर पैरामीटर ऑब्जेक्ट को संशोधित करने के लिए खराब रूप माना जाता है, यानी उत्परिवर्तन सिद्धांत।
0

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

public class SomeClass 
{ 
    public string Field_1; 
    public int Field_2; 

    public SomeClass(int ID) 
    { 
     // Sql operations by ID or another value 
     // set fields 
    } 

    public AnotherMethod(int ID) 
    { 
     // Sql operations by ID or another value 
     // set fields 
    } 
} 
संबंधित मुद्दे