.NET এ কী কী বৈশিষ্ট্য রয়েছে?


206

.NET- এ বৈশিষ্ট্যগুলি কী কী, সেগুলির জন্য কী ভাল এবং আমি কীভাবে আমার নিজস্ব বৈশিষ্ট্য তৈরি করব?

উত্তর:


146

মেটাডেটা। আপনার অবজেক্ট / পদ্ধতি / বৈশিষ্ট্য সম্পর্কে ডেটা।

উদাহরণস্বরূপ আমি একটি অ্যাট্রিবিউট নামক ডিক্লেয়ার করতে পারি: ডিসপ্লে অর্ডার যাতে আমি সহজেই নিয়ন্ত্রণ করতে পারি কোন অর্ডার বৈশিষ্ট্যগুলি ইউআইতে প্রদর্শিত হবে। আমি তখন এটি একটি শ্রেণিতে সংযোজন করতে এবং কিছু জিইআইআই উপাদান লিখতে পারি যা বৈশিষ্ট্যগুলি বের করে এবং যথাযথভাবে ইউআই উপাদানগুলি অর্ডার করে।

public class DisplayWrapper
{
    private UnderlyingClass underlyingObject;

    public DisplayWrapper(UnderlyingClass u)
    {
        underlyingObject = u;
    }

    [DisplayOrder(1)]
    public int SomeInt
    {
        get
        {
            return underlyingObject .SomeInt;
        }
    }

    [DisplayOrder(2)]
    public DateTime SomeDate
    {
        get
        {
            return underlyingObject .SomeDate;
        }
    }
}

এর মাধ্যমে এটি নিশ্চিত করা হয় যে আমার কাস্টম জিইউআই উপাদানগুলির সাথে কাজ করার সময় সোমডেটের আগে সর্বদা প্রদর্শিত হবে।

তবে, আপনি এগুলি সরাসরি কোডিং পরিবেশের বাইরে সবচেয়ে বেশি ব্যবহৃত দেখতে পাবেন। উদাহরণস্বরূপ উইন্ডোজ ডিজাইনার এগুলিকে ব্যাপকভাবে ব্যবহার করে তাই এটি কাস্টম তৈরি জিনিসগুলির সাথে কীভাবে আচরণ করতে হয় তা জানে। ব্রাউজেবলঅ্যাট্রিবিউট এর মতো ব্যবহার করুন:

[Browsable(false)]
public SomeCustomType DontShowThisInTheDesigner
{
    get{/*do something*/}
}

ডিজাইনারকে উদাহরণস্বরূপ ডিজাইনের সময় প্রপার্টি উইন্ডোতে উপলভ্য বৈশিষ্ট্যগুলিতে এটি তালিকাভুক্ত না করার জন্য বলে।

আপনি এগুলি কোড-জেনারেশন, প্রাক-সংকলন ক্রিয়াকলাপগুলির জন্য (যেমন পোস্ট-শার্প) বা রান-টাইম অপারেশন যেমন রিফ্লেকশন.ইমিটের জন্যও ব্যবহার করতে পারেন। উদাহরণস্বরূপ, আপনি প্রোফাইলিংয়ের জন্য কিছুটা কোড লিখতে পারেন যা প্রতিটি কোডকে আপনার কোড করে এবং এটি বার করে দেয় transparent আপনি নির্দিষ্ট পদ্ধতিতে যে কোনও বৈশিষ্ট্য রেখেছেন তার মাধ্যমে আপনি সময়টিকে "বেছে নিতে" বেছে নিতে পারেন।

public void SomeProfilingMethod(MethodInfo targetMethod, object target, params object[] args)
{
    bool time = true;
    foreach (Attribute a in target.GetCustomAttributes())
    {
        if (a.GetType() is NoTimingAttribute)
        {
            time = false;
            break;
        }
    }
    if (time)
    {
        StopWatch stopWatch = new StopWatch();
        stopWatch.Start();
        targetMethod.Invoke(target, args);
        stopWatch.Stop();
        HandleTimingOutput(targetMethod, stopWatch.Duration);
    }
    else
    {
        targetMethod.Invoke(target, args);
    }
}

এগুলি ঘোষণা করা সহজ, কেবলমাত্র এমন শ্রেণি তৈরি করুন যা অ্যাট্রিবিউট থেকে উত্তরাধিকার সূত্রে প্রাপ্ত।

public class DisplayOrderAttribute : Attribute
{
    private int order;

    public DisplayOrderAttribute(int order)
    {
        this.order = order;
    }

    public int Order
    {
        get { return order; }
    }
}

