it-swarm.dev

ما هو الفرق بين الحقل والممتلكات؟

في C # ، ما الذي يجعل الحقل مختلفًا عن الخاصية ، ومتى يجب استخدام الحقل بدلاً من الخاصية؟

961
Anonymous

خصائص كشف الحقول. يجب أن تكون الحقول (دائمًا تقريبًا) خاصة بفصل دراسي ويتم الوصول إليها عبر خصائص get و set. توفر الخصائص مستوى من التجريد يسمح لك بتغيير الحقول مع عدم التأثير على الطريقة الخارجية التي يتم الوصول إليها من خلال الأشياء التي تستخدم فصلك.

public class MyClass
{
    // this is a field.  It is private to your class and stores the actual data.
    private string _myField;

    // this is a property. When accessed it uses the underlying field,
    // but only exposes the contract, which will not be affected by the underlying field
    public string MyProperty
    {
        get
        {
            return _myField;
        }
        set
        {
            _myField = value;
        }
    }

    // This is an AutoProperty (C# 3.0 and higher) - which is a shorthand syntax
    // used to generate a private field for you
    public int AnotherProperty{get;set;} 
}

يشيرKent إلى أن الخصائص غير مطلوبة لتغليف الحقول ، ويمكنها إجراء عملية حسابية على الحقول الأخرى أو خدمة أغراض أخرى.

يشيرGSS إلى أنه يمكنك أيضًا القيام بمنطق آخر ، مثل التحقق من الصحة ، عند الوصول إلى خاصية ، وهي ميزة أخرى مفيدة.

845
Cory

تقول مبادئ البرمجة الموجهة للكائنات أنه يجب إخفاء الأعمال الداخلية للفصل عن العالم الخارجي. إذا قمت بالكشف عن حقل ما ، فأنت في جوهره تعرض التطبيق الداخلي للفصل. لذلك ، نلف الحقول بالخصائص (أو الطرق في حالة Java) لتزويدنا بالقدرة على تغيير التطبيق دون كسر الكود اعتمادًا علينا. إن رؤية ما يمكننا وضع المنطق في العقار يتيح لنا أيضًا تنفيذ منطق التحقق من الصحة وما إلى ذلك إذا احتجنا إليه. C # 3 لديه فكرة مربكة ربما من autoproperties. هذا يسمح لنا ببساطة بتحديد الخاصية وسيقوم برنامج التحويل البرمجي C # 3 بإنشاء الحقل الخاص لنا.

public class Person
{
   private string _name;

   public string Name
   {
      get
      {
         return _name;
      }
      set
      {
         _name = value;
      }
   }
   public int Age{get;set;} //AutoProperty generates private field for us
}
231
danswain

الفرق المهم هو أن واجهات يمكن أن يكون لها خصائص ولكن ليس الحقول. هذا ، بالنسبة لي ، يؤكد على أنه يجب استخدام الخصائص لتعريف الواجهة العامة للفصل ، بينما يُراد استخدام الحقول في الأعمال الخاصة الداخلية للفصل الدراسي. كقاعدة ، نادراً ما أقوم بإنشاء حقول عامة وبالمثل نادراً ما أقوم بإنشاء خصائص غير عامة.

147
Hans Løken

سأقدم لك مثالين على استخدام الخصائص التي قد تؤدي إلى تحول التروس:

  • Lazy Initialization : إذا كان لديك خاصية لكائن غالي الثمن للتحميل ، ولكن لم يتم الوصول إلى كل ذلك كثيرًا في التشغيل العادي للرمز ، يمكنك تأخير تحميله عبر خاصية. وبهذه الطريقة ، يكون هناك فقط جالسًا ، لكن في المرة الأولى التي تحاول فيها وحدة أخرى استدعاء تلك الخاصية ، تتحقق مما إذا كان الحقل الأساسي لاغياً - إذا كان كذلك ، فإنه يمضي قدما ويحمله ، غير معروف لوحدة الاتصال. هذا يمكن تسريع تهيئة الكائن إلى حد كبير.
  • تتبع القذرة: ما تعلمته بالفعل من السؤال الخاص هنا على StackOverflow. عندما يكون لدي الكثير من الكائنات التي قد تغيرت القيم أثناء التشغيل ، يمكنني استخدام الخاصية لتعقب ما إذا كانت تحتاج إلى حفظها مرة أخرى إلى قاعدة البيانات أم لا. إذا لم يتم تغيير خاصية واحدة لكائن ، فلن تتعطل علامة IsDirty ، وبالتالي فإن وظيفة الحفظ ستتخطاها عند تحديد ما يحتاج إلى العودة إلى قاعدة البيانات.
91
Chris

باستخدام الخصائص ، يمكنك رمي حدث ، عند تغيير قيمة الخاصية (ويعرف أيضًا باسم PropertyChangedEvent) أو قبل تغيير القيمة لدعم الإلغاء.

هذا غير ممكن مع (الوصول المباشر إلى) الحقول.

public class Person {
 private string _name;

 public event EventHandler NameChanging;     
 public event EventHandler NameChanged;

 public string Name{
  get
  {
     return _name;
  }
  set
  {
     OnNameChanging();
     _name = value;
     OnNameChanged();
  }
 }

 private void OnNameChanging(){
   EventHandler localEvent = NameChanging;
   if (localEvent != null) {
     localEvent(this,EventArgs.Empty);
   }
 }

 private void OnNameChanged(){
   EventHandler localEvent = NameChanged;
   if (localEvent != null) {
     localEvent(this,EventArgs.Empty);
   }
 }
}
46
Jehof

نظرًا لأن العديد منهم قد شرحوا مع إيجابيات وسلبيات تقنية Properties و Field ، فقد حان الوقت للحصول على أمثلة في الوقت الفعلي.

1. الخصائص تسمح لك بتعيين مستوى الوصول للقراءة فقط

النظر في حالة dataTable.Rows.Count و dataTable.Columns[i].Caption. يأتون من الفصل DataTable وكلاهما متاح لنا. الفرق في مستوى الوصول إليهم هو أننا لا نستطيع تعيين القيمة على dataTable.Rows.Count لكن يمكننا القراءة والكتابة إلى dataTable.Columns[i].Caption. هل هذا ممكن من خلال Field؟ لا!!! يمكن القيام بذلك باستخدام Properties فقط.

public class DataTable
{
    public class Rows
    {       
       private string _count;        

       // This Count will be accessable to us but have used only "get" ie, readonly
       public int Count
       {
           get
           {
              return _count;
           }       
       }
    } 

    public class Columns
    {
        private string _caption;        

        // Used both "get" and "set" ie, readable and writable
        public string Caption
        {
           get
           {
              return _caption;
           }
           set
           {
              _caption = value;
           }
       }       
    } 
}

2. الخصائص في PropertyGrid

ربما تكون قد عملت مع Button في Visual Studio. يتم عرض خصائصه في PropertyGrid مثل Text و Name إلخ. عندما نقوم بسحب وإسقاط زر ، وعندما نقر على الخصائص ، سيجد تلقائيًا الفئة Button والمرشحات Properties وإظهار ذلك في PropertyGrid (حيث PropertyGridField على الرغم من أنها عامة).

public class Button
{
    private string _text;        
    private string _name;
    private string _someProperty;

    public string Text
    {
        get
        {
           return _text;
        }
        set
        {
           _text = value;
        }
   } 

   public string Name
   {
        get
        {
           return _name;
        }
        set
        {
           _name = value;
        }
   } 

   [Browsable(false)]
   public string SomeProperty
   {
        get
        {
           return _someProperty;
        }
        set
        {
           _someProperty= value;
        }
   } 

في PropertyGrid ، سيتم عرض الخصائص Name و Text ، ولكن ليس SomeProperty. لماذا ا؟؟؟ لأن الخصائص يمكن أن تقبل السمات . لا تظهر في حالة وجود [Browsable(false)] false.

3. يمكن تنفيذ عبارات داخل خصائص

public class Rows
{       
    private string _count;        


    public int Count
    {
        get
        {
           return CalculateNoOfRows();
        }  
    } 

    public int CalculateNoOfRows()
    {
         // Calculation here and finally set the value to _count
         return _count;
    }
}

4. يمكن استخدام الخصائص فقط في مصدر الربط

مصدر الربط يساعدنا على تقليل عدد أسطر التعليمات البرمجية. لا تقبل Fields بواسطة BindingSource. يجب أن نستخدم Properties لذلك.

5. وضع التصحيح

فكر في أننا نستخدم Field للاحتفاظ بقيمة. في مرحلة ما نحتاج إلى تصحيح الأخطاء والتحقق من حيث تصبح القيمة فارغة لهذا الحقل. سيكون من الصعب القيام بذلك عندما يكون عدد أسطر التعليمات البرمجية أكثر من 1000. في مثل هذه الحالات ، يمكننا استخدام Property ويمكننا ضبط وضع التصحيح داخل Property.

