सी # नेमस्पेस उर्फ ​​- क्या बात है?


96

कहाँ या कब कोई नाम स्थान का उपयोग करेगा जैसे अलियासिंग

 using someOtherName =  System.Timers.Timer;

यह मुझे लगता है कि यह भाषा को समझने के लिए और अधिक भ्रम को जोड़ देगा।


6
कैसे के बारे में एक प्रणाली में व्यापक using int = System.Int32सी #? उपयोगी है, है ना? इसका वही उपयोग जो अन्यत्र किया जा सकता है।
नवफाल

@nawfal मेरा मानना ​​है कि प्रकार के उपनाम निर्यात योग्य नहीं हैं। मतलब आप कुछ ऐसा परिभाषित नहीं कर सकते हैं using int = System.Int32, और इसे घोषित फ़ाइल के अलावा अन्य स्थानों पर उपयोग कर सकते हैं। इस तो intकरने के लिए Int32उर्फ या तो किसी और तरीके से प्राप्त किया जा सकता है, या संकलक / क्रम में एक विशेष बात है।
KFL

1
@ केएफएल यह सच है, लेकिन दोनों का लाभ एक ही प्रकृति का है।
नवाफल

1
@nawfal के बारे using int = System.Int32में आपका तर्क गलत और भ्रामक है - यह गलत है क्योंकि intउपनाम आपके द्वारा बताए गए तरीके को लागू नहीं करता है। यह भ्रामक है क्योंकि आप एलियास टाइप करते हैं, विश्व स्तर पर इस्तेमाल किया जा सकता है, जैसे कि कैसे intउपयोग किया जाता है Int32
KFL

2
@ KFL मैं दोनों का मतलब नहीं था। मैंने अभी कहा कि एक प्रकार के लिए एक कस्टम नाम उपयोगी क्यों हो सकता है।
नवाफल

जवाबों:


151

यह एक प्रकार का उपनाम है, एक नाम स्थान उपनाम नहीं; यह अवहेलना करने के लिए उपयोगी है - उदाहरण के लिए, के खिलाफ:

using WinformTimer = System.Windows.Forms.Timer;
using ThreadingTimer = System.Threading.Timer;

(पीएस: की पसंद के लिए धन्यवाद Timer।- पी )

अन्यथा, यदि आप दोनों का उपयोग करते हैं System.Windows.Forms.Timerऔर System.Timers.Timerएक ही फाइल में आपको पूरा नाम देना होता है (क्योंकि Timerभ्रमित किया जा सकता है)।

यह externअलग-अलग विधानसभाओं से एक ही पूरी तरह से योग्य प्रकार के नाम के साथ उपनामों का उपयोग करने के लिए एक हिस्सा भी निभाता है - दुर्लभ, लेकिन समर्थित होने के लिए उपयोगी है।


वास्तव में, मैं एक और उपयोग देख सकता हूं: जब आप एक प्रकार की त्वरित पहुंच चाहते हैं, लेकिन एक नियमित उपयोग नहीं करना चाहते हैं usingक्योंकि आप कुछ परस्पर विरोधी विस्तार विधियों को आयात नहीं कर सकते हैं ... थोड़ा जटिल, लेकिन ... यहां एक उदाहरण है ...

namespace RealCode {
    //using Foo; // can't use this - it breaks DoSomething
    using Handy = Foo.Handy;
    using Bar;
    static class Program {
        static void Main() {
            Handy h = new Handy(); // prove available
            string test = "abc";            
            test.DoSomething(); // prove available
        }
    }
}
namespace Foo {
    static class TypeOne {
        public static void DoSomething(this string value) { }
    }
    class Handy {}
}
namespace Bar {
    static class TypeTwo {
        public static void DoSomething(this string value) { }
    }
}

8
इसे या तो नामस्थान या प्रकार के नामों के लिए उपयोग किया जा सकता है।
शाइन ब्राइट

1
@Sean: हाँ, लेकिन उदाहरण दिए गए एक प्रकार के लिए गया था
मार्क Gravell

@lupefiasco: चयन करने के लिए ओ पी के सुविधाजनक System.Timers.Timer;-p
मार्क Gravell

आह, लगा कि आप अवधारणा का जिक्र कर रहे हैं न कि विशिष्ट उदाहरण का। मैया पापा।
शॉन ब्राइट

26

मैं इसका उपयोग तब करता हूं जब मुझे परस्पर विरोधी उप नामस्थान और / या ऑब्जेक्ट नाम के साथ कई नामस्थान मिले हैं, जैसे आप [उदाहरण के रूप में] कुछ कर सकते हैं:

using src = Namespace1.Subspace.DataAccessObjects;
using dst = Namespace2.Subspace.DataAccessObjects;

...

src.DataObject source = new src.DataObject();
dst.DataObject destination = new dst.DataObject();

जिसे अन्यथा लिखना होगा:

Namespace1.Subspace.DataAccessObjects.DataObject source = 
  new Namespace1.Subspace.DataAccessObjects.DataObject();

Namespace2.Subspace.DataAccessObjects.DataObject dstination = 
  new Namespace2.Subspace.DataAccessObjects.DataObject();

यह एक टन टाइपिंग बचाता है और कोड को पढ़ने में बहुत आसान बनाने के लिए उपयोग किया जा सकता है।


17

उल्लिखित उदाहरणों के अलावा, बार-बार जेनेरिक प्रकारों का जिक्र करते हुए टाइप उपनाम (बजाय नाम स्थान उपनाम) से काम लिया जा सकता है:

Dictionary<string, SomeClassWithALongName> foo = new Dictionary<string, SomeClassWithALongName>();

private void DoStuff(Dictionary<string, SomeClassWithALongName> dict) {}

बनाम:

using FooDict = Dictionary<string, SomeClassWithALongName>;

FooDict foo = new FooDict();

private void DoStuff(FooDict dict) {}

8

संक्षिप्तता।

ऐसे नामस्थानों के बीच स्पष्टता प्रदान करने के लिए फ्रिंज लाभ हैं जो प्रकार के नाम साझा करते हैं, लेकिन अनिवार्य रूप से यह सिर्फ चीनी है।


यह स्पष्ट रूप से दिखाता है कि आप किस प्रतीक का उपयोग कर रहे हैं। यह सिर्फ चीनी नहीं है, लेकिन थोड़ी सी क्रिया है (यदि आप एक नया नाम परिभाषित नहीं करना चाहते हैं)।
पृथ्वी इंजन

7

मैं हमेशा इस तरह की स्थितियों में इसका इस्तेमाल करता हूं

using Utility = MyBaseNamespace.MySubNamsepace.Utility;

जहां Utilityअन्यथा एक अलग संदर्भ (जैसे MyBaseNamespace.MySubNamespace.MySubSubNamespace.Utility) होगा, लेकिन मैं Utilityहमेशा उस एक विशेष वर्ग की ओर इशारा करता हूं ।


6

यह बहुत उपयोगी है जब आपके पास एकाधिक नामांकित नामों में एक ही नाम के साथ कई कक्षाएं हैं। उदाहरण के लिए...

namespace Something.From.SomeCompanyA {
    public class Foo {
        /* ... */
    }
}

namespace CompanyB.Makes.ThisOne {
    public class Foo {
        /* ... */
    }
}

संकलक को खुश करने के लिए और आपकी टीम पर आपके और अन्य लोगों के लिए चीजों को स्पष्ट करने के लिए आप उपनाम का उपयोग कर सकते हैं:

using CompanyA = Something.From.CompanyA;
using CompanyB = CompanyB.Makes.ThisOne;

/* ... */

CompanyA.Foo f = new CompanyA.Foo();
CompanyB.Foo x = new CompanyB.Foo();

3

हमने अपने सभी नामस्थानों के लिए नाम स्थान उपनामों को परिभाषित किया है। यह यह देखना बहुत आसान बनाता है कि एक वर्ग कहां से आता है, जैसे:

using System.Web.WebControls;
// lots of other using statements

// contains the domain model for project X
using dom = Company.ProjectX.DomainModel; 
// contains common web functionality
using web = Company.Web;
// etc.

तथा

// User from the domain model
dom.User user = new dom.User(); 
// Data transfer object
dto.User user = new dto.User(); 
// a global helper class
utl.SomeHelper.StaticMethod(); 
// a hyperlink with custom functionality
// (as opposed to System.Web.Controls.HyperLink)
web.HyperLink link = new web.HyperLink(); 

हमने कुछ दिशा-निर्देशों को परिभाषित किया है कि कैसे उपनामों का नाम होना चाहिए और हर कोई उनका उपयोग कर रहा है।


1
क्या आपको पता नहीं है कि अक्सर उपनाम का उस संदर्भ से अधिक लेना-देना होता है जिसमें इसका उपयोग वस्तु के भौतिक स्थान की तुलना में किया जा रहा है?
बेनालास्टर

2

मुझे इकाई परीक्षण में उपनाम बहुत उपयोगी लगते हैं। जब आप इकाई परीक्षण लिख रहे हैं, तो विषय को परीक्षा के रूप में घोषित करना एक आम बात है

MyClass myClassUT;

myClassUTविषय यू nder टी स्था। होने के नाते , लेकिन क्या होगा यदि आप स्थिर तरीकों के साथ एक स्थिर वर्ग के लिए इकाई परीक्षण लिखना चाहते हैं? तो आप इस तरह से एक उपनाम बना सकते हैं:

using MyStaticClassUT = Namespace.MyStaticClass;

फिर आप इस तरह से अपने यूनिट टेस्ट लिख सकते हैं:

public void Test()
{
    var actual = MyStaticClassUT.Method();
    var expected = ...
}

और आप परीक्षण के अधीन विषय क्या है की ढीली दृष्टि कभी नहीं।


2

एक तरह से विजुअल स्टूडियो में कोडिंग करते समय यह वास्तव में आसान है।

उपयोग-मामला : मान लीजिए कि मैं SqlConnectionनाम मात्र के कुछ वर्गों जैसे उदाहरण के लिए उपयोग करना चाहता हूँ System.Data। सामान्य पाठ्यक्रम में मैं System.Data.SqlClient* .cs फ़ाइल के शीर्ष पर नाम स्थान का आयात करूँगा जैसा कि नीचे दिखाया गया है:

using System.Data;

अब मेरी अक्ल देखो। यह कोड संपादक में टाइप करते समय चुनने के लिए बहुत सारी कक्षाओं के साथ भारी रूप से प्रफुल्लित है। मैं कक्षाओं के पूरे समूह का उपयोग नहीं करने जा रहा हूँ:

यहां छवि विवरण दर्ज करें

इसलिए मैं अपने * .cs फ़ाइल के शीर्ष पर एक अन्य नाम का उपयोग करूंगा और एक स्पष्ट जानकारी प्राप्त करूंगा:

using SqlDataCon = System.Data.SqlClient.SqlConnection

अब मेरे अंतर्मुखी दृश्य को देखो। यह सुपर-क्लियर और सुपर-क्लीन है।

यहां छवि विवरण दर्ज करें


1

एक कारण मुझे पता है; जब आप आयातित नेमस्पेस से नाम टकराव करते हैं तो यह आपको छोटे नामों का उपयोग करने देता है। उदाहरण:

यदि आपने घोषित किया using System.Windows.Forms;और using System.Windows.Input; जब आप एक्सेस करने जाते हैं तो उसी फ़ाइल में आप ModifierKeysपाते हैं कि नाम और नाम ModifierKeysदोनों जगह है । घोषणा के द्वारा तो आप तो प्राप्त कर सकते हैं के माध्यम से ।System.Windows.Forms.ControlSystem.Windows.Inputusing Input = System.Windows.Input;System.Windows.Input.ModifierKeysInput.ModifierKeys

मैं सी # बफ नहीं हूं लेकिन अलियासिंग नेमस्पेस मुझे "बेस्ट प्रैक्टिस" की तरह लगता है। इस तरह आप जानते हैं कि आप क्या कर रहे हैं और अभी भी बहुत अधिक टाइप करने की जरूरत नहीं है।


1

आप किसी कोड को बहुत आसानी से संशोधित करने के लिए उनका उपयोग कर सकते हैं।

उदाहरण के लिए:

#if USE_DOUBLES
using BNumber = System.Double;
#else
using BNumber = System.Single;
#endif

public void BNumber DoStuff(BNumber n) {
    // ...
}
public void BNumber DoStuff2(BNumber n) {
    // ...
}
public void BNumber DoStuff3(BNumber n) {
    // ...
}

निर्देश के साधारण परिवर्तन से आप यह तय कर सकते हैं कि आपका पूरा कोड काम करता है floatया नहीं double

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.