এবং মনে রাখবেন যে আপনি যখন অ্যাট্রিবিউটটি ব্যবহার করেন আপনি সংকলকটি "গুণবাচক" প্রত্যয়টি বাদ দিতে পারেন এটি আপনার জন্য যোগ করবে।

দ্রষ্টব্য: বৈশিষ্ট্যগুলি নিজেরাই কিছু করে না - তাদের ব্যবহার করে এমন কিছু অন্য কোড থাকা দরকার। কখনও কখনও সেই কোডটি আপনার জন্য রচিত হয়েছে তবে কখনও কখনও আপনাকে এটি নিজে লিখতে হবে। উদাহরণস্বরূপ, সি # সংকলক কিছু এবং নির্দিষ্ট ফ্রেমওয়ার্ক ফ্রেমওয়ার্কগুলি যত্নশীল করে (উদাহরণস্বরূপ NUnit একটি ক্লাসে [টেস্টফিজারেশন] এবং একটি সমাবেশে লোড করার সময় একটি পরীক্ষার পদ্ধতিতে [টেস্ট] সন্ধান করে) use
সুতরাং আপনার নিজস্ব কাস্টম অ্যাট্রিবিউট তৈরি করার সময় সচেতন থাকুন এটি আপনার কোডের আচরণের উপর কোনও প্রভাব ফেলবে না। আপনাকে অন্যান্য অংশটি লিখতে হবে যা গুণাবলী (প্রতিবিম্বের মাধ্যমে) পরীক্ষা করে এবং সেগুলিতে কাজ করে।


32
কি এটা মূল্য জন্য, এই একটি .NET সব তালিকা (সালে নির্মিত) বৈশিষ্ট্যাবলী নয় msdn.microsoft.com/en-us/library/aa311259(VS.71).aspx
wprl

1
আপনি কীভাবে আপনার "সাম্প্রফিলিংমেথোদ" ব্যবহার করবেন?
রায়লাভলেস

@ রেলাভলেস এটির কোনও বৈশিষ্ট্য নয়, সাম্প্রোফিলিংমথোড এমন একটি উপকরণ কোড যা প্রোফাইলিং গুণাবলী অনুসন্ধান করছে। বিশেষত উদাহরণে আমি একটি "অপ্ট-ইন" বৈশিষ্ট্যের বিপরীতে একটি "অপ্ট-আউট" বৈশিষ্ট্য (NoTimingAttribute) সন্ধান করেছি। ধারণাটি হ'ল এটি সমস্ত কিছুকে বার করে দেয়।
Quibbleome

@Quibblesome তোমার মত "গুণাবলী নিজেরাই কিছু করবেন না কিছু যোগ যায়নি - কিছু করা প্রয়োজন অন্যান্য তাদের ব্যবহার করার জন্য কোড (কম্পাইলার খেয়াল দম্পতি সম্পর্কে, বিভিন্ন অবকাঠামো কিছু ব্যবহার করুন) শুধু অ্যাট্রিবিউট কোডের প্রভাব আচরণ করবে না তৈরি করা। - আপনাকে অন্য অংশটি লিখতে হবে যা গুণাবলী (প্রতিবিম্বের মাধ্যমে) পরীক্ষা করে এবং সেগুলিতে কাজ করে "। (বা আপনি ঠিক থাকলে আমি এটি করতে পারি)। অনেক লোক যাদুকরীভাবে কাজ করার জন্য গুণাবলীর প্রত্যাশা করে এবং এখানে উত্তরগুলির কোনওটিই এটি পরিষ্কার করে না। (অথবা ঠিক লিংক stackoverflow.com/questions/4879521/... এটি জুড়ে যা)
আলেক্সেই Levenkov

আপনি যদি বিং ব্যবহার করা বন্ধ করেন তবেই। নাহ। জে / কে আমি আমার প্রাথমিক হিসাবে ডাকডাকগো ব্যবহার করি যা মূলত বিং আইরিক ব্যবহার করে। :)
Quibbleome

36

অনেক লোক উত্তর দিয়েছে তবে এখনও পর্যন্ত কেউ এটি উল্লেখ করেনি ...

বৈশিষ্ট্যগুলি প্রতিবিম্বের সাথে খুব বেশি ব্যবহৃত হয়। প্রতিবিম্ব ইতিমধ্যে বেশ ধীর।

আপনার কাস্টম বৈশিষ্ট্যগুলি রানটাইম পারফরম্যান্সের উন্নতির জন্য ক্লাস হিসাবে চিহ্নিত করা খুব সার্থকsealed

এই জাতীয় বৈশিষ্ট্য স্থাপনের জন্য কোথায় উপযুক্ত হবে তা বিবেচনা করা এবং এটির মাধ্যমে আপনার বৈশিষ্ট্যটি (!) নির্দিষ্ট করার জন্য এটিও ভাল ধারণা AttributeUsage। উপলভ্য বৈশিষ্ট্য ব্যবহারের তালিকা আপনাকে অবাক করে দিতে পারে:

  • সমাবেশ
  • মডিউল
  • শ্রেণী
  • struct
  • Enum
  • নির্মাতা
  • পদ্ধতি
  • সম্পত্তি
  • ক্ষেত্র
  • ঘটনা
  • ইন্টারফেস
  • স্থিতিমাপ
  • প্রতিনিধি
  • ফেরত মূল্য
  • GenericParameter
  • সব

এটি এও দুর্দান্ত যে অ্যাট্রিবিউট ইউজেজ অ্যাট্রিবিউট অ্যাট্রিবিউট ইউজেজ অ্যাট্রিবিউটের স্বাক্ষরের অংশ। ওহ সার্কুলার নির্ভরতার জন্য!

[AttributeUsageAttribute(AttributeTargets.Class, Inherited = true)]
public sealed class AttributeUsageAttribute : Attribute

13

ট্যাগিং ক্লাসগুলির জন্য বৈশিষ্ট্যগুলি এক ধরণের মেটা ডেটা। এটি প্রায়শই উইন্ডফর্মগুলিতে টুলবার থেকে নিয়ন্ত্রণগুলি গোপন করার জন্য ব্যবহৃত হয় তবে বিভিন্ন শ্রেণীর উদাহরণগুলি নির্দিষ্ট উপায়ে আচরণ করতে সক্ষম করার জন্য আপনার নিজের প্রয়োগে প্রয়োগ করা যেতে পারে।

একটি বৈশিষ্ট্য তৈরি করে শুরু করুন:

[AttributeUsage(AttributeTargets.Class, AllowMultiple=false, Inherited=true)]
public class SortOrderAttribute : Attribute
{
    public int SortOrder { get; set; }

    public SortOrderAttribute(int sortOrder)
    {
        this.SortOrder = sortOrder;
    }
}

সমস্ত অ্যাট্রিবিউট শ্রেণিতে বৈধ হওয়ার জন্য "অ্যাট্রিবিউট" প্রত্যয় থাকতে হবে।
এটি সম্পন্ন হওয়ার পরে, একটি শ্রেণি তৈরি করুন যা বৈশিষ্ট্যটি ব্যবহার করে।

[SortOrder(23)]
public class MyClass
{
    public MyClass()
    {
    }
}

এখন আপনি SortOrderAttributeনিম্নলিখিতটি করে একটি নির্দিষ্ট বর্গ ' (যদি এটির একটি থাকে) চেক করতে পারেন :

public class MyInvestigatorClass
{
    public void InvestigateTheAttribute()
    {
        // Get the type object for the class that is using
        // the attribute.
        Type type = typeof(MyClass);

        // Get all custom attributes for the type.
        object[] attributes = type.GetCustomAttributes(
            typeof(SortOrderAttribute), true);

        // Now let's make sure that we got at least one attribute.
        if (attributes != null && attributes.Length > 0)
        {
            // Get the first attribute in the list of custom attributes
            // that is of the type "SortOrderAttribute". This should only
            // be one since we said "AllowMultiple=false".
            SortOrderAttribute attribute = 
                attributes[0] as SortOrderAttribute;

            // Now we can get the sort order for the class "MyClass".
            int sortOrder = attribute.SortOrder;
        }
    }
}

আপনি যদি এই সম্পর্কে আরও পড়তে চান তবে সর্বদা এমএসডিএন যাচাই করতে পারেন যার বেশ ভাল বর্ণনা রয়েছে।
আমি আশা করি এটি আপনাকে সাহায্য করেছে!


5

একটি অ্যাট্রিবিউট এমন একটি শ্রেণি যা কিছুটা কার্যকারিতা ধারণ করে যা আপনার কোডের অবজেক্টগুলিতে প্রয়োগ করতে পারেন। একটি তৈরি করতে সিস্টেম থেকে উত্তরাধিকার সূত্রে একটি শ্রেণি তৈরি করুন from

তারা কি জন্য ভাল ... তাদের জন্য প্রায় সীমাহীন ব্যবহার আছে।

http://www.codeproject.com/KB/cs/dotnetattributes.aspx


1
"কার্যকারিতা" এখানে ভুল শব্দ; এগুলি মেটাডেটা, কার্যকারিতা নয়
মার্ক গ্রাভেল

5

বৈশিষ্ট্যগুলি ক্লাস, পদ্ধতি বা সমাবেশগুলিতে প্রয়োগ হওয়া মেটাডেটার মতো।

এগুলি যে কোনও সংখ্যক জিনিসের জন্য ভাল (ডিবাগার ভিজ্যুয়ালাইজেশন, জিনিসগুলি অপ্রচলিত হিসাবে চিহ্নিত করা, জিনিসকে সিরিয়ালাইজযোগ্য হিসাবে চিহ্নিত করা, তালিকা অন্তহীন) for

পাই হিসাবে সহজেই আপনার নিজস্ব কাস্টম তৈরি করা সহজ। এখান থেকে শুরু কর:

http://msdn.microsoft.com/en-us/library/sw480ze8(VS.71).aspx


5

যে প্রকল্পে আমি বর্তমানে কাজ করছি, সেখানে বিভিন্ন স্বাদের UI অবজেক্টের একটি সেট রয়েছে এবং মূল অ্যাপ্লিকেশনটিতে ব্যবহারের জন্য পৃষ্ঠাগুলি তৈরি করতে এই বিষয়গুলিকে একত্রিত করার জন্য একটি সম্পাদক আছেন, কিছুটা দেব স্টুডিওতে ফর্ম ডিজাইনারের মতো। এই বস্তুগুলি তাদের নিজস্ব সমাবেশে বিদ্যমান এবং প্রতিটি বস্তু একটি শ্রেণি থেকে উত্পন্ন UserControlএবং কাস্টম বৈশিষ্ট্যযুক্ত। এই বৈশিষ্ট্যটি এভাবে সংজ্ঞায়িত করা হয়:

[AttributeUsage (AttributeTargets::Class)]
public ref class ControlDescriptionAttribute : Attribute
{
public:
  ControlDescriptionAttribute (String ^name, String ^description) :
    _name (name),
    _description (description)
  {
  }

  property String ^Name
  {
    String ^get () { return _name; }
  }

  property String ^Description
  {
    String ^get () { return _description; }
  }

private:
  String
    ^ _name,
    ^ _description;
};

এবং আমি এটির মতো শ্রেণিতে এটি প্রয়োগ করি:

[ControlDescription ("Pie Chart", "Displays a pie chart")]
public ref class PieControl sealed : UserControl
{
  // stuff
};

যা আগের পোস্টাররা তাই বলেছিলেন।

অ্যাট্রিবিউটটি ব্যবহার করতে, সম্পাদকের একটি Generic::List <Type>নিয়ন্ত্রণ ধরন রয়েছে। একটি তালিকা বাক্স রয়েছে যা ব্যবহারকারীর কাছ থেকে নিয়ন্ত্রণের একটি উদাহরণ তৈরি করতে পৃষ্ঠা থেকে টেনে আনতে পারে। তালিকার বাক্সটি জনপ্রিয় করতে আমি ControlDescriptionAttributeনিয়ন্ত্রণটি পেতে পারি এবং তালিকায় একটি এন্ট্রি পূরণ করি:

// done for each control type
array <Object ^>
  // get all the custom attributes
  ^attributes = controltype->GetCustomAttributes (true);

Type
  // this is the one we're interested in
  ^attributetype = ECMMainPageDisplay::ControlDescriptionAttribute::typeid;

// iterate over the custom attributes
for each (Object ^attribute in attributes)
{
  if (attributetype->IsInstanceOfType (attribute))
  {
    ECMMainPageDisplay::ControlDescriptionAttribute
      ^description = safe_cast <ECMMainPageDisplay::ControlDescriptionAttribute ^> (attribute);

    // get the name and description and create an entry in the list
    ListViewItem
      ^item = gcnew ListViewItem (description->Name);

    item->Tag = controltype->Name;
    item->SubItems->Add (description->Description);

    mcontrols->Items->Add (item);
    break;
  }
}

দ্রষ্টব্য: উপরেরটি সি ++ / সিএলআই তবে এটি সি # তে রূপান্তর করা কঠিন নয় (হ্যাঁ, আমি জানি, সি ++ / সিএলআই একটি ঘৃণা তবে এটিই আমাকে কাজ করতে হবে :-()

আপনি বেশিরভাগ জিনিসে অ্যাট্রিবিউট লাগাতে পারেন এবং পূর্বনির্ধারিত বৈশিষ্ট্যের পুরো ব্যাপ্তি রয়েছে। উপরে উল্লিখিত সম্পাদক এছাড়াও বৈশিষ্ট্যগুলির মধ্যে কাস্টম বৈশিষ্ট্য অনুসন্ধান করে যা সম্পত্তি বর্ণনা করে এবং কীভাবে এটি সম্পাদনা করবে।

একবার আপনি পুরো ধারণাটি পেয়ে গেলে, আপনি অবাক হয়ে কীভাবে এগুলি ছাড়া বাঁচতেন।


4

যেমনটি বলা হয়েছে, বৈশিষ্ট্যগুলি তৈরি করা তুলনামূলক সহজ। কাজের অন্য অংশটি কোড ব্যবহার করছে যা এটি ব্যবহার করে। বেশিরভাগ ক্ষেত্রে আপনি কোনও গুণাবলীর উপস্থিতি বা এর বৈশিষ্ট্যের উপস্থিতির উপর ভিত্তি করে আচরণ পরিবর্তন করতে রানটাইমের সময় প্রতিচ্ছবি ব্যবহার করবেন। এমন পরিস্থিতিতেও রয়েছে যেখানে আপনি কোনও ধরণের স্থিতিশীল বিশ্লেষণ করতে সংকলিত কোডের বৈশিষ্ট্যগুলি পরিদর্শন করবেন। উদাহরণস্বরূপ, পরামিতিগুলি নন-নাল হিসাবে চিহ্নিত হতে পারে এবং বিশ্লেষণ সরঞ্জামটি এটি একটি ইঙ্গিত হিসাবে ব্যবহার করতে পারে।

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


3

বৈশিষ্ট্যগুলি মূলত, আপনার ধরণের (শ্রেণি, পদ্ধতি, ইভেন্ট, এনাম ইত্যাদি) সংযুক্ত করতে চান এমন ডেটার বিট are

ধারণাটি হ'ল চলমান সময়ে বৈশিষ্ট্যযুক্ত তথ্যের জন্য অন্য কোনও ধরণের / ফ্রেমওয়ার্ক / সরঞ্জাম আপনার প্রকারটি জিজ্ঞাসা করবে এবং এতে কাজ করবে।

সুতরাং, উদাহরণস্বরূপ, ভিজ্যুয়াল স্টুডিও কোনও তৃতীয় পক্ষের নিয়ন্ত্রণের বৈশিষ্ট্যগুলি জিজ্ঞাসা করতে পারে যা নির্ধারণের সময় প্রোপার্টি ফলকটিতে নিয়ন্ত্রণের কোন বৈশিষ্ট্য উপস্থিত হওয়া উচিত তা নির্ধারণ করতে।

অ্যাটাক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ে অ্যাটাক্টের ব্যবসায়ের লজিককে প্রভাবিত না করে অবজেক্টগুলিতে সাজাতে এবং বৈধতা, লগিং ইত্যাদির উপর ভিত্তি করে চালানোর সময় অবজেক্টগুলি ইনজেক্ট / হেরফের করতেও ব্যবহার করা যেতে পারে।


2

আপনি প্রতিটি সাবক্লাসের জন্য বারবার একই কোডটি না লিখে সাব ক্লাসে ট্যাগ মানগুলি সংজ্ঞায়িত করার সহজ উপায় হিসাবে কাস্টম বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন। আপনার নিজের কোডে কাস্টম বৈশিষ্ট্যগুলি কীভাবে সংজ্ঞায়িত করতে এবং ব্যবহার করতে হয় সে সম্পর্কে জন ওয়াটার্সের একটি চমৎকার সংক্ষিপ্ত উদাহরণ আমি পেয়েছি ।

Http://msdn.microsoft.com/en-us/library/aa288454(VS.71).aspx এ একটি টিউটোরিয়াল রয়েছে


2

একটি বৈশিষ্ট্য তৈরি করা শুরু করতে, একটি সি # উত্স ফাইল খুলুন, টাইপ করুন attributeএবং [টিএবি] টিপুন। এটি একটি নতুন বৈশিষ্ট্যের জন্য কোনও টেম্পলেটটিতে প্রসারিত হবে।


6
কিভাবে এটি প্রশ্নের উত্তর দেয়? এটি একটি মন্তব্য হওয়া উচিত, উত্তর নয়।
gdoron মনিকা

1

বৈশিষ্ট্যগুলি সাধারণত অ্যাসপেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের জন্যও ব্যবহৃত হয়। এর উদাহরণের জন্য পোস্টশার্প প্রকল্পটি দেখুন।

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