কোথায় বা কখন একজন নেমস্পেসের মতো এলিয়াসিং ব্যবহার করবে
using someOtherName = System.Timers.Timer;
আমার কাছে মনে হচ্ছে এটি ভাষা বোঝার ক্ষেত্রে আরও বিভ্রান্তি যুক্ত করবে।
কোথায় বা কখন একজন নেমস্পেসের মতো এলিয়াসিং ব্যবহার করবে
using someOtherName = System.Timers.Timer;
আমার কাছে মনে হচ্ছে এটি ভাষা বোঝার ক্ষেত্রে আরও বিভ্রান্তি যুক্ত করবে।
using int = System.Int32
এবং এটি ঘোষণা করার ফাইল ব্যতীত অন্য জায়গায় ব্যবহার করতে পারবেন না । এই তাই int
করতে Int32
ওরফে পারেন কিছু অন্যান্য উপায়ে অর্জন করা হতে পারে, অথবা কম্পাইলার / রানটাইম একটি বিশেষ জিনিস।
using int = System.Int32
ভুল এবং বিভ্রান্তিমূলক উভয়ই - এটি ভুল কারণ int
আপনার বর্ণনার উপমাটি প্রয়োগ করা হয়নি। এটি বিভ্রান্তিকর কারণ আপনি ইঙ্গিতটি দিয়েছিলেন যে এলিয়াসগুলি বিশ্বব্যাপী ব্যবহার করা যেতে পারে ঠিক তেমনভাবে কীভাবে int
ব্যবহৃত হয় Int32
।
উত্তর:
এটি একটি প্রকারের উপনাম, নাম স্থানের উপনাম নয়; এটি নিষ্ক্রিয় করা কার্যকর - উদাহরণস্বরূপ:
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) { }
}
}
System.Timers.Timer
নেওয়ার জন্য ওপিতে সুবিধাজনক ;
আমি যখন বিবাদী সাব নেমস্পেস এবং / অথবা অবজেক্ট নামগুলির সাথে একাধিক নেমস্পেস পেয়েছি তখন আপনি এটি ব্যবহার করতে পারেন [উদাহরণস্বরূপ]:
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();
এটি এক টন টাইপিং সাশ্রয় করে এবং কোড পড়তে অনেক সহজ করে তোলে।
উল্লিখিত উদাহরণগুলি ছাড়াও, বার বার জেনেরিক প্রকারের উল্লেখ করার সময় টাইপ অ্যালিয়াসগুলি (নেমস্পেস অ্যালিয়াসগুলির চেয়ে) সহজ হতে পারে:
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) {}
ব্রেভিটি
নামের জায়গাগুলির মধ্যে স্বচ্ছতা জানাতে রয়েছে এমন প্রকারের সুবিধাগুলি যা প্রকারের নামগুলি ভাগ করে, তবে মূলত এটি কেবল চিনি।
আমি সর্বদা এটির মতো পরিস্থিতিতে এটি ব্যবহার করি
using Utility = MyBaseNamespace.MySubNamsepace.Utility;
যেখানে Utility
অন্যথায় আলাদা প্রসঙ্গ (যেমন MyBaseNamespace.MySubNamespace.MySubSubNamespace.Utility
) থাকবে তবে আমি আশা করি / Utility
সর্বদা সেই নির্দিষ্ট শ্রেণীর দিকে নির্দেশ করতে পছন্দ করি ।
আপনার একাধিক অন্তর্ভুক্ত নেমস্পেসে একই নামের একাধিক ক্লাস করার সময় এটি খুব কার্যকর। উদাহরণ স্বরূপ...
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();
আমরা আমাদের সমস্ত নেমস্পেসের নেমস্পেসের এলিয়াসগুলি সংজ্ঞায়িত করেছি। এটি কোনও ক্লাসটি কোথা থেকে আসে তা দেখতে খুব সহজেই তোলে 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();
আমরা কিছু নির্দেশিকা সংজ্ঞায়িত করেছি যে কীভাবে এলিয়াসের নামকরণ করা উচিত এবং প্রত্যেকে সেগুলি ব্যবহার করছে।
ইউনিট টেস্টিংয়ে আমি এলিয়াসগুলি খুব দরকারী বলে মনে করি। আপনি যখন ইউনিট পরীক্ষা লিখছেন, তখন বিষয়টিকে পরীক্ষার হিসাবে ঘোষণা করা একটি সাধারণ অভ্যাস
MyClass myClassUT;
U nder T est myClassUT
সাবজেক্ট হচ্ছে তবে আপনি যদি স্ট্যাটিক পদ্ধতিতে স্ট্যাটিক ক্লাসের ইউনিট টেস্ট লিখতে চান তবে কী হবে? তারপরে আপনি এটির মতো একটি নাম তৈরি করতে পারেন:
using MyStaticClassUT = Namespace.MyStaticClass;
তারপরে আপনি নিজের ইউনিট পরীক্ষাগুলি এভাবে লিখতে পারেন:
public void Test()
{
var actual = MyStaticClassUT.Method();
var expected = ...
}
এবং আপনি পরীক্ষার অধীনে বিষয় কী তা কখনই দেখবেন না।
ভিজ্যুয়াল স্টুডিওতে কোডিংয়ের সময় এক উপায়ে এটি সত্যই কার্যকর।
ব্যবহারের ক্ষেত্রে : ধরা যাক আমি কেবলমাত্র কয়েকটি ক্লাস ব্যবহার করেছি যেমন SqlConnection
একটি নেমস্পেস থেকে System.Data
। সাধারণ কোর্সে আমি System.Data.SqlClient
নীচের মতো * .cs ফাইলের শীর্ষে নেমস্পেসটি আমদানি করব :
using System.Data;
এখন আমার বুদ্ধি দেখুন। কোড সম্পাদকে টাইপ করার সময় এটি বেছে নেওয়া পুরো ক্লাসগুলির সাথে প্রচুর পরিমাণে প্রসারিত। আমি মোটেও পুরো গুচ্ছ ক্লাস ব্যবহার করব না:
সুতরাং আমি আমার * .cs ফাইলের শীর্ষে একটি উপনাম ব্যবহার করব এবং একটি স্পষ্ট ইন্টেলিজেন্স ভিউ পেয়ে যাব:
using SqlDataCon = System.Data.SqlClient.SqlConnection
এখন আমার ইন্টেলিজেন্স ভিউ দেখুন। এটি সুপার-ক্লিয়ার এবং সুপার-ক্লিন।
একটি কারণ আমি জানি; যখন আপনার আমদানি করা নেমস্পেসগুলি থেকে নামের সংঘর্ষ হয় তখন এটি আপনাকে ছোট নাম ব্যবহার করতে দেয়। উদাহরণ:
আপনি যদি ঘোষিত হন 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
।
আমি কোনও সি # বাফ নই তবে নামকরণ স্থানটি আমার কাছে "সেরা অনুশীলন" বলে মনে হয়। আপনি কী পাচ্ছেন তা আপনি জানেন এবং এখনও বেশি কিছু লিখতে হবে না।
আপনি খুব সহজেই কোনও কোড পরিবর্তন করতে এগুলি ব্যবহার করতে পারেন।
উদাহরণ স্বরূপ:
#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
।
using int = System.Int32
সি # বিস্তৃত সিস্টেম সম্পর্কে কীভাবে ? দরকারী, তাই না? এটি একই ব্যবহার যা অন্য কোথাও থেকে নেওয়া যেতে পারে।