সি # নেমস্পেস ওরফে - কী কথা?


97

কোথায় বা কখন একজন নেমস্পেসের মতো এলিয়াসিং ব্যবহার করবে

 using someOtherName =  System.Timers.Timer;

আমার কাছে মনে হচ্ছে এটি ভাষা বোঝার ক্ষেত্রে আরও বিভ্রান্তি যুক্ত করবে।


6
using int = System.Int32সি # বিস্তৃত সিস্টেম সম্পর্কে কীভাবে ? দরকারী, তাই না? এটি একই ব্যবহার যা অন্য কোথাও থেকে নেওয়া যেতে পারে।
নওফাল

@ নওফাল আমি বিশ্বাস করি টাইপ এলিয়াস রফতানিযোগ্য নয়। মানে আপনি এর মতো কিছু সংজ্ঞায়িত করতে পারবেন না using int = System.Int32এবং এটি ঘোষণা করার ফাইল ব্যতীত অন্য জায়গায় ব্যবহার করতে পারবেন না । এই তাই intকরতে Int32ওরফে পারেন কিছু অন্যান্য উপায়ে অর্জন করা হতে পারে, অথবা কম্পাইলার / রানটাইম একটি বিশেষ জিনিস।
কেএফএল

4
@ কেএফএল এটি সত্য, তবে উভয়েরই সুবিধাটি একই প্রকৃতির।
নওফাল

4
@ নওফাল সম্পর্কে আপনার যুক্তিটি using int = System.Int32ভুল এবং বিভ্রান্তিমূলক উভয়ই - এটি ভুল কারণ intআপনার বর্ণনার উপমাটি প্রয়োগ করা হয়নি। এটি বিভ্রান্তিকর কারণ আপনি ইঙ্গিতটি দিয়েছিলেন যে এলিয়াসগুলি বিশ্বব্যাপী ব্যবহার করা যেতে পারে ঠিক তেমনভাবে কীভাবে intব্যবহৃত হয় Int32
কেএফএল

4
@ KFL- কে আমি উভয়ই বোঝাতে চাইনি। আমি কেবল বলেছি কেন কোনও প্রকারের জন্য কাস্টম নাম রাখা দরকারী হতে পারে।
নওফাল

উত্তর:


152

এটি একটি প্রকারের উপনাম, নাম স্থানের উপনাম নয়; এটি নিষ্ক্রিয় করা কার্যকর - উদাহরণস্বরূপ:

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

(PS: Timer;-p পছন্দ করার জন্য ধন্যবাদ )

অন্যথায়, আপনি যদি উভয় System.Windows.Forms.Timerএবং System.Timers.Timerএকই ফাইলে ব্যবহার করেন তবে আপনাকে পুরো নাম দেওয়া চালিয়ে Timerযেতে হবে (যেহেতু বিভ্রান্তি হতে পারে)।

এটি বিভিন্ন externঅ্যাসেমব্লির একই সম্পূর্ণরূপে-যোগ্য টাইপের নাম সহ প্রকারগুলি ব্যবহারের জন্য এলিয়াসগুলির সাথে একটি অংশও অভিনয় করে - বিরল, তবে সমর্থনযোগ্য useful


প্রকৃতপক্ষে, আমি আরও একটি ব্যবহার দেখতে পাচ্ছি: আপনি যখন কোনও প্রকারে দ্রুত অ্যাক্সেস চান তবে কোনও নিয়মিত ব্যবহার করতে চান না 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
এটি নেমস্পেস বা নাম টাইপ করতে হয় উপন্যাসের জন্য ব্যবহার করা যেতে পারে।
শান উজ্জ্বল

4
@ শীন: হ্যাঁ, তবে প্রদত্ত উদাহরণটি একটি ধরণের ছিল
মার্ক গ্র্যাভেল

@ লুপিফিয়াসকো: বেছে System.Timers.Timerনেওয়ার জন্য ওপিতে সুবিধাজনক ;
মার্ক

আহ্, ভেবেছিলেন আপনি ধারণাটির উল্লেখ করছেন, নির্দিষ্ট উদাহরণটি নয়। আমার কুলপা।
শান উজ্জ্বল

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

আমরা আমাদের সমস্ত নেমস্পেসের নেমস্পেসের এলিয়াসগুলি সংজ্ঞায়িত করেছি। এটি কোনও ক্লাসটি কোথা থেকে আসে তা দেখতে খুব সহজেই তোলে eg

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(); 

আমরা কিছু নির্দেশিকা সংজ্ঞায়িত করেছি যে কীভাবে এলিয়াসের নামকরণ করা উচিত এবং প্রত্যেকে সেগুলি ব্যবহার করছে।


4
আপনি কি দেখতে পান না যে প্রায়শই উপনামটির প্রাসঙ্গিক বিষয়টির সাথে আরও কিছু যুক্ত রয়েছে যেখানে এটি বস্তুর শারীরিক অবস্থানের চেয়ে বেশি ব্যবহৃত হচ্ছে?
বেনএলাবাস্টার

2

ইউনিট টেস্টিংয়ে আমি এলিয়াসগুলি খুব দরকারী বলে মনে করি। আপনি যখন ইউনিট পরীক্ষা লিখছেন, তখন বিষয়টিকে পরীক্ষার হিসাবে ঘোষণা করা একটি সাধারণ অভ্যাস

MyClass myClassUT;

U nder T est myClassUTসাবজেক্ট হচ্ছে তবে আপনি যদি স্ট্যাটিক পদ্ধতিতে স্ট্যাটিক ক্লাসের ইউনিট টেস্ট লিখতে চান তবে কী হবে? তারপরে আপনি এটির মতো একটি নাম তৈরি করতে পারেন:

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.Controlএবং System.Windows.Inputনেমস্পেসে রয়েছে। সুতরাং ঘোষণার মাধ্যমে using Input = System.Windows.Input;আপনি তার System.Windows.Input.ModifierKeysমাধ্যমে যেতে পারেন Input.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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.