   public string Name
   {
        // Can set debug mode inside get or set
        get
        {
           return _name;
        }
        set
        {
           _name = value;
        }
   }
41
Sarath Avanavu

الاختلافات - الاستخدامات (متى ولماذا)

field هو متغير يتم الإعلان عنه مباشرة في فئة أو بنية. قد تحتوي فئة أو بنية على حقول مثيل أو حقول ثابتة أو كليهما. بشكل عام ، يجب عليك استخدام الحقول فقط للمتغيرات التي لها إمكانية وصول خاصة أو محمية . يجب توفير البيانات التي يعرضها فصلك لرمز العميل من خلال الأساليب والخصائص و المفهرسين. باستخدام هذه التركيبات للوصول غير المباشر إلى الحقول الداخلية ، يمكنك حماية قيم الإدخال غير الصالحة.

property هي عضو يوفر آلية مرنة لقراءة أو كتابة أو حساب قيمة حقل خاص. يمكن استخدام الخصائص كما لو كانت أعضاء في البيانات العامة ، ولكنها في الواقع طرق خاصة تسمى accessors . هذا يتيح الوصول إلى البيانات بسهولة ويساعد على تعزيز سلامة ومرونة الطرق . تتيح الخصائص لفئة ما الكشف عن طريقة عامة للحصول على القيم وتعيينها ، مع إخفاء رمز التنفيذ أو التحقق. يتم استخدام ملحق الحصول على خاصية لإرجاع قيمة الخاصية ، ويستخدم ملحق تعيين لتعيين قيمة جديدة.

28
makiSTB

تتمتع الخصائص بميزة أساسية تتمثل في السماح لك بتغيير طريقة الوصول إلى البيانات الموجودة على كائن ما دون كسر الواجهة العامة. على سبيل المثال ، إذا كنت بحاجة إلى إضافة مزيد من التحقق من الصحة ، أو لتغيير حقل مخزن إلى حساب محسوب ، فيمكنك القيام بذلك بسهولة إذا قمت في البداية بعرض الحقل كخاصية. إذا قمت فقط بعرض حقل مباشرةً ، فسيتعين عليك تغيير الواجهة العامة للفصل لإضافة وظيفة جديدة. سيؤدي هذا التغيير إلى كسر العملاء الحاليين ، مما يتطلب إعادة تجميعهم قبل أن يتمكنوا من استخدام الإصدار الجديد من الكود.

إذا قمت بكتابة مكتبة صيفية مصممة للاستهلاك على نطاق واسع (مثل .NET Framework ، والذي يستخدمه ملايين الأشخاص) ، فقد تكون هذه مشكلة. ومع ذلك ، إذا كنت تكتب فصلًا يستخدم داخليًا داخل قاعدة الشفرة الصغيرة (مثل <= 50 سطرًا من الخطوط) ، فهذا في الواقع ليس مشكلة كبيرة ، لأنه لن يتأثر أي شخص بشكل سلبي بالتغييرات التي أجريتها. في هذه الحالة ، إنه حقًا مجرد تفضيل شخصي.

10
Scott Wisniewski

في الخلفية يتم تصنيف خاصية في الأساليب. لذلك يتم تصنيف خاصية Name إلى get_Name() و set_Name(string value). يمكنك رؤية هذا إذا كنت تدرس التعليمات البرمجية المترجمة. لذلك ، هناك حمل صغير جدًا للأداء عند استخدامها. عادةً ، ستستخدم دائمًا خاصية إذا كنت تعرض حقلًا للخارج ، وستستخدمه غالبًا داخليًا إذا كنت بحاجة إلى التحقق من القيمة.

8
Rune Grimstad

تدعم الخصائص الوصول غير المتماثل ، أي أنه يمكن أن يكون لديك إما جامع أو مضبط أو واحد فقط من الاثنين. وبالمثل ، تدعم الخصائص إمكانية الوصول الفردي لجهاز getter/setter. الحقول متماثلة دائمًا ، أي أنه يمكنك دائمًا الحصول على القيمة وتعيينها. استثناء هذا هو الحقول للقراءة فقط والتي من الواضح أنه لا يمكن تعيينها بعد التهيئة.

قد تعمل الخصائص لفترة طويلة جدًا ، ولها آثار جانبية ، وقد تؤدي إلى استثناءات. الحقول سريعة ، دون أي آثار جانبية ، ولن تتسبب في أي استثناءات. نظرًا للتأثيرات الجانبية ، قد ترجع خاصية ما قيمة مختلفة لكل مكالمة (كما قد يكون الحال بالنسبة لـ DateTime.Now ، على سبيل المثال ، DateTime.Now لا يساوي دائمًا DateTime.Now). الحقول دائما ترجع نفس القيمة.

يمكن استخدام الحقول لمعلمات الخروج/المرجع ، وقد لا تستخدم الخصائص. تدعم الخصائص منطقًا إضافيًا - يمكن استخدام هذا لتنفيذ التحميل البطيء من بين أشياء أخرى.

تدعم الخصائص مستوى التجريد من خلال تغليف كل ما يعنيه الحصول على/تعيين القيمة.

استخدم الخصائص في معظم/جميع الحالات ، ولكن حاول تجنب الآثار الجانبية.

8
Brian Rasmussen

عندما تريد أن يكون المتغير الخاص (الحقل) في متناول كائن فصلك من الفئات الأخرى ، فإنك تحتاج إلى إنشاء خصائص لتلك المتغيرات.

على سبيل المثال ، إذا كان لدي متغيرات باسم "id" و "name" وهي خاصة ولكن قد يكون هناك موقف يكون فيه هذا المتغير مطلوبًا لعملية القراءة/الكتابة خارج الفصل. في هذه الحالة ، يمكن أن تساعدني الخاصية في الحصول على هذا المتغير للقراءة/الكتابة اعتمادًا على get/set المحددة للخاصية. يمكن أن تكون الخاصية للقراءة فقط/كتابة/كتابة على حد سواء.

هنا هو التجريبي

class Employee
{
    // Private Fields for Employee
    private int id;
    private string name;

    //Property for id variable/field
    public int EmployeeId
    {
       get
       {
          return id;
       }
       set
       {
          id = value;
       }
    }

    //Property for name variable/field
    public string EmployeeName
    {
       get
       {
          return name;
       }
       set
       {
          name = value;
       }
   }
}

class MyMain
{
    public static void Main(string [] args)
    {
       Employee aEmployee = new Employee();
       aEmployee.EmployeeId = 101;
       aEmployee.EmployeeName = "Sundaran S";
    }
}
5
Petryanu

السؤال الثاني هنا ، "متى يجب استخدام حقل بدلاً من خاصية؟" ، يتم تناوله بإيجاز في هذه الإجابة الأخرى و kinda هذا واحد أيضًا ، ولكن ليس كثيرًا من التفاصيل.

بشكل عام ، كل الإجابات الأخرى تركز على التصميم الجيد: تفضل فضح الخصائص على حقول التعريض. على الرغم من أنك لن بانتظام تجد نفسك تقول "واو ، تخيل مدى سوء الأشياء إذا كنت قد جعلت هذا الحقل بدلاً من خاصية" ، لكنه كثيرًا / نادر جدًا للتفكير في موقف حيث تقول "واو ، والحمد لله أنني استخدمت حقلًا هنا بدلاً من خاصية".

ولكن هناك ميزة واحدة تحتوي على الحقول على الخصائص ، وهي قدرتها على استخدامها كمعلمات "ref"/"out". افترض أن لديك طريقة بالتوقيع التالي:

public void TransformPoint(ref double x, ref double y);

وافترض أنك تريد استخدام هذه الطريقة لتحويل صفيف تم إنشاؤه مثل هذا:

System.Windows.Point[] points = new Point[1000000];
Initialize(points);

فيما يلي أعتقد أن أسرع طريقة للقيام بذلك ، لأن X و ص هي خصائص:

for (int i = 0; i < points.Length; i++)
{
    double x = points[i].X;
    double y = points[i].Y;
    TransformPoint(ref x, ref y);
    points[i].X = x;
    points[i].Y = y;
}

وهذا سيكون جيدا جدا! ما لم يكن لديك قياسات تثبت خلاف ذلك ، فلا يوجد سبب لإلقاء الرائحة الكريهة. لكنني أعتقد أنه ليس مضمونًا تقنيًا بالسرعة التالية:

internal struct MyPoint
{
    internal double X;
    internal double Y;
}

// ...

MyPoint[] points = new MyPoint[1000000];
Initialize(points);

// ...

for (int i = 0; i < points.Length; i++)
{
    TransformPoint(ref points[i].X, ref points[i].Y);
}

عند القيام ببعض القياسات بنفسي ، يستغرق إصدار الحقول حوالي 61٪ من الوقت كإصدار مع خصائص (.NET 4.6 ، Windows 7 ، x64 ، وضع التحرير ، لا يوجد مصحح أخطاء مرفق). كلما زادت تكلفة TransformPoint ، قل وضوح أن يصبح الفرق. لتكرار ذلك بنفسك ، قم بالتشغيل باستخدام السطر الأول الذي تم التعليق عليه ولم يتم التعليق عليه.

حتى إذا لم تكن هناك مزايا أداء لما سبق ، فهناك أماكن أخرى يمكن أن تكون فيها القدرة على استخدام معلمات المرجع والخروج مفيدة ، مثل عند استدعاء المتشابكة أو المتقلبة عائلة الأساليب. ملاحظة: في حال كان هذا الأمر جديدًا بالنسبة إليك ، تعد Volatile أساسًا طريقة للحصول على نفس السلوك الذي توفره الكلمة الرئيسية volatile. على هذا النحو ، مثل volatile ، فهي لا تحل بطريقة سحرية جميع مشكلات أمان سلاسل الرسائل مثل اسمها يشير إلى أنه قد.

أنا بالتأكيد لا أريد أن أبدو وكأنني أدافع عن ذهابك "أوه ، يجب أن أبدأ في كشف الحقول بدلاً من الخصائص". النقطة المهمة هي أنه إذا كنت بحاجة إلى استخدام هؤلاء الأعضاء بشكل منتظم في المكالمات التي تأخذ معلمات "ref" أو "out" ، خاصةً في شيء قد يكون نوعًا بسيطًا للقيمة من غير المحتمل أن يحتاج إلى أي عنصر من عناصر القيمة المضافة للخصائص ، يمكن تقديم حجة.

4
Joe Amenta

تحتوي هذه الصفحة الموجودة على MSDN على مقارنة ونصائح لاستخدامها عند:

https://msdn.Microsoft.com/en-us/library/9d65as2e(v=vs.90).aspx

2
shivesh suman

من الناحية الفنية ، لا أعتقد أن هناك فرقًا ، لأن الخصائص هي مجرد غلاف حول الحقول التي أنشأها المستخدم أو تم إنشاؤها تلقائيًا بواسطة المترجم. والغرض من الخصائص هو فرض التغليف وتقديم ميزة تشبه الطريقة خفيفة الوزن. من الممارسات السيئة الإعلان عن الحقول على أنها عامة ، لكن ليس لديها أية مشكلات.

2
Brahim Boulkriat

إذا كنت ستستخدم بدائل مؤشر الترابط ، فأنت مضطر لاستخدام الحقول. يمكن لخصائص كسر رمز الخيوط الخاصة بك. بصرف النظر عن ذلك ، ما قاله كوري هو الصحيح.

2
Jonathan C Dickinson

(يجب أن يكون هذا تعليقًا حقًا ، لكن لا يمكنني نشر تعليق ، لذا يرجى المعذرة إذا لم يكن ذلك مناسبًا كنشر).

لقد عملت مرة واحدة في مكان كانت الممارسة الموصى بها تتمثل في استخدام الحقول العامة بدلاً من الخصائص عندما كان الوصول إلى خاصية مكافئة قد وصل للتو إلى حقل ، كما في:

get { return _afield; }
set { _afield = value; }

كان منطقهم أن الحقل العام يمكن تحويله إلى خاصية في وقت لاحق في المستقبل إذا لزم الأمر. بدا غريبا بعض الشيء بالنسبة لي في ذلك الوقت. اذا حكمنا من خلال هذه الوظائف ، يبدو أن الكثيرين لا يوافقون على ذلك. ماذا قد قلت لمحاولة تغيير الأشياء؟

تحرير: يجب أن أضيف أنه تم تجميع كل قاعدة الشفرة في هذا المكان في نفس الوقت ، لذلك ربما اعتقدوا أن تغيير الواجهة العامة للفئات (عن طريق تغيير حقل عام إلى خاصية) لم يكن مشكلة.

2
Moe Sisko

الحقول هي متغيرات الأعضاء العادية أو مثيلات الأعضاء في الفصل. الخصائص هي التجريد للحصول على قيمها وتعيينها . تسمى الخصائص أيضًا بالملحقات لأنها توفر طريقة لتغيير واسترداد حقل ما إذا كنت تعرض حقلًا في الفصل على أنه خاص. بشكل عام ، يجب أن تعلن أن المتغيرات الخاصة بك خاصة ، ثم تعلن أو تحدد خصائص لها.

  class SomeClass
  {
     int numbera; //Field

     //Property 
    public static int numbera { get; set;}

  }
2
Vasim Shaikh

أيضا ، الخصائص تسمح لك باستخدام المنطق عند تحديد القيم.

لذلك يمكنك القول أنك تريد فقط تعيين قيمة إلى حقل عدد صحيح ، إذا كانت القيمة أكبر من x ، أو قم بطرح استثناء.

ميزة مفيدة حقا.

2
GurdeepS

تصميمي للحقل هو أن الحقل يحتاج إلى تعديل فقط من قِبل أصله ، ومن ثم الفصل. النتيجة يصبح المتغير خاصًا ، حتى يكون قادرًا على إعطاء الحق في قراءة الفئات/الطرق الموجودة خارج نطاق نظام الملكية باستخدام Get فقط. ثم يتم استرداد الحقل من قبل الملكية وقراءة فقط! إذا كنت ترغب في تعديله ، فيجب عليك متابعة الأساليب (على سبيل المثال ، المُنشئ) وأجد أنه بفضل هذه الطريقة التي تجعلك آمنًا ، لدينا سيطرة أفضل على الكود الخاص بنا لأننا "نحذف". يمكن للمرء أن يضع كل شيء علنًا بشكل جيد ، لذا فكل حالة ممكنة ، وفكرة المتغيرات/الأساليب/الطبقات وما إلى ذلك ... في رأيي هي مجرد مساعدة لتطوير وصيانة الكود. على سبيل المثال ، إذا استأنف شخص ما رمزًا بحقول عامة ، فيمكنه فعل أي شيء وبالتالي أشياء "غير منطقية" فيما يتعلق بالهدف ، وهو منطق سبب كتابة الشفرة. انها وجهة نظري.

عندما أستخدم نموذجًا خاصًا في الحقل الخاص/العقارات للقراءة فقط ، يجب أن أكتب 10 خصائص لعشرة حقول خاصة بخصائص القطاع الخاص. يمكن أن يكون الرمز كبيرًا بشكل أسرع. اكتشفت الضابط الخاص والآن أنا فقط استخدام الممتلكات العامة مع واضع خاص. واضع إنشاء في الخلفية حقل خاص.

لهذا السبب كان أسلوبي القديم في البرمجة الكلاسيكية:

public class MyClass
{
 private int _id;
 public int ID { get { return _id; } }
 public MyClass(int id)
 {
  _id = id;
 }
}

أسلوبي البرمجة الجديد:

public class MyClass
{
 public int ID { get; private set; }
 public MyClass(int id)
 {
  ID = id;
 }
}
2
Tony Pinot

يتم تعيين الحقول الخاصة تقليديا عبر أساليب getter و setter. من أجل رمز أقل ، يمكنك استخدام الخصائص لتعيين الحقول بدلاً من ذلك.

1
Chris Paine

من ويكيبيديا - البرمجة الموجهة للكائنات :

البرمجة الموجهة للكائنات (OOP) هي نموذج برمجة يستند إلى مفهوم "الكائنات" ، وهي هياكل البيانات التي تحتوي على البيانات ، في شكل حقول ، غالبًا ما تُعرف بالسمات ؛ و رمز ، في شكل إجراءات ، وغالبا ما يعرف باسم طرق . (تم اضافة التأكيدات)

الخصائص هي في الواقع جزء من سلوك الكائن ، ولكنها مصممة لمنح مستهلكي الكائن الوهم/التجريد من العمل مع بيانات الكائن.

1
Zev Spitz

تقوم الخصائص بتغليف الحقول ، مما يتيح لك إجراء معالجة إضافية على القيمة التي سيتم تعيينها أو استردادها. عادة ما تكون مبالغة في استخدام الخصائص إذا كنت لن تفعل أي ما قبل أو postprocessing على قيمة الحقل.

1
Erik Burger

فكر في الأمر: لديك غرفة وباب لدخول هذه الغرفة. إذا كنت ترغب في التحقق من كيفية وصول وتأمين غرفتك ، فعليك استخدام الخصائص وإلا فلن يكون هناك أي باب ويأتي كل واحد بسهولة دون أي تنظيم

class Room {
   public string sectionOne;
   public string sectionTwo;
}

Room r = new Room();
r.sectionOne = "enter";

الناس يدخلون إلى قسم واحد فقط بسهولة ، لم يكن هناك أي فحص

class Room 
{
   private string sectionOne;
   private string sectionTwo;

