खोज…


टिप्पणियों

गुण तरीकों की पहुंच के साथ खेतों के वर्ग डेटा भंडारण को जोड़ते हैं। कभी-कभी यह तय करना मुश्किल हो सकता है कि किसी संपत्ति का उपयोग करना है, एक क्षेत्र का संदर्भ देने वाली संपत्ति, या एक क्षेत्र का संदर्भ देने वाली विधि। निर्धारित नियम के रूप में:

  • गुणों का उपयोग आंतरिक क्षेत्र के बिना किया जाना चाहिए यदि वे केवल मूल्य प्राप्त करते हैं और / या मान सेट करते हैं; कोई अन्य तर्क नहीं होने के साथ। ऐसे मामलों में, आंतरिक क्षेत्र को जोड़ने से कोई लाभ नहीं होगा।

  • जब आपको डेटा में हेरफेर करने या मान्य करने की आवश्यकता हो, तो गुणों का उपयोग आंतरिक क्षेत्रों के साथ किया जाना चाहिए। एक उदाहरण स्ट्रिंग्स से अग्रणी और अनुगामी रिक्त स्थान को हटा सकता है या यह सुनिश्चित कर सकता है कि कोई तारीख अतीत में नहीं है।

तरीकों बनाम गुणों के संबंध में, जहां आप दोनों प्राप्त कर सकते हैं ( get ) और अद्यतन ( set ) एक मूल्य, एक संपत्ति बेहतर विकल्प है। इसके अलावा, .Net एक बहुत सी कार्यक्षमता प्रदान करता है जो एक वर्ग की संरचना का उपयोग करता है; उदाहरण के लिए ग्रिड को एक फॉर्म में जोड़ना। नेट डिफ़ॉल्ट रूप से उस फॉर्म पर वर्ग के सभी गुणों को सूचीबद्ध करेगा; इस तरह के सम्मेलनों का सबसे अच्छा उपयोग करने के लिए गुणों का उपयोग करने की योजना बनाते हैं जब यह व्यवहार आम तौर पर वांछनीय होगा, और वे विधियां जहां आप उन प्रकारों के लिए पसंद करेंगे जो स्वचालित रूप से जोड़े नहीं जाने वाले हैं।

प्रसंग में विभिन्न गुण

public class Person 
{
    //Id property can be read by other classes, but only set by the Person class
    public int Id {get; private set;}
    //Name property can be retrieved or assigned 
    public string Name {get; set;}
    
    private DateTime dob;
    //Date of Birth property is stored in a private variable, but retrieved or assigned through the public property.
    public DateTime DOB
    {
        get { return this.dob; }
        set { this.dob = value; }
    }
    //Age property can only be retrieved; it's value is derived from the date of birth 
    public int Age 
    {
        get 
        {
            int offset = HasHadBirthdayThisYear() ? 0 : -1;
            return DateTime.UtcNow.Year - this.dob.Year + offset;
        }
    }

    //this is not a property but a method; though it could be rewritten as a property if desired.
    private bool HasHadBirthdayThisYear() 
    {
        bool hasHadBirthdayThisYear = true;
        DateTime today = DateTime.UtcNow;
        if (today.Month > this.dob.Month)
        {
            hasHadBirthdayThisYear = true;
        }
        else 
        {
            if (today.Month == this.dob.Month)
            {
                hasHadBirthdayThisYear = today.Day > this.dob.Day;
            }
            else
            {
                hasHadBirthdayThisYear = false;
            }
        }
        return hasHadBirthdayThisYear;
    }
}

सार्वजनिक जाओ

वर्गों से मूल्यों को उजागर करने के लिए गेटर्स का उपयोग किया जाता है।

string name;
public string Name
{
    get { return this.name; }
}

सार्वजनिक सेट

संपत्तियों को मान निर्दिष्ट करने के लिए सेटर्स का उपयोग किया जाता है।

string name;
public string Name 
{
    set { this.name = value; }
}

पहुँच गुण

class Program 
{
    public static void Main(string[] args)
    {
        Person aPerson = new Person("Ann Xena Sample", new DateTime(1984, 10, 22));
        //example of accessing properties (Id, Name & DOB)
        Console.WriteLine("Id is:  \t{0}\nName is:\t'{1}'.\nDOB is: \t{2:yyyy-MM-dd}.\nAge is: \t{3}", aPerson.Id, aPerson.Name, aPerson.DOB, aPerson.GetAgeInYears());
        //example of setting properties

        aPerson.Name = "   Hans Trimmer  ";
        aPerson.DOB = new DateTime(1961, 11, 11);
        //aPerson.Id = 5; //this won't compile as Id's SET method is private; so only accessible within the Person class.
        //aPerson.DOB = DateTime.UtcNow.AddYears(1); //this would throw a runtime error as there's validation to ensure the DOB is in past. 

        //see how our changes above take effect; note that the Name has been trimmed
        Console.WriteLine("Id is:  \t{0}\nName is:\t'{1}'.\nDOB is: \t{2:yyyy-MM-dd}.\nAge is: \t{3}", aPerson.Id, aPerson.Name, aPerson.DOB, aPerson.GetAgeInYears());

        Console.WriteLine("Press any key to continue");
        Console.Read();
    }
}

public class Person
{
    private static int nextId = 0;
    private string name;
    private DateTime dob; //dates are held in UTC; i.e. we disregard timezones
    public Person(string name, DateTime dob)
    {
        this.Id = ++Person.nextId;
        this.Name = name;
        this.DOB = dob;
    }
    public int Id
    {
        get;
        private set;
    }
    public string Name
    {
        get { return this.name; }
        set
        {
            if (string.IsNullOrWhiteSpace(value)) throw new InvalidNameException(value);
            this.name = value.Trim();
        }
    }
    public DateTime DOB
    {
        get { return this.dob; }
        set 
        {
            if (value < DateTime.UtcNow.AddYears(-200) || value > DateTime.UtcNow) throw new InvalidDobException(value);
            this.dob = value; 
        }
    }
    public int GetAgeInYears()
    {
        DateTime today = DateTime.UtcNow;
        int offset = HasHadBirthdayThisYear() ? 0 : -1;
        return today.Year - this.dob.Year + offset;
    }
    private bool HasHadBirthdayThisYear()
    {
        bool hasHadBirthdayThisYear = true;
        DateTime today = DateTime.UtcNow;
        if (today.Month > this.dob.Month)
        {
            hasHadBirthdayThisYear = true;
        }
        else
        {
            if (today.Month == this.dob.Month)
            {
                hasHadBirthdayThisYear = today.Day > this.dob.Day;
            }
            else
            {
                hasHadBirthdayThisYear = false;
            }
        }
        return hasHadBirthdayThisYear;
    }
}

public class InvalidNameException : ApplicationException
{
    const string InvalidNameExceptionMessage = "'{0}' is an invalid name.";
    public InvalidNameException(string value): base(string.Format(InvalidNameExceptionMessage,value)){}
}
public class InvalidDobException : ApplicationException
{ 
    const string InvalidDobExceptionMessage = "'{0:yyyy-MM-dd}' is an invalid DOB.  The date must not be in the future, or over 200 years in the past.";
    public InvalidDobException(DateTime value): base(string.Format(InvalidDobExceptionMessage,value)){}
}

गुणों के लिए डिफ़ॉल्ट मान

डिफ़ॉल्ट मान सेट करना प्रारंभकर्ताओं (C # 6) का उपयोग करके किया जा सकता है

public class Name 
{
    public string First { get; set; } = "James";
    public string Last { get; set; } = "Smith";
}

यदि इसे केवल पढ़ा जाता है तो आप इस तरह से मान लौटा सकते हैं:

  public class Name 
  {
      public string First => "James";
      public string Last => "Smith";
  }

ऑटो-कार्यान्वित गुण

ऑटो-कार्यान्वित गुण C # 3 में पेश किए गए थे।
एक ऑटो-कार्यान्वित संपत्ति को एक खाली गेट्टर और सेटर (एक्सेसर्स) के साथ घोषित किया गया है:

public bool IsValid { get; set; }

जब आपके कोड में एक ऑटो-कार्यान्वित संपत्ति लिखी जाती है, तो कंपाइलर एक निजी अनाम फ़ील्ड बनाता है जिसे केवल संपत्ति के एक्सेसर्स के माध्यम से एक्सेस किया जा सकता है।

उपरोक्त ऑटो-कार्यान्वित संपत्ति विवरण इस लंबे कोड को लिखने के बराबर है:

private bool _isValid;
public bool IsValid
{
    get { return _isValid; }
    set { _isValid = value; }
}

ऑटो-कार्यान्वित गुणों का उनके एक्सेसरों में कोई तर्क नहीं हो सकता है, उदाहरण के लिए:

public bool IsValid { get; set { PropertyChanged("IsValid"); } } // Invalid code

एक स्वत: लागू किया संपत्ति लेकिन इसकी accessors के लिए विभिन्न पहुँच संशोधक हो सकता है:

public bool IsValid { get; private set; }    

C # 6 ऑटो-कार्यान्वित गुणों को बिना सेटर के रखने की अनुमति देता है (इसे अपरिवर्तनीय बनाता है, क्योंकि इसका मूल्य केवल कंस्ट्रक्टर या हार्ड कोडित के अंदर सेट किया जा सकता है):

public bool IsValid { get; }    
public bool IsValid { get; } = true;

ऑटो-कार्यान्वित गुणों को शुरू करने के बारे में अधिक जानकारी के लिए, ऑटो-प्रॉपर्टी इनिशियलाइज़र प्रलेखन पढ़ें।

पढ़ें- केवल गुण

घोषणा

एक सामान्य भ्रांति, विशेष रूप से शुरुआती, है केवल पढ़ने के लिए संपत्ति के साथ चिह्नित एक है readonly कीवर्ड। यह सही नहीं है और वास्तव में निम्नलिखित संकलन समय त्रुटि है :

public readonly string SomeProp { get; set; }

एक संपत्ति केवल तभी पढ़ी जाती है जब उसके पास केवल एक गटर होता है।

public string SomeProp { get; }

अपरिवर्तनीय कक्षाएं बनाने के लिए केवल-पढ़ने के गुणों का उपयोग करना

public Address
{
    public string ZipCode { get; }
    public string City { get; }
    public string StreetAddress { get; }

    public Address(
        string zipCode,
        string city,
        string streetAddress)
    {
        if (zipCode == null)
            throw new ArgumentNullException(nameof(zipCode));
        if (city == null)
            throw new ArgumentNullException(nameof(city));
        if (streetAddress == null)
            throw new ArgumentNullException(nameof(streetAddress));

        ZipCode = zipCode;
        City = city;
        StreetAddress = streetAddress;
    }
}


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow