c# - সফটওয - সি++ প্রোগ্রামিং




সর্বাধিক দরকারী বৈশিষ্ট্য (20)

আমাদের বর্তমান প্রকল্পে, আমরা ব্যবহার করি

[ComVisible(false)]

এটি একটি পৃথক পরিচালিত টাইপ বা সদস্যের অ্যাক্সেসিবিলিটি নিয়ন্ত্রণ করে, বা একটি সমাবেশের মধ্যে সমস্ত ধরণের COM থেকে নিয়ন্ত্রণ করে।

অধিক তথ্য

আমি যে গুণাবলী অত্যন্ত দরকারী জানি। কিছু পূর্বনির্ধারিত আছে যেমন [Browsable(false)] যা আপনাকে বৈশিষ্ট্য ট্যাবে বৈশিষ্ট্যগুলি লুকানোর অনুমতি দেয়। এখানে বৈশিষ্ট্যগুলি ব্যাখ্যা করার একটি ভাল প্রশ্ন: .NET এর বৈশিষ্ট্য কী?

পূর্বনির্ধারিত বৈশিষ্ট্যগুলি (এবং তাদের নামস্থান) আপনি আসলে আপনার প্রোজেক্টগুলিতে কী ব্যবহার করেন?


আমার ভোট হবে [Conditional]

[Conditional("DEBUG")]
public void DebugOnlyFunction()
{
    // your code here
}

আপনি উন্নত ডিবাগিং বৈশিষ্ট্যগুলির সাথে একটি ফাংশন যোগ করতে এটি ব্যবহার করতে পারেন; Debug.Write মত। Debug.Write , এটি কেবল ডিবাগ বিল্ডগুলিতে বলা হয়, এবং এটি আপনাকে আপনার প্রোগ্রামের মূল প্রবাহের বাইরে জটিল ডিবাগ লজিককে অন্তর্ভুক্ত করতে দেয়।


আমি [DefaultValue] বেশ দরকারী হতে পাওয়া গেছে।


আমি System.Diagnostics থেকে [DebuggerStepThrough] পছন্দ।

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


আমি CodeSmith এর মাধ্যমে তথ্য সত্তা ক্লাস তৈরি করে এবং আমি কিছু বৈধকরণ রুটিন জন্য গুণাবলী ব্যবহার করি। এখানে একটি উদাহরণ:

/// <summary>
/// Firm ID
/// </summary>
[ChineseDescription("送样单位编号")]
[ValidRequired()]
public string FirmGUID
{
    get { return _firmGUID; }
    set { _firmGUID = value; }
}

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

namespace Reform.Water.Business.Common
{
/// <summary>
/// Validation Utility
/// </summary>
public static class ValidationUtility
{
    /// <summary>
    /// Data entity validation
    /// </summary>
    /// <param name="data">Data entity object</param>
    /// <returns>return true if the object is valid, otherwise return false</returns>
    public static bool Validate(object data)
    {
        bool result = true;
        PropertyInfo[] properties = data.GetType().GetProperties();
        foreach (PropertyInfo p in properties)
        {
            //Length validatioin
            Attribute attribute = Attribute.GetCustomAttribute(p,typeof(ValidLengthAttribute), false);
            if (attribute != null)
            {
                ValidLengthAttribute validLengthAttribute = attribute as ValidLengthAttribute;
                if (validLengthAttribute != null)
                {
                    int maxLength = validLengthAttribute.MaxLength;
                    int minLength = validLengthAttribute.MinLength;
                    string stringValue = p.GetValue(data, null).ToString();
                    if (stringValue.Length < minLength || stringValue.Length > maxLength)
                    {
                        return false;
                    }
                }
            }
            //Range validation
            attribute = Attribute.GetCustomAttribute(p,typeof(ValidRangeAttribute), false);
            if (attribute != null)
            {
                ValidRangeAttribute validRangeAttribute = attribute as ValidRangeAttribute;
                if (validRangeAttribute != null)
                {
                    decimal maxValue = decimal.MaxValue;
                    decimal minValue = decimal.MinValue;
                    decimal.TryParse(validRangeAttribute.MaxValueString, out maxValue);
                    decimal.TryParse(validRangeAttribute.MinValueString, out minValue);
                    decimal decimalValue = 0;
                    decimal.TryParse(p.GetValue(data, null).ToString(), out decimalValue);
                    if (decimalValue < minValue || decimalValue > maxValue)
                    {
                        return false;
                    }
                }
            }
            //Regex validation
            attribute = Attribute.GetCustomAttribute(p,typeof(ValidRegExAttribute), false);
            if (attribute != null)
            {
                ValidRegExAttribute validRegExAttribute = attribute as ValidRegExAttribute;
                if (validRegExAttribute != null)
                {
                    string objectStringValue = p.GetValue(data, null).ToString();
                    string regExString = validRegExAttribute.RegExString;
                    Regex regEx = new Regex(regExString);
                    if (regEx.Match(objectStringValue) == null)
                    {
                        return false;
                    }
                }
            }
            //Required field validation
            attribute = Attribute.GetCustomAttribute(p,typeof(ValidRequiredAttribute), false);
            if (attribute != null)
            {
                ValidRequiredAttribute validRequiredAttribute = attribute as ValidRequiredAttribute;
                if (validRequiredAttribute != null)
                {
                    object requiredPropertyValue = p.GetValue(data, null);
                    if (requiredPropertyValue == null || string.IsNullOrEmpty(requiredPropertyValue.ToString()))
                    {
                        return false;
                    }
                }
            }
        }
        return result;
    }
}
}

আমি এখানে উল্লেখ করা গুরুত্বপূর্ণ যে নিম্নোক্ত বৈশিষ্ট্যগুলিও অত্যন্ত গুরুত্বপূর্ণ:

STAThreadAttribute 

একটি অ্যাপ্লিকেশনের জন্য COM থ্রেডিং মডেল একক থ্রেডেড অ্যাপার্টমেন্ট (STA) নির্দেশ করে।

উদাহরণস্বরূপ এই বৈশিষ্ট্য উইন্ডোজ ফরম অ্যাপ্লিকেশন ব্যবহার করা হয়:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}

এবং আরো ...

SuppressMessageAttribute

একটি নির্দিষ্ট স্ট্যাটিক বিশ্লেষণ সরঞ্জাম নিয়ম লঙ্ঘনের রিপোর্টিং দমন করে, একটি একক কোড আর্টিফ্যাক্টে একাধিক দমনের অনুমতি দেয়।

উদাহরণ স্বরূপ:

[SuppressMessage("Microsoft.Performance", "CA1801:ReviewUnusedParameters", MessageId = "isChecked")]
[SuppressMessage("Microsoft.Performance", "CA1804:RemoveUnusedLocals", MessageId = "fileIdentifier")]
static void FileNode(string name, bool isChecked)
{
    string fileIdentifier = name;
    string fileName = name;
    string version = String.Empty;
}

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

class MyContextInformation : IDisposable {
    [ThreadStatic] private static MyContextInformation current;

    public static MyContextInformation Current {
        get { return current; }
    }

    private MyContextInformation previous;


    public MyContextInformation(Object myData) {
       this.myData = myData;
       previous = current;
       current = this;
    }

    public void Dispose() {
       current = previous;
    }
}

পরে আমার কোডে, আমি এই কোডটি আমার কোড থেকে ডাউনস্ট্রিম লোকেদের ব্যান্ডের প্রাসঙ্গিক তথ্য সরবরাহ করতে ব্যবহার করতে পারি। উদাহরণ:

using(new MyContextInformation(someInfoInContext)) {
   ...
}

থ্রেড স্ট্যাটিক বৈশিষ্ট্য আমাকে থ্রেড জুড়ে ডেটা অ্যাক্সেসের নোংরা সমস্যা এড়ানোর প্রশ্নে শুধুমাত্র থ্রেডে কলটিকে সুযোগ দেয়।


আমি সম্প্রতি [DataObjectMethod] ব্যবহার করা হয়েছে। এটি পদ্ধতি বর্ণনা করে যাতে আপনি আপনার ক্লাসকে অবজেক্টডাটাসোর্স (বা অন্যান্য নিয়ন্ত্রণ) ব্যবহার করতে পারেন।

[DataObjectMethod(DataObjectMethodType.Select)] 
[DataObjectMethod(DataObjectMethodType.Delete)] 
[DataObjectMethod(DataObjectMethodType.Update)] 
[DataObjectMethod(DataObjectMethodType.Insert)] 

অধিক তথ্য


এক্সটেনশান আমি সবচেয়ে ব্যবহার XML এক্স সিরিয়ালাইজেশান সম্পর্কিত।

XmlRoot

XmlElement

XmlAttribute

ইত্যাদি ...

অত্যন্ত দ্রুত এবং নোংরা এক্সএমএল প্যারিসিং বা serializing যখন অত্যন্ত দরকারী।



যদি আমি কোড কভারেজ ক্রাউল করতে থাকি, আমার মনে হয় এই দুইটি শীর্ষে থাকবে:

 [Serializable]
 [WebMethod]

শুধুমাত্র কয়েকটি গুণাবলী কম্পাইলার সমর্থন পায়, কিন্তু বৈশিষ্ট্যগুলির একটি খুব আকর্ষণীয় ব্যবহার AOP এ: PostSharp আপনার PostSharp বৈশিষ্ট্যগুলিকে PostSharp পদ্ধতিতে ইনজেকশনের জন্য ব্যবহার করে, PostSharp সক্ষম করে ... লগ / ট্রেস ছোট উদাহরণ - তবে অন্য কিছু ভাল উদাহরণ স্বয়ংক্রিয় ইনটাইফাইফপ্টিটিয়ের মতো জিনিসগুলি বাস্তবায়ন ( here )।

কিছু যা কম্পাইলার বা রানটাইম সরাসরি ঘটে এবং প্রভাবিত করে :

  • [Conditional("FOO")] - এই পদ্ধতিতে কল করা (আর্গুমেন্ট মূল্যায়ন সহ) শুধুমাত্র "FOO" চিহ্ন তৈরির সময় সংজ্ঞায়িত করা হয়
  • [MethodImpl(...)] - সিঙ্ক্রোনাইজেশনের মত কিছু জিনিস নির্দেশ করে, ইনলাইনিং
  • [PrincipalPermission(...)] - স্বয়ংক্রিয়ভাবে কোডে নিরাপত্তা চেক ইঞ্জেকশন ব্যবহৃত হয়
  • [TypeForwardedTo(...)] - [TypeForwardedTo(...)] পুনর্নির্মাণ ছাড়া সমাবেশের মধ্যে ধরনের সরানো ব্যবহৃত

প্রতিফলন মাধ্যমে ম্যানুয়ালি চেক করা জিনিসগুলির জন্য - আমি System.ComponentModel বৈশিষ্ট্যগুলির একটি বড় ফ্যান। [TypeDescriptionProvider(...)] , [TypeConverter(...)] , এবং [Editor(...)] যা সম্পূর্ণরূপে ডাটা-বাইন্ডিং পরিস্থিতিতে (যেমন গতিশীল বৈশিষ্ট্য ইত্যাদি) আচরণের আচরণ পরিবর্তন করতে পারে।


Here আকর্ষণীয় বৈশিষ্ট্য InternalsVisibleTo সম্পর্কে পোস্ট। মূলত এটি কি এটি ++ বন্ধুদের অ্যাক্সেস কার্যকারিতা অনুকরণ করে। এটা একক পরীক্ষার জন্য খুব সহজ আসে।


DesignerSerializationVisibilityAttribute খুব দরকারী। যখন আপনি কোন নিয়ন্ত্রণ বা কম্পোনেন্টে রানটাইম সম্পত্তি রাখেন এবং আপনি ডিজাইনারটিকে এটি সিরিয়ালাইজ করতে চান না, তখন আপনি এটির মতো এটি ব্যবহার করেন:

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public Foo Bar {
    get { return baz; }
    set { baz = value; }
}

[Flags] বেশ সহজ। Syntactic চিনি নিশ্চিত হতে, কিন্তু এখনও চমৎকার।

[Flags] 
enum SandwichStuff
{
   Cheese = 1,
   Pickles = 2,
   Chips = 4,
   Ham = 8,
   Eggs = 16,
   PeanutButter = 32,
   Jam = 64
};

public Sandwich MakeSandwich(SandwichStuff stuff)
{
   Console.WriteLine(stuff.ToString());
   // ...
}

// ...

MakeSandwich(SandwichStuff.Cheese 
   | SandwichStuff.Ham 
   | SandwichStuff.PeanutButter);
// produces console output: "Cheese, Ham, PeanutButter"

লেপ্পি এমন কিছু নির্দেশ করে যা আমি বুঝতে পারিনি, এবং যা এই বৈশিষ্ট্যটির জন্য আমার উত্সাহকে নষ্ট করে দেয়: এটি কম্পিউলারকে বুদ্ধিগুলিকে বিন্দু ভেরিয়েবলের জন্য বৈধ মান হিসাবে অনুমতি দেয় না , কম্পাইলারটি নির্বিশেষে এটিকে সংখ্যার জন্য অনুমতি দেয়। আমার সি ++ পটভূমি মাধ্যমে দেখাচ্ছে ... Sigh


System.Obsolete আমার মতে ফ্রেমওয়ার্ক সবচেয়ে দরকারী বৈশিষ্ট্য এক। কোড সম্পর্কে সতর্কতা বাড়াতে ক্ষমতা যা আর ব্যবহার করা উচিত নয় তা খুবই দরকারী। আমি বিকাশকারীদের বলার উপায় আছে যে কিছু আর ব্যবহার করা উচিত নয়, পাশাপাশি কিছু করার ভাল / নতুন উপায় কেন এবং ব্যাখ্যা করার উপায় আছে।

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

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


[DeploymentItem("myFile1.txt")] ডক [DeploymentItem("myFile1.txt")]

এটি যদি আপনি কোনও ফাইলের বিরুদ্ধে পরীক্ষা করে থাকেন বা আপনার পরীক্ষাতে ইনপুট হিসাবে ফাইলটি ব্যবহার করেন তবে এটি সত্যিই দরকারী।


[EditorBrowsable(EditorBrowsableState.Never)] প্রকল্প আপনার সমাধান না থাকলে IntelliSense থেকে বৈশিষ্ট্য এবং পদ্ধতিগুলি লুকাতে দেয়। স্বচ্ছ ইন্টারফেস জন্য অবৈধ প্রবাহ লুকানোর জন্য অত্যন্ত সহায়ক। আপনি কত ঘন ঘন HashCode () বা সমান () পেতে চান?

MVC এর জন্য [ActionName("Name")] আপনাকে একই পদ্ধতির স্বাক্ষর দিয়ে একটি অ্যাকশন এবং পোস্ট অ্যাকশন পেতে বা অ্যাকশন নামের মধ্যে ড্যাশগুলি ব্যবহার করার অনুমতি দেয়, যা অন্যথায় এটির জন্য রুট তৈরি না করেই সম্ভব না।


[System.Security.Permissions.PermissionSetAttribute] ঘোষনামূলক নিরাপত্তা ব্যবহার করে কোডে প্রয়োগ করার অনুমতি PermissionSet এর জন্য নিরাপত্তা ব্যবস্থাগুলিকে অনুমতি দেয়।

// usage:
public class FullConditionUITypeEditor : UITypeEditor
{
    // The immediate caller is required to have been granted the FullTrust permission.
    [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
    public FullConditionUITypeEditor() { }
}

[TypeConverter(typeof(ExpandableObjectConverter))]

ডিজাইনারকে শ্রেণির সম্পত্তিগুলি প্রসারিত করতে বলে (আপনার নিয়ন্ত্রণের)

[Obfuscation]

একটি সমাবেশ, টাইপ, বা সদস্য জন্য নির্দিষ্ট কর্ম নিতে obfuscation সরঞ্জাম নির্দেশ করে। (যদিও সাধারণত আপনি একটি অ্যাসেম্বলি স্তর ব্যবহার করেন [assembly:ObfuscateAssemblyAttribute(true)]





.net-attributes