কিভাবে আপনি একটি C#অটো-সম্পত্তি একটি ডিফল্ট মান দেয়?




automatic-properties (15)

কিভাবে আপনি একটি C # অটো-সম্পত্তি একটি ডিফল্ট মান দেয়? আমি হয় কন্সট্রাকটর ব্যবহার, বা পুরানো সিনট্যাক্স ফিরে।

কনস্ট্রাক্টর ব্যবহার করে:

class Person 
{
    public Person()
    {
        Name = "Default Name";
    }
    public string Name { get; set; }
}

স্বাভাবিক সম্পত্তি সিনট্যাক্স ব্যবহার করে (একটি ডিফল্ট মান সহ)

private string name = "Default Name";
public string Name 
{
    get 
    {
        return name;
    }
    set
    {
        name = value;
    }
}

একটি ভাল উপায় আছে কি?


সি # 6.0 এ এটি একটি হাওয়া!

আপনি সম্পত্তি ঘোষণামূলক বিবৃতিতে, Class ঘোষণায় নিজেই এটি করতে পারেন।

public class Coordinate
{ 
    public int X { get; set; } = 34; // get or set auto-property with initializer

    public int Y { get; } = 89;      // read-only auto-property with initializer

    public int Z { get; }            // read-only auto-property with no initializer
                                     // so it has to be initialized from constructor    

    public Coordinate()              // .ctor()
    {
        Z = 42;
    }
}

1/2/15 সম্পাদনা করুন

সি # 6 দিয়ে আপনি সরাসরি স্বয়ং-বৈশিষ্ট্যগুলি শুরু করতে পারেন (অবশেষে!), তারপরে অন্য উত্তরগুলি যে বর্ণনা করে তা বর্ণনা করে।

সি # 5 এবং নীচের জন্য:

বৈশিষ্ট্যটির উদ্দেশ্যে ব্যবহারটি আসলে বৈশিষ্ট্যগুলির মান নির্ধারণ করা না থাকলেও, আপনি যেকোনোভাবেই সেট করতে প্রতিফলন ব্যবহার করতে পারেন ...

public class DefaultValuesTest
{    
    public DefaultValuesTest()
    {               
        foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(this))
        {
            DefaultValueAttribute myAttribute = (DefaultValueAttribute)property.Attributes[typeof(DefaultValueAttribute)];

            if (myAttribute != null)
            {
                property.SetValue(this, myAttribute.Value);
            }
        }
    }

    public void DoTest()
    {
        var db = DefaultValueBool;
        var ds = DefaultValueString;
        var di = DefaultValueInt;
    }


    [System.ComponentModel.DefaultValue(true)]
    public bool DefaultValueBool { get; set; }

    [System.ComponentModel.DefaultValue("Good")]
    public string DefaultValueString { get; set; }

    [System.ComponentModel.DefaultValue(27)]
    public int DefaultValueInt { get; set; }
}

আপনি কি http://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute.aspx বা কন্ডসিয়ালাইজ এবং কনস্ট্রাক্টারের সাথে রিসেট পদ্ধতি ব্যবহার করে চেষ্টা করেছেন? আমি ডিজাইনার পৃষ্ঠ বা একটি সম্পত্তি গ্রিড প্রদর্শিত হতে পারে যে একটি বর্গ তৈরি করছি যদি এই দুই পদ্ধতির এক প্রয়োজন বোধ।


আমার সমাধান হল একটি কাস্টম এ্যাট্রিবিউট যা ধ্রুবক বা সম্পত্তি প্রকার প্রারম্ভিক ব্যবহার করে ডিফল্ট মান সম্পত্তি প্রারম্ভ প্রদান করে।

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class InstanceAttribute : Attribute
{
    public bool IsConstructorCall { get; private set; }
    public object[] Values { get; private set; }
    public InstanceAttribute() : this(true) { }
    public InstanceAttribute(object value) : this(false, value) { }
    public InstanceAttribute(bool isConstructorCall, params object[] values)
    {
        IsConstructorCall = isConstructorCall;
        Values = values ?? new object[0];
    }
}

এই বৈশিষ্ট্যটি ব্যবহার করার জন্য বিশেষ বেস ক্লাস-ইনিশিয়েটিজার থেকে একটি বর্গ উত্তরাধিকারী বা স্ট্যাটিক হেলপার পদ্ধতি ব্যবহার করুন:

public abstract class DefaultValueInitializer
{
    protected DefaultValueInitializer()
    {
        InitializeDefaultValues(this);
    }

    public static void InitializeDefaultValues(object obj)
    {
        var props = from prop in obj.GetType().GetProperties()
                    let attrs = prop.GetCustomAttributes(typeof(InstanceAttribute), false)
                    where attrs.Any()
                    select new { Property = prop, Attr = ((InstanceAttribute)attrs.First()) };
        foreach (var pair in props)
        {
            object value = !pair.Attr.IsConstructorCall && pair.Attr.Values.Length > 0
                            ? pair.Attr.Values[0]
                            : Activator.CreateInstance(pair.Property.PropertyType, pair.Attr.Values);
            pair.Property.SetValue(obj, value, null);
        }
    }
}

ব্যবহার উদাহরণ:

public class Simple : DefaultValueInitializer
{
    [Instance("StringValue")]
    public string StringValue { get; set; }
    [Instance]
    public List<string> Items { get; set; }
    [Instance(true, 3,4)]
    public Point Point { get; set; }
}

public static void Main(string[] args)
{
    var obj = new Simple
        {
            Items = {"Item1"}
        };
    Console.WriteLine(obj.Items[0]);
    Console.WriteLine(obj.Point);
    Console.WriteLine(obj.StringValue);
}

আউটপুট:

Item1
(X=3,Y=4)
StringValue

উত্তরটি ইতিমধ্যেই গ্রহণ করা হয়েছে, যখন আপনি অন্য বৈশিষ্ট্যের ফাংশন হিসাবে একটি ডিফল্ট সম্পত্তি সংজ্ঞায়িত করতে চান তখন দৃশ্যকল্পের জন্য আপনি আরও # মার্জিত এবং সংক্ষেপিত গঠনগুলির জন্য এক্স # 6.0 (এবং উচ্চতর) এ এক্সপ্রেশন শরীরের নোটেশন ব্যবহার করতে পারেন:

public class Person{

    public string FullName  => $"{First} {Last}"; // expression body notation

    public string First { get; set; } = "First";
    public string Last { get; set; } = "Last";
}

আপনি নিম্নলিখিত ফ্যাশন উপরে ব্যবহার করতে পারেন

    var p = new Person();

    p.FullName; // First Last

    p.First = "Jon";
    p.Last = "Snow";

    p.FullName; // Jon Snow

উপরে উল্লেখিত "=>" নোট ব্যবহার করতে সক্ষম হবার জন্য, সম্পত্তি শুধুমাত্র পঠনযোগ্য, এবং আপনি অ্যাক্সেসকারী কীওয়ার্ডটি ব্যবহার করবেন না।

MSDN বিস্তারিত


কখনও কখনও আমি এটি ব্যবহার করি, যদি আমি এটি আমার ডিবিতে সেট করা এবং স্থির রাখতে চাই না:

class Person
{
    private string _name; 
    public string Name 
    { 
        get 
        {
            return string.IsNullOrEmpty(_name) ? "Default Name" : _name;
        } 

        set { _name = value; } 
    }
}

স্পষ্টতঃ যদি এটি একটি স্ট্রিং না হয় তবে আমি বস্তুকে বাতিল করতে পারি (ডবল ?, int?) এবং এটি নিল কিনা কিনা তা যাচাই করতে, একটি ডিফল্ট ফেরত পাঠাতে, বা সেট করা মানটিকে ফিরিয়ে দিতে।

তারপরে আমি আমার ডিফল্ট ডিফল্ট কিনা তা যাচাই করতে চেক করতে পারি না এবং স্থির থাকি না, বা ব্যাকিং মানের সত্য অবস্থাটি সংরক্ষণ করার আগে ব্যাকডোর চেক করতে পারি।

আশা করি এইটি কাজ করবে!


কনস্ট্রাক্টর ইন। কনস্ট্রাক্টারের উদ্দেশ্য এটির ডেটা সদস্যদের সূচনা করা।



লাইন আরম্ভ করুন, আরম্ভ করার জন্য কন্সট্রকটার ব্যবহার করে খারাপ অভ্যাস এবং পরে আরও বিরতি পরিবর্তন হতে হবে।


সামান্য সম্পূর্ণ নমুনা:

using System.ComponentModel;

private bool bShowGroup ;
[Description("Show the group table"), Category("Sea"),DefaultValue(true)]
public bool ShowGroup
{
    get { return bShowGroup; }
    set { bShowGroup = value; }
}

সি # 6 এবং উপরে আপনি কেবল সিনট্যাক্স ব্যবহার করতে পারেন:

public object Foo { get; set; } = bar;

একটি readonly সম্পত্তি আছে কেবল মনে রাখবেন, সেটটি বাদ দিন:

public object Foo { get; } = bar;

আপনি কন্সট্রকটর থেকে readonly অটো-সম্পত্তিগুলিও বরাদ্দ করতে পারেন।

এর আগে আমি নীচের হিসাবে প্রতিক্রিয়া।

আমি কনস্ট্রাক্টর একটি ডিফল্ট যোগ করা এড়াতে চাই; ডায়নামিক অ্যাসাইনমেন্টের জন্য ছেড়ে দিন এবং দুটি পয়েন্ট এড়ানো যা পরিবর্তনশীলটি নির্ধারিত হয় (অর্থাৎ টাইপ ডিফল্ট এবং কন্সট্রকটারে)। সাধারণত আমি কেবল এই ক্ষেত্রে একটি স্বাভাবিক সম্পত্তি লিখতে চাই।

আরেকটি বিকল্প ASP.Net কী করে তা করে এবং একটি গুণমানের মাধ্যমে ডিফল্ট সংজ্ঞায়িত করে:

http://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute.aspx


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

@ ডারেন কোপ - ভাল উত্তর, পরিষ্কার, এবং সঠিক। এবং পুনরাবৃত্তি করতে, আপনি বিন্যাস পদ্ধতির জন্য নির্মাতারা লিখতে পারেন। কন্সট্রাকটর লেখার সময় আপনাকে কেবল বেস ক্লাস থেকে তাদের অ্যাক্সেস করতে হবে:

বেস ক্লাসে নির্মাতা:

public BaseClassAbstract()
{
    this.PropertyName = "Default Name";
}

ডেরিভেড / কংক্রিট / সাব-ক্লাসে নির্মাতা:

public SubClass() : base() { }

এখানে বিন্দু বেস ক্লাস থেকে টানা ইনস্ট্যান্স ভেরিয়েবল আপনার বেস ক্ষেত্রের নাম বধ করতে পারে। "এই।" ব্যবহার করে বর্তমান তাত্ক্ষণিক বস্তুর মান নির্ধারণ করা হচ্ছে। বর্তমান ইনস্ট্যান্স এবং প্রয়োজনীয় অনুমতি স্তরের (অ্যাক্সেস সংশোধনকারীর) সাথে আপনি সঠিকভাবে আপনার অবজেক্টটি গঠন করতে পারবেন যেখানে আপনি এটি তাত্ক্ষণিক করছেন।


C # 6.0 দিয়ে শুরু করা , আমরা স্বয়ংক্রিয়-প্রয়োগ করা বৈশিষ্ট্যগুলিতে ডিফল্ট মান নির্ধারণ করতে পারি।

public string Name { get; set; } = "Some Name";

আমরা কেবলমাত্র পাঠযোগ্য স্বয়ংক্রিয় বাস্তবায়িত সম্পত্তি তৈরি করতে পারি:

public string Name { get; } = "Some Name";

দেখুন: সি # 6: প্রথম প্রতিক্রিয়া, স্বয়ংক্রিয়ভাবে প্রয়োগ করা বৈশিষ্ট্যগুলির জন্য সূচনাকারী - জন স্কিটের দ্বারা


class Person 
{    
    /// Gets/sets a value indicating whether auto 
    /// save of review layer is enabled or not
    [System.ComponentModel.DefaultValue(true)] 
    public bool AutoSaveReviewLayer { get; set; }
}

public Class ClassName{
    public int PropName{get;set;}
    public ClassName{
        PropName=0;  //Default Value
    }
}




automatic-properties