   public string SectionOne 
   {
      get 
      {
        return sectionOne; 
      }
      set 
      { 
        sectionOne = Check(value); 
      }
   }
}

Room r = new Room();
r.SectionOne = "enter";

الآن قمت بفحص الشخص ومعرفة ما إذا كان لديه شيء شرير معه

1
user8080469

عندما يكون لديك فصل وهو "سيارة". الخصائص هي اللون والشكل ..

حيث تكون الحقول عبارة عن متغيرات محددة ضمن نطاق الفصل الدراسي.

1
user406580

الغالبية العظمى من الحالات ستكون اسم خاصية يمكنك الوصول إليه بدلاً من اسم متغير ( حقل ) والسبب في ذلك هو أنه يعتبر ممارسة جيدة في .NET وفي C # بشكل خاص لحماية كل جزء من البيانات داخل الفصل الدراسي ، سواء كان متغير مثيل أو متغير ثابت (متغير فئة) لأنه مرتبط بفئة.

حماية جميع هذه المتغيرات مع الخصائص المقابلة التي تسمح لك بتحديد ، تعيين والحصول على accessors والقيام بأشياء مثل التحقق من الصحة عند التعامل مع هذه القطع من البيانات.

لكن في حالات أخرى مثل Math class (مساحة اسم النظام) ، هناك بضعة خصائص ثابتة مضمنة في الفصل. واحد منها هو ثابت الرياضيات بي

على سبيل المثال. Math.PI

ونظرًا لأن PI عبارة عن جزء من البيانات تم تعريفه جيدًا ، فلسنا بحاجة إلى الحصول على نسخ متعددة من PI ، حيث ستكون دائمًا نفس القيمة. لذلك يتم استخدام المتغيرات الثابتة أحيانًا لمشاركة البيانات بين كائن فئة ما ، ولكن يتم استخدامها أيضًا بشكل شائع للحصول على معلومات ثابتة حيث تحتاج فقط إلى نسخة واحدة من جزء من البيانات.

1
Nermien Barakat

الحقول هي المتغيرات في الفصول. الحقول هي البيانات التي يمكنك تغليفها من خلال استخدام معدلات الوصول.

تشبه الخصائص الحقول التي تحدد فيها الحالات والبيانات المرتبطة بكائن ما.

بخلاف الحقل ، يكون للعنصر بناء جملة خاص يتحكم في كيفية قراءة الشخص للبيانات وكتابتها ، ويعرف هؤلاء باسم مشغلي get and set. غالبًا ما يمكن استخدام منطق المجموعة للقيام بالتحقق.

1
Neil Meyer

تستخدم الخصائص لفضح المجال. يستخدمون الملحقات (مجموعة ، الحصول) التي يمكن من خلالها قراءة قيم الحقول الخاصة أو كتابتها أو معالجتها.

الخصائص لا تسمي مواقع التخزين. بدلاً من ذلك ، لديهم أدوات مساعدة لقراءة أو كتابة أو حساب قيمهم.

باستخدام الخصائص ، يمكننا تعيين التحقق من الصحة على نوع البيانات التي تم تعيينها في حقل.

على سبيل المثال ، لدينا حقل عدد صحيح خاص يجب أن نسمح بقيم موجبة لأن العمر لا يمكن أن يكون سالبًا.

يمكننا القيام بذلك بطريقتين باستخدام getter و setters واستخدام الممتلكات.

 Using Getter and Setter

    // field
    private int _age;

    // setter
    public void set(int age){
      if (age <=0)
       throw new Exception();

      this._age = age;
    }

    // getter
    public int get (){
      return this._age;
    }

 Now using property we can do the same thing. In the value is a key Word

    private int _age;

    public int Age{
    get{
        return this._age;
    }

    set{
       if (value <= 0)
         throw new Exception()
       }
    }

خاصية التنفيذ التلقائي إذا لم نتمكن من تسجيل الدخول وتعيين أدوات الوصول ، فيمكننا استخدام خاصية التنفيذ التلقائي.

عندما تنشئ مجموعات الخصائص التي تم تنفيذها تلقائيًا u حقلًا خاصًا ومجهولًا لا يمكن الوصول إليه إلا من خلال get and accessorsors.

public int Age{get;set;}

خصائص الملخص قد يكون للفصل التجريدي خاصية تجريدية ، والتي ينبغي تنفيذها في الفئة المشتقة

public abstract class Person
   {
      public abstract string Name
      {
         get;
         set;
      }
      public abstract int Age
      {
         get;
         set;
      }
   }

// overriden something like this
// Declare a Name property of type string:
  public override string Name
  {
     get
     {
        return name;
     }
     set
     {
        name = value;
     }
  }

يمكننا تعيين خاصية بشكل خاص في هذا يمكننا ضبط خاصية السيارات بشكل خاص (مع مجموعة في الفئة)

public int MyProperty
{
    get; private set;
}

يمكنك تحقيق نفس الشيء مع هذا الرمز. في هذه الخاصية مجموعة ميزة غير متوفرة حيث يتعين علينا تعيين القيمة إلى الحقل مباشرة.

private int myProperty;
public int MyProperty
{
    get { return myProperty; }
}
1
Nayas Subramanian

IMO ، الخصائص هي فقط أزواج الوظائف/الطرق/واجهات "SetXXX ()" "GetXXX ()" التي استخدمناها من قبل ، لكنها أكثر إيجازًا وأنيقة.

1
Junchao Xu

الخصائص هي نوع خاص من أعضاء الفصل ، في الخصائص التي نستخدمها طريقة محددة مسبقًا أو "تعيين". يمكنك استخدام أدوات الوصول التي يمكننا من خلالها قراءة قيم الحقول الخاصة أو كتابتها أو تغييرها.

على سبيل المثال ، دعنا نأخذ فئة تسمى Employee ، مع حقول خاصة للاسم والعمر و Employee_Id. لا يمكننا الوصول إلى هذه الحقول من خارج الفصل ، ولكن يمكننا الوصول إلى هذه الحقول الخاصة من خلال الخصائص.

لماذا نستخدم العقارات؟

إن جعل حقل الفصل عامًا وفضحه أمرًا محفوفًا بالمخاطر ، حيث لن يكون بإمكانك التحكم في ما يتم تعيينه وإعادته.

لفهم هذا بشكل واضح مع مثال ، دعونا نأخذ فصلًا طالبًا له اسم معرف و PassMark. الآن في هذا المثال بعض المشاكل مع المجال العام

  • يجب أن لا يكون معرف -ve.
  • لا يمكن ضبط الاسم على القيمة الخالية
  • يجب قراءة علامة النجاح فقط.
  • إذا كان اسم الطالب مفقودًا ، فلن يُرجع أي اسم.

لإزالة هذه المشكلة ، نستخدم Get و set method.

// A simple example
public class student
{
    public int ID;
    public int PassMark;
    public string name;
}

public class Program
{
    public static void Main(string[] args)
    {
       student s1 = new student();
       s1.ID = -101; // here ID can't be -ve
       s1.Name = null ; // here Name can't be null
    }
}

الآن نأخذ مثالا على طريقة get and set

public class student
{
    private int _ID;
    private int _PassMark;
    private string_name ;
    // for id property
    public void SetID(int ID)
    {
        if(ID<=0)
        {
            throw new exception("student ID should be greater then 0");
        }
        this._ID = ID;
    }
    public int getID()
    {
        return_ID;
    }
}
public class programme
{
    public static void main()
    {
        student s1 = new student ();
        s1.SetID(101);
    }
    // Like this we also can use for Name property
    public void SetName(string Name)
    {
        if(string.IsNullOrEmpty(Name))
        {
            throw new exeception("name can not be null");
        }
        this._Name = Name;
    }
    public string GetName()
    {
        if( string.IsNullOrEmpty(This.Name))
        {
            return "No Name";
        }
        else
        {
            return this._name;
        }
    }
        // Like this we also can use for PassMark property
    public int Getpassmark()
    {
        return this._PassMark;
    }
}
1
ahmed alkhatib

معلومات إضافية: بشكل افتراضي ، يمكن الوصول إلى برامج الوصول وتعيين الوصول إليها مثل الخاصية نفسها. يمكنك التحكم/تقييد الوصول إلى الملحقات بشكل فردي (للحصول على وتعيين) عن طريق تطبيق أكثر المعدلات الوصول تقييدية عليها.

مثال:

public string Name
{
    get
    {
        return name;
    }
    protected set
    {
        name = value;
    }
}

هنا لا يزال الوصول متاحًا للجمهور (حيث أن الملكية عامة) ، ولكن المجموعة محمية (محدد وصول أكثر تقييدًا).

0
Django