ක්ෂේත්‍රයක් සහ දේපලක් අතර වෙනස කුමක්ද?


1167

C # හි, දේපලකට වඩා ක්ෂේත්‍රයක් වෙනස් වන්නේ කුමක් ද, දේපලක් වෙනුවට ක්ෂේත්‍රයක් භාවිතා කළ යුත්තේ කවදාද?


33
මයික්‍රොසොෆ්ට් සිය සාමාජික සැලසුම් මාර්ගෝපදේශවල කොටසක් ලෙස මෙම ප්‍රශ්නයට (සියලුම .නෙට් භාෂා සඳහා) කෙලින්ම පිළිතුරු සපයයි . විශේෂතා සඳහා දේපල සැලසුම් සහ ක්ෂේත්‍ර සැලසුම් යන ලිපි බලන්න . උදාහරණ සාමාජිකයන් සහ ස්ථිතික සාමාජිකයන් අතර වෙනසක් ඇති බව සලකන්න .
ඩේවිඩ් ආර් ආර්

මයික්‍රොසොෆ්ට් හි ලේඛන මෙය අවබෝධ කර ගැනීම සඳහා හොඳ ප්‍රභවයක් වන අතර ඔබට එය භාවිතා කළ හැකිය.
elnaz jangi

Answers:


1007

ගුණාංග ක්ෂේත්‍ර නිරාවරණය කරයි. ක්ෂේත්‍ර (සෑම විටම පාහේ) පන්තියකට පුද්ගලිකව තබා ගත යුතු අතර ලබා ගත හැකි සහ සැකසූ දේපල හරහා ප්‍රවේශ විය යුතුය. ඔබේ පන්තිය භාවිතා කරන දේවලින් ඒවාට ප්‍රවේශ වන බාහිර මාර්ගයට බලපෑම් නොකරන අතරම ගුණාංග වෙනස් කිරීමට ගුණාංග ඔබට ඉඩ සලසයි.

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;} 
}

Ent කෙන්ට් පෙන්වා දෙන්නේ ක්ෂේත්‍රයන් වටකර ගැනීමට දේපල අවශ්‍ය නොවන බවත්, ඔවුන්ට වෙනත් ක්ෂේත්‍ර පිළිබඳ ගණනය කිරීමක් කළ හැකි බවත් හෝ වෙනත් අරමුණු සඳහා සේවය කළ හැකි බවත්ය.

දේපලකට ප්‍රවේශ වූ විට වලංගු කිරීම වැනි තවත් තර්කනයක් ඔබට කළ හැකි බව @GSS පෙන්වා දෙයි.


188
ක්ෂේත්ර සංසරණය කිරීම සඳහා ගුණාංග අවශ්ය නොවන බව සඳහන් කිරීම වටී. දේපල පිටුපස කිසිඳු ක්ෂේත්‍රයක් තිබිය නොහැක. එය ගණනය කිරීමක් හෝ නියතයක් හෝ ඕනෑම දෙයක් ආපසු ලබා දීම විය හැකිය.
කෙන්ට් බූගාර්ට්

9
"ඔබේ පන්තිය භාවිතා කරන දේවලින් ඒවාට ප්‍රවේශ වන බාහිර ක්‍රමයට බලපාන්නේ නැත." මම වැරදියට වටහාගෙන ඇත්නම් මට සමාව දෙන්න, නමුත් දේපල ඉදිරිපිට ප්‍රවේශ විකරණකාරක අවශ්‍යතාවය කිසිසේත් නැත, එය පිටුපස ඇති ක්ෂේත්‍රය මෙය හසුරුවන්නේ නම්? එනම් පොදු දේ හැර වෙනත් දෙයක් දේපළක් බවට පත් කරන්නේ ඇයි?
චකී

19
ඔබේ පිළිතුර සංස්කරණයට පෙර නිවැරදි වූ අතර අමුතු ලෙස ඉහළට ඔසවා තැබූ වැරදි අදහස් දැක්වීම්. දේපලක් සෑම විටම ක්ෂේත්‍ර එකක් හෝ කිහිපයක් වට කළ යුතු අතර කිසි විටෙකත් බර එසවීම හෝ වලංගු කිරීම නොකළ යුතුය. වලංගු භාවයක් ලබා ගැනීම සඳහා ඔබට එවැනි පරිශීලක නාමයක් හෝ මුරපදයක් අවශ්‍ය නම්, ඒවායේ වර්ගය නූල් සිට වටිනාකම් වස්තු දක්වා වෙනස් කරන්න . පංති නිර්මාපකයෙකු සහ පාරිභෝගිකයා අතර නොකියූ ගිවිසුමක් තිබේ. ක්ෂේත්රයන් රාජ්යය දරයි, දේපල ක්ෂේත්ර එකක් හෝ වැඩි ගණනක් භාවිතා කරමින් රාජ්ය නිරාවරණය කරයි, Voids තත්වය වෙනස් කරයි (බර එසවීම), සහ කාර්යයන් විමසීම් (බර එසවීම) සිදු කරයි .මෙම ගල් නොවේ, බලාපොරොත්තු සුන් කරවයි.
Suamere

6
pjpaugh මම පන්ති පාරිභෝගිකයෙක් නම්, මම පන්ති නිර්මාතෘ විසින් නියම කරන ලද ගිවිසුම් අනුගමනය කරමි. දේපලක් නම් string, මගේ කොන්ත්රාත්තුව: b 2 බිල් දිග දක්වා ඕනෑම අක්ෂර පවරන්න. දේපලක් නම් DateTime, මගේ කොන්ත්රාත්තුව නම්: මට සොයා බැලිය හැකි ඩේටයිම් හි සීමාවන් තුළ ඕනෑම අංකයක් යොදන්න. නිර්මාතෘ විසින් සැකසුම්කරුවන්ට අවහිරතා එකතු කරන්නේ නම්, එම සීමාවන් සන්නිවේදනය නොකෙරේ. එහෙත්, ඒ වෙනුවට, එහි නිර්මාපකයාගේ සිට වර්ගය වෙනස් කරනවා නම් stringකිරීමට Surname, ඔවුන්ගේ නව වාසගම පන්තිය සීමාවන් සන්නිවේදනය, සහ දේපළ public Surname LastNameපන්දු පිරිනමන්නා වලංගු නැත. එසේම, Surnameනැවත භාවිතා කළ හැකිය.
සුමරේ

4
Surnameමගේ උදාහරණයේ දී, නැවත භාවිතා කළ හැකි බැවින් , එම වලංගු කිරීම් දේපල කට්ටලයක කේතයේ වෙනත් ස්ථානවලට පිටපත් කිරීම / ඇලවීම ගැන ඔබ පසුව කරදර විය යුතු නැත. වාසගම සඳහා වලංගු භාවය ස්ථාන කිහිපයක තිබේදැයි ඔබ කල්පනා නොකරයි. අගය වස්තු ගැන මා පළ කළ සබැඳිය බලන්න
Suamere

262

වස්තු දිශානත ක්‍රමලේඛන මූලධර්ම පවසන පරිදි, පන්තියක අභ්‍යන්තර කටයුතු බාහිර ලෝකයෙන් සැඟවිය යුතුය. ඔබ ක්ෂේත්‍රයක් නිරාවරණය කරන්නේ නම් ඔබ සාරාංශයක් ලෙස පන්තියේ අභ්‍යන්තර ක්‍රියාත්මක කිරීම හෙළි කරයි. එබැවින් අප මත පදනම්ව කේත කඩ නොකර ක්‍රියාත්මක කිරීම වෙනස් කිරීමේ හැකියාව ලබා දීම සඳහා අපි ගුණාංග (හෝ ජාවා නඩුවේ ක්‍රම) සමඟ ක්ෂේත්‍ර ඔතා. අපට දේපල තුළ තර්කනය තැබිය හැකි බව දැකීම අපට අවශ්‍ය නම් වලංගු කිරීමේ තර්කනය යනාදිය සිදු කිරීමට ඉඩ දෙයි. C # 3 හි ස්වයංක්‍රීය ගුණාංග පිළිබඳ ව්‍යාකූල සංකල්පයක් ඇත. මෙය දේපල සරලව නිර්වචනය කිරීමට අපට ඉඩ සලසන අතර 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
}

89
ස්වයංක්‍රීය ගුණාංග සඳහන් කිරීම සඳහා +1 - මම සිතන්නේ මෙය මෙහි (සහ වෙනත් තැන්වල) බොහෝ පිළිතුරු ගෙන ඒමට අමතක වී ඇති දෙයක් බවයි. මෙම පැහැදිලි කිරීමකින් තොරව, public int myVar { get; set; }සැබවින්ම අදහස් කරන්නේ කුමක්ද යන්න ග්‍රහණය කර ගැනීම තවමත් දුෂ්කර විය හැකිය (තවද එය හේතුව යැයි මම සිතමි මෙම ප්‍රශ්නයට ලැබෙන පහර වලින් අවම වශයෙන් 50% ක් සඳහා).
ප්‍රිදු නීම්රේ

7
+1 ස්වයංක්‍රීයව සඳහන් කිරීම සහ එය ක්‍රියා කරන ආකාරය සඳහන් කිරීම සඳහා ("ස්වයංක්‍රීයව අප වෙනුවෙන් පුද්ගලික ක්ෂේත්‍රයක් ජනනය කරයි") මෙය මා සතුව තිබූ ප්‍රශ්නයකට මා සොයන පිළිතුරයි. පර්යේෂණ කරන විට මම ඔවුන් ගැන එම්එස්ඩීඑන් පිටුවේ දැක නැත, පෞද්ගලික ක්ෂේත්‍රයක් නිර්මාණය වී ව්‍යාකූලත්වයක් ඇති කරන බවට කිසිදු සාක්ෂියක්. මම හිතන්නේ ඒකෙන් අදහස් කරන්නේ මොකක්ද? "ස්වයංක්‍රීයව ක්‍රියාත්මක කරන ලද දේපල සඳහා ගුණාංග අවසර දී ඇති නමුත් ඒවා ඔබේ මූලාශ්‍ර කේතයෙන් ප්‍රවේශ විය නොහැකි බැවින් පැහැදිලිවම පසුබිම් ක්ෂේත්‍රයන්හි නොවේ. ඔබ දේපලක පසුබිම් ක්ෂේත්‍රය මත ගුණාංගයක් භාවිතා කළ යුතු නම්, සාමාන්‍ය දේපලක් සාදන්න." නමුත් විශ්වාස නෑ.
නයිරා

4
දී ඇති උදාහරණය ස්කොට් සංයුක්ත නොකරන බව සලකන්න. මෙම දේපල පුද්ගලික ක්ෂේත්‍රයට 100% පූර්ණ ප්‍රවේශයක් ලබා දෙයි, එබැවින් මෙය කිසිසේත්ම වස්තු-නැඹුරු නොවේ. මෙම නඩුවේදී ඔබට පොදු ක්ෂේත්‍රයක් ද තිබිය හැකිය. අනාගතයේ දී ප්‍රතික්‍රියාකාරක කේතය සඳහා එය (සුළු වශයෙන්) උපකාරී වන බව පිළිගත යුතුය, නමුත් එහි ඇති වටිනාකමින් යුත් ඕනෑම IDE එකකට යතුරු එබීම් කිහිපයක් ඇති ඉඩමක් බවට ක්ෂේත්‍රයක් පරිවර්තනය කළ හැකිය. දේපල ක්‍රියා කරන ආකාරය පිළිබඳ පිළිතුර තාක්‍ෂණිකව නිවැරදි විය හැකි නමුත් එය ඒවායේ භාවිතයට හොඳ “ඕඕපී පැහැදිලි කිරීමක්” ලබා නොදේ.
සාරා

2
ai කයි, පිළිතුර ඉතා සරල දේවල් වලට වඩා වැඩි බවත් ස්වයංක්‍රීය දේපලක සියලු බලය නොපෙන්වන බවත් මම එකඟ වෙමි, කෙසේ වෙතත් මෙය වස්තු-නැඹුරු නොවන බවට මම එකඟ නොවෙමි. ක්ෂේත්‍ර සහ ගුණාංග අතර වෙනස පරීක්ෂා කිරීමට ඔබට අවශ්‍ය විය හැකිය . ක්ෂේත්‍ර අථත්‍ය විය නොහැකි අතර virtualඑය වස්තු-නැඹුරු වැඩසටහන්කරණයේ කොටසකි.
ගොබේ

යම් ක්‍රියාකාරී වෙනසක් ඇති බව පිළිගත යුතුය. මම virtualOOP අමතන්නේ නැහැ . එය බහුඅවයවිකතාව සක්‍රීය කරන මෙවලමක් වන අතර එය OOP සක්‍රීය කළ හැකි ප්‍රධාන මෙවලම්වලින් එකකි. එය OOP තුළ සහ තමා තුළම නොවේ, සහ පොදු ස්වයං පාලනයක් පිළිබඳ සහජයෙන්ම OOP කිසිවක් නොමැත. OOP සම්බන්ධ පරාවර්තනය හෝ දත්ත සමුදාය වැනි දේවල් මම ගණන් නොගන්නෙමි. සාමාන්‍යයෙන් මම ඒ ගැන එතරම් තැකීමක් නොකරමි, නමුත් පිළිතුරෙහි OO මූලධර්ම කේත උදාහරණයේ ගාමක බලය ලෙස සඳහන් කර ඇති අතර මම එයට එකඟ නොවෙමි.
සාරා

167

වැදගත් වෙනසක් වන්නේ අතුරුමුහුණත් වලට ගුණාංග තිබිය හැකි නමුත් ක්ෂේත්‍ර නොවේ. මෙය මට අවධාරණය කරන්නේ පන්තියේ පොදු අතුරුමුහුණත නිර්වචනය කිරීම සඳහා ගුණාංග භාවිතා කළ යුතු අතර ක්ෂේත්‍රයන් යනු පන්තියක පුද්ගලික, අභ්‍යන්තර කටයුතු සඳහා භාවිතා කිරීමට අදහස් කරන බවයි. රීතියක් ලෙස මම කලාතුරකින් පොදු ක්ෂේත්‍ර නිර්මාණය කරන අතර ඒ හා සමානව මම පොදු නොවන දේපල නිර්මාණය කරන්නේ කලාතුරකිනි.


98

ගියර් හැරවිය හැකි ගුණාංග භාවිතා කිරීම පිළිබඳ උදාහරණ කිහිපයක් මම ඔබට දෙන්නම්:

  • කම්මැලි ආරම්භ කිරීම : ඔබට වස්තුවක දේපලක් තිබේ නම් එය පැටවීමට මිල අධික වන නමුත් කේතයේ සාමාන්‍ය ධාවනයේදී එතරම් ප්‍රවේශ නොවන්නේ නම්, ඔබට දේපල හරහා එය පැටවීම ප්‍රමාද කළ හැකිය. ඒ ආකාරයෙන්, එය එහි හිඳගෙන සිටින නමුත් පළමු වරට වෙනත් මොඩියුලයක් එම දේපල ඇමතීමට උත්සාහ කරන විට, එය යටින් පවතින ක්ෂේත්‍රය ශුන්‍ය දැයි පරීක්ෂා කරයි - එය එසේ නම්, එය ඉදිරියට ගොස් එය පටවනු ලැබේ, ඇමතුම් මොඩියුලය නොදන්නා. මෙය වස්තු ආරම්භය බෙහෙවින් වේගවත් කළ හැකිය.
  • අපිරිසිදු ලුහුබැඳීම: මගේ ඇත්ත වශයෙන්ම මම ඉගෙන ගත් දේ ස්ටැක් ඕවර්ෆ්ලෝ හි මගේම ප්‍රශ්නයකින් . ධාවනයේදී වටිනාකම් වෙනස් වී ඇති වස්තු රාශියක් මා සතුව ඇති විට, ඒවා නැවත දත්ත ගබඩාවට සුරැකීමට අවශ්‍යද නැද්ද යන්න සොයා බැලීමට මට දේපල භාවිතා කළ හැකිය. වස්තුවක එක් දේපලක්වත් වෙනස් වී නොමැති නම්, IsDirty ධජය කැපෙන්නේ නැත, එබැවින් දත්ත සමුදායට ආපසු යා යුතු දේ තීරණය කිරීමේදී ඉතිරි කිරීමේ ක්‍රියාකාරිත්වය මඟ හැරෙනු ඇත.

1
අපිරිසිදු ලුහුබැඳීම පිළිබඳ ප්‍රශ්නයක්: මට කෙලින්ම ක්ෂේත්‍රය වෙනස් කළ හැකි නම් - එය කළ හැකිදැයි මම නොදනිමි, මට මෙසේ පැවසිය හැකිය: "වස්තුවක එක් ක්ෂේත්‍රයක්වත් වෙනස් වී නොමැතිනම් වස්තුව සුරැකීමට අවශ්‍ය නොවේ". මේ අනුව අපිරිසිදු ලුහුබැඳීම වෙනසක් නොවනු ඇත, මට යමක් මග හැරී තිබේද?
අඩවි

2
uj ජුවාන්පාස්තාස්: අපිරිසිදු ලුහුබැඳීම් සම්බන්ධයෙන් දේපලවල ඇති වාසිය නම්, දේපල සැකසුම්කරුවන් විසින් "අපිරිසිදු" ධජයක් සකසන්නේ නම්, ධජය කේතය සකසා නොමැති අවස්ථාවක, කිසිදු දේපලක අගයන් බැලීමට සිදු නොවේ. ඔවුන් වෙනස් වෙන්න ඇති නම්. ඊට වෙනස් ලෙස, වස්තුවක ක්ෂේත්ර ලෙස එහි ගුණාංග හෙලිදරව් නම්, සියළු ක්ෂේත්ර අන්තර්ගතය පෙර අගය (ඇති සැසැඳුම කරන්න වෙලාවක් එකතු වන පමණක් නොව, එම කේතය යුතුය යන්නයි, එරෙහිව සමාන කළ යුතු ඇති පෙර අගය).
සුපර් කැට්

ඒවා හොඳ ඒවා වේ (ක්‍රම ලෙස), හෝ අගය සැකසූ විට හෝ කියවන විට ලොග් වීමටද එය ඉඩ දෙයි.
coloboxp

55

දේපල භාවිතා කිරීමෙන්, දේපලෙහි වටිනාකම වෙනස් වූ විට (aka. 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(){       
     NameChanging?.Invoke(this,EventArgs.Empty);       
 }

 private void OnNameChanged(){
     NameChanged?.Invoke(this,EventArgs.Empty);
 }
}

3
මෙය සොයා ගැනීමට මම බොහෝ කාලයක් ගත කළෙමි. මෙය MVVM ය . ඔබට ස්තුතියි ! :)

46

ඔවුන්ගෙන් බොහෝ දෙනෙක් සිට තාක්ෂණික වාසි සහ අවාසි සමග පැහැදිලි කර 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. දේපල ග්‍රිඩ් හි ඇති දේපල

ඔබ Buttonවිෂුවල් ස්ටුඩියෝ හි වැඩ කර ඇති. එහි ගුණ පෙන්වා ඇත PropertyGridවැනි Text, Nameඅපි ඇදගෙන සහ බොත්තම අතහැර, අපි ගුණ මත ක්ලික් කල විට, එය ස්වයංක්රීයව පන්ති සොයා ඇත විට ආදිය Buttonසහ පෙරහන් Propertiesසහ බවයි PropertyGrid(එහිදී PropertyGridපෙන්වන්නේ නැත Fieldඔවුන් පොදු වුවත්).

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)]අසත්‍ය .

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;
        }
   }

මේවා සිත්ගන්නාසුලු කරුණු, නමුත් ඔබට ක්ෂේත්‍ර හා ගුණාංග දර්ශනය අහිමි වී ඇත.
ඩේවිඩ් ෆෙරෙන්සි රොගොසන්

ෆිලිසෝෆි යන්නෙන් ඔබ අදහස් කරන්නේ කුමක්ද? Av ඩේවිඩ් ෆෙරෙන්සි
සරත් අවනාවු

උදාහරණයක් ලෙස සලකුණු කළ පිළිතුර බලන්න. ක්ෂේත්‍ර සහ දේපල අතර වෙනස දැනටමත් විස්තර කර ඇති බැවින් ඔබ භාවිතා කිරීමේ උදාහරණ සපයන බව ඔබ දුටුවා, කරුණාකර මගේ අදහස අමතක කරන්න, කරුණාකර :)
ඩේවිඩ් ෆෙරෙන්සි රොගොආන්

2
මගේ පිළිතුරේ මගේ පළමු වාක්‍යය කියවන්න. මම විශේෂයෙන් මෙහි පවසා ඇත්තේ මම නැවත මෙහි සියල්ල නැවත සිදු නොකරන බවයි. ඒකෙන් කිසිම තේරුමක් නැහැ !!! ජනතාව පළමුව විස්තරය දෙස බලනු ඇත, පසුව උදාහරණ. සලකුණු කළ පිළිතුර විස්තරය හොඳින් ලබා දෙයි, නමුත් මම තත්‍ය කාලීන අවස්ථා සහ උදාහරණ කිහිපයක් එකතු කළෙමි. අදහස් දැක්වීමට පෙර පා er කයාගේ දෘෂ්ටි කෝණයෙන් ඔබ සිතන බවට වග බලා ගන්න @ ඩේවිඩ් ෆෙරෙන්සි
සරත් අවනාවු

1
මම එය කියවා ඇත්තෙමි, නමුත් ඔබ මගේ පෙර අදහස පැහැදිලිවම කියවා නැත: " නමුත් ඔබ දුටුවා, ඔබ භාවිතයේ උදාහරණ පමණක් සපයන බව, ක්ෂේත්‍ර සහ දේපල අතර වෙනස දැනටමත් විස්තර කර ඇති බැවින්, කරුණාකර මගේ අදහස අමතක කරන්න, කරුණාකර :) " .
ඩේවිඩ් ෆෙරෙන්සි රොගොසන්

34

වෙනස්කම් - භාවිතයන් (කවදාද සහ ඇයි)

ක්ෂේත්රයේ පන්ති හෝ struct සෘජුවම ප්රකාශ කරන බව විචල්ය වේ. පංතියකට හෝ ව්‍යුහයකට නිදර්ශන ක්ෂේත්‍ර හෝ ස්ථිතික ක්ෂේත්‍ර හෝ දෙකම තිබිය හැකිය. සාමාන්‍යයෙන්, ඔබ ක්ෂේත්‍ර භාවිතා කළ යුත්තේ පුද්ගලික හෝ ආරක්ෂිත ප්‍රවේශයක් ඇති විචල්‍යයන් සඳහා පමණි . ඔබේ පන්තිය සේවාදායක කේතයට නිරාවරණය වන දත්ත ලබා දිය යුත්තේ ක්‍රම, ගුණාංග මගිනි සහ දර්ශක . අභ්‍යන්තර ක්ෂේත්‍ර වෙත වක්‍රව පිවිසීම සඳහා මෙම ඉදිකිරීම් භාවිතා කිරීමෙන්, ඔබට අවලංගු ආදාන අගයන්ගෙන් ආරක්ෂා විය හැකිය.

දේපල , ලිවීම් කියවීමට හෝ පෞද්ගලික ක්ෂේත්රයේ අගය ගණනය නම්යශීලී යාන්ත්රණයක් සම්පාදනය කරන සාමාජිකයෙකි. ඔවුන් පොදු දත්ත සාමාජිකයන් නම් දේපළ භාවිතා කළ හැක, නමුත් ඔවුන් ඇත්තටම ඊනියා විශේෂ ක්රම accessors . මෙමඟින් දත්ත පහසුවෙන් ප්‍රවේශ විය හැකි අතර ක්‍රමවේදයන්ගේ ආරක්ෂාව සහ නම්‍යතාවය ප්‍රවර්ධනය කිරීමට උපකාරී වේ. ක්‍රියාවට නැංවීමේ හෝ සත්‍යාපන කේතය සඟවන අතරම, වටිනාකම් ලබා ගැනීමේ සහ සැකසීමේ පොදු ක්‍රමයක් හෙළි කිරීමට ගුණාංග පන්තියට ඉඩ දෙයි. දේපල වටිනාකම ආපසු ලබා ගැනීම සඳහා Get property accessor භාවිතා කරන අතර නව අගයක් පැවරීම සඳහා set accessor භාවිතා කරයි.


මෙය නියම පිළිතුරකි, මෙය තේරුම් ගැනීමට මට සැබවින්ම උපකාරී විය.
ස්ටීව් බෝමන්

"දේපලක් යනු පුද්ගලික ක්ෂේත්‍රයක වටිනාකම කියවීමට, ලිවීමට හෝ ගණනය කිරීමට නම්යශීලී යාන්ත්‍රණයක් සපයන සාමාජිකයෙකි." මෙය වඩාත් අර්ථවත් කරයි.
ගැරී

14

වස්තුවක පොදු අතුරුමුහුණත නොබලා ප්‍රවේශ වන ආකාරය වෙනස් කිරීමට ඔබට ඉඩ දීමේ මූලික වාසිය ගුණාංගවලට ඇත. උදාහරණයක් ලෙස, ඔබට අමතර වලංගු භාවයක් එක් කිරීමට අවශ්‍ය නම්, හෝ ගබඩා කළ ක්ෂේත්‍රයක් ගණනය කිරීමකට වෙනස් කිරීමට නම්, ඔබ මුලින් ක්ෂේත්‍රය දේපලක් ලෙස නිරාවරණය කළහොත් ඔබට එය පහසුවෙන් කළ හැකිය. ඔබ කෙලින්ම ක්ෂේත්‍රයක් නිරාවරණය කළහොත්, නව ක්‍රියාකාරිත්වය එක් කිරීම සඳහා ඔබේ පන්තියේ පොදු අතුරු මුහුණත වෙනස් කළ යුතුය. එම වෙනස පවත්නා සේවාදායකයින් බිඳ දමනු ඇති අතර, ඔවුන් ඔබේ කේතයේ නව අනුවාදය භාවිතා කිරීමට පෙර ඒවා නැවත සකස් කිරීම අවශ්‍ය වේ.

පුළුල් පරිභෝජනය සඳහා නිර්මාණය කර ඇති පන්ති පුස්තකාලයක් ඔබ ලියන්නේ නම් (මිලියන සංඛ්‍යාත ජනතාවක් භාවිතා කරන .NET Framework වැනි), එය ගැටළුවක් විය හැකිය. කෙසේ වෙතත්, ඔබ කුඩා කේත පදනමක් තුළ අභ්‍යන්තරව භාවිතා කරන පන්තියක් ලියන්නේ නම් (<= 50 K රේඛා කියන්න), එය ඇත්ත වශයෙන්ම ලොකු දෙයක් නොවේ, මන්ද ඔබේ වෙනස්වීම් කිසිවෙකුට අහිතකර ලෙස බලපාන්නේ නැත. එවැනි අවස්ථාවකදී එය සැබවින්ම පුද්ගලික මනාපයන් වෙතට පැමිණේ.


11

ගුණාංග අසමමිතික ප්‍රවේශයට සහය දක්වයි, එනම් ඔබට ලබා ගන්නෙකු සහ කට්ටලයක් හෝ දෙකෙන් එකක් පමණක් තිබිය හැකිය. ඒ හා සමානව ගුණාංග ලබා ගන්නා / සැකසුම් සඳහා තනි ප්‍රවේශයට සහාය වේ. ක්ෂේත්‍ර සෑම විටම සමමිතික වේ, එනම් ඔබට සෑම විටම අගය ලබා ගැනීමට සහ සැකසීමට හැකිය. මෙයට ව්‍යතිරේකය කියවීමෙන් පමණක් ක්ෂේත්‍ර වන අතර එය ආරම්භ කිරීමෙන් පසු සැකසිය නොහැක.

දේපල ඉතා දිගු කාලයක් ධාවනය විය හැකිය, අතුරු ආබාධ ඇති විය හැකිය, සහ ව්‍යතිරේකයන් පවා විසි කළ හැකිය. ක්ෂේත්‍ර වේගවත් වන අතර කිසිදු අතුරු ආබාධයක් නොමැති අතර කිසි විටෙකත් ව්‍යතිරේකයන් විසි නොකරනු ඇත. අතුරු ආබාධ හේතුවෙන් දේපලක් සෑම ඇමතුමකටම වෙනස් අගයක් ලබා දිය හැකිය (DateTime.Now, එනම් DateTime.Now සෑම විටම DateTime.Now ට සමාන නොවේ). ක්ෂේත්‍ර සෑම විටම එකම අගය ලබා දෙයි.

පිටත / ref පරාමිතීන් සඳහා ක්ෂේත්‍ර භාවිතා කළ හැකිය, ගුණාංග නොතිබිය හැකිය. ගුණාංග අතිරේක තර්කනයට සහය දක්වයි - මෙය වෙනත් දේ අතර කම්මැලි පැටවීම ක්‍රියාත්මක කිරීමට භාවිතා කළ හැකිය.

ගුණාංග ලබා ගැනීම / සැකසීම යන්නෙන් අදහස් කරන ඕනෑම දෙයක් සංක්ෂිප්ත කිරීමෙන් ගුණාංග වියුක්ත මට්ටමකට සහාය වේ.

බොහෝ / සෑම අවස්ථාවකම ගුණාංග භාවිතා කරන්න, නමුත් අතුරු ආබාධ වළක්වා ගැනීමට උත්සාහ කරන්න.


ක්ෂේත්‍රයේ දත්ත වර්ගය පරිවර්තක ක්‍රියාකරු අධි බරක් සහිත වස්තුවක් වන විට ක්ෂේත්‍රවල දේපලවල සියලු පිරිවැය ගැටළු තිබිය හැකිය - එය සියුම් ගොචා ය.
ඇන්ඩි ඩෙන්ට්

1
දේපල කිසි විටෙකත් අතුරු ආබාධ ඇති නොකළ යුතුය. නිදොස්කරණය කරන්නා පවා එය ආරක්ෂිතව තක්සේරු කළ හැකි යැයි උපකල්පනය කරයි.
ක්‍රේග් ගිඩ්නි

Ri ස්ට්‍රයිලන්ක්: මම සම්පූර්ණයෙන්ම එකඟයි, කෙසේ වෙතත්, එය සැමවිටම එසේ නොවේ. නිදොස්කරණය සම්බන්ධයෙන් ගත් කල, ඔබ කතා කරන්නේ එය නම් FuncEval සමඟ බොහෝ ගැටලු ඇත.
බ්‍රයන් රස්මුසන්

11

පසුබිම තුළ දේපලක් ක්‍රමයට සම්පාදනය කෙරේ. එබැවින් Nameදේපලක් සම්පාදනය කරනු ලබන්නේ get_Name()සහ set_Name(string value). ඔබ සම්පාදනය කළ කේතය අධ්‍යයනය කරන්නේ නම් ඔබට මෙය දැක ගත හැකිය. එබැවින් ඒවා භාවිතා කරන විට ඉහළින් (ඉතා) කුඩා කාර්ය සාධනයක් ඇත. ඔබ ක්ෂේත්‍රයක් පිටතින් නිරාවරණය කරන්නේ නම් සාමාන්‍යයෙන් ඔබ සැමවිටම දේපලක් භාවිතා කරනු ඇති අතර, වටිනාකම වලංගු කිරීම අවශ්‍ය නම් ඔබ එය බොහෝ විට අභ්‍යන්තරව භාවිතා කරනු ඇත.


8

ක්ෂේත්‍ර සහ ගුණාංග එකිනෙකට සමාන බව පෙනුනද ඒවා සම්පූර්ණයෙන්ම වෙනස් භාෂා අංග 2 කි.

  1. පන්ති මට්ටමින් දත්ත ගබඩා කරන එකම යාන්ත්‍රණය ක්ෂේත්‍ර වේ. ක්ෂේත්‍ර විෂය පථයේ සංකල්පමය වශයෙන් විචල්‍ය වේ. ඔබේ පංති (වස්තු) සඳහා සමහර දත්ත ගබඩා කිරීමට ඔබට අවශ්‍ය නම් ඔබට ක්ෂේත්‍ර භාවිතා කළ යුතුය. වෙනත් විකල්පයක් නැත. දේපලවලට කිසිදු දත්තයක් ගබඩා කළ නොහැකි වුවද, ඔවුන්ට එය කළ හැකි බව පෙනේ. බෙල්ල බලන්න.

  2. අනෙක් අතට දේපල කිසි විටෙකත් දත්ත ගබඩා නොකරයි. ඒවා ක්ෂේත්‍රයන් හා සමාන ආකාරයකින් සින්ටැක්ටිකල් ලෙස හැඳින්විය හැකි ක්‍රම යුගල (ලබා ගැනීම සහ සැකසීම) වන අතර බොහෝ විට ඒවා යම් ව්‍යාකූලතාවයක මූලාශ්‍රය වන ක්ෂේත්‍ර වෙත ප්‍රවේශ වීමට (කියවීමට හෝ ලිවීමට) පිවිසේ. නමුත් දේපල ක්‍රම (ස්ථාවර මූලාකෘති වැනි යම් සීමාවන් සහිතව) නිත්‍ය C # ක්‍රම නිසා ඔවුන්ට නිත්‍ය ක්‍රමවලින් කළ හැකි ඕනෑම දෙයක් කළ හැකිය. එයින් අදහස් කරන්නේ ඔවුන්ට කේත පේළි 1000 ක් තිබිය හැකි අතර, ඔවුන්ට ව්‍යතිරේකයන් විසි කළ හැකිය, වෙනත් ක්‍රම අමතන්න, අථත්ය, වියුක්ත හෝ අභිබවා යා හැකිය. ගුණාංග විශේෂ වන්නේ කුමක් ද, C # සම්පාදකයා විසින් විශේෂිත ගුණාංග සෙවීම සඳහා භාවිතා කළ හැකි එක්රැස්වීම් තුළට අමතර පාර-දත්ත කිහිපයක් ගබඩා කරයි - පුළුල් ලෙස භාවිතා කරන ලක්ෂණය.

දේපල ක්‍රම ලබා ගැනීම සහ සැකසීම පහත සඳහන් මූලාකෘති ඇත.

PROPERTY_TYPE get();

void set(PROPERTY_TYPE value);

එබැවින් ක්ෂේත්‍රයක් සහ ඊට අනුරූප ක්‍රම 2 ක් නිර්වචනය කිරීමෙන් ගුණාංග 'අනුකරණය' කළ හැකිය.

class PropertyEmulation
{
    private string MSomeValue;

    public string GetSomeValue()
    {
        return(MSomeValue);
    }

    public void SetSomeValue(string value)
    {
        MSomeValue=value;
    }
}

සම්මත C ++ වැනි දේපල සඳහා සහය නොදක්වන ක්‍රමලේඛන භාෂාවන් සඳහා එවැනි දේපල අනුකරණයන් සාමාන්‍ය වේ. C # හි ඔබ සැමවිටම ඔබේ ක්ෂේත්‍ර වෙත ප්‍රවේශ වන ආකාරය ලෙස දේපල වලට වැඩි කැමැත්තක් දැක්විය යුතුය.

දත්ත පමණක් ගබඩා කළ හැක්කේ ක්ෂේත්‍රයන්ට පමණක් බැවින්, එයින් අදහස් වන්නේ පන්තියේ වැඩි ක්ෂේත්‍ර ප්‍රමාණයක් අඩංගු වන බැවින් එවැනි පන්තියේ වැඩි මතක වස්තු පරිභෝජනය කරනු ඇති බවයි. අනෙක් අතට, පන්තියකට නව ගුණාංග එකතු කිරීමෙන් එවැනි පංතියේ වස්තූන් විශාල නොවේ. මෙන්න උදාහරණය.

class OneHundredFields
{
        public int Field1;
        public int Field2;
        ...
        public int Field100;
}

OneHundredFields Instance=new OneHundredFields() // Variable 'Instance' consumes 100*sizeof(int) bytes of memory.

class OneHundredProperties
{
    public int Property1
    {
        get
        {
            return(1000);
        }
        set
        {
            // Empty.
        }
    }

    public int Property2
    {
        get
        {
            return(1000);
        }
        set
        {
            // Empty.
        }
    }

    ...

    public int Property100
    {
        get
        {
            return(1000);
        }
        set
        {
            // Empty.
        }
    }
}

OneHundredProperties Instance=new OneHundredProperties() // !!!!! Variable 'Instance' consumes 0 bytes of memory. (In fact a some bytes are consumed becasue every object contais some auxiliarity data, but size doesn't depend on number of properties).

දේපල ක්‍රමවලට ඕනෑම දෙයක් කළ හැකි වුවද, බොහෝ විට ඒවා වස්තු ක්ෂේත්‍රයට ප්‍රවේශ වන ක්‍රමයක් ලෙස සේවය කරයි. ඔබට වෙනත් පංතිවලට ප්‍රවේශ විය හැකි ක්ෂේත්‍රයක් කිරීමට අවශ්‍ය නම් ඔබට ක්‍රම 2 කින් කළ හැකිය.

  1. ක්ෂේත්‍ර පොදු බවට පත් කිරීම - සුදුසු නොවේ.
  2. ගුණාංග භාවිතා කිරීම.

මෙන්න පොදු ක්ෂේත්ර භාවිතා කරන පන්තියක්.

class Name
{
    public string FullName;
    public int YearOfBirth;
    public int Age;
}

Name name=new Name();

name.FullName="Tim Anderson";
name.YearOfBirth=1979;
name.Age=40;

කේතය පරිපූර්ණ ලෙස වලංගු වන අතර, සැලසුම් දෘෂ්ටි කෝණයෙන් බලන විට, එහි අඩුපාඩු කිහිපයක් තිබේ. ක්ෂේත්‍ර කියවීමට හා ලිවීමට හැකි බැවින්, පරිශීලකයාට ක්ෂේත්‍ර වෙත ලිවීම වැළැක්විය නොහැක. ඔබට readonlyයතුරුපදය යෙදිය හැකිය , නමුත් මේ ආකාරයෙන්, ඔබට කියවිය හැකි ක්ෂේත්‍ර ආරම්භ කළ යුත්තේ ඉදිකිරීම්කරු තුළ පමණි. එපමණක්ද නොව, ඔබගේ ක්ෂේත්‍ර වල වලංගු නොවන අගයන් ගබඩා කිරීමට කිසිවක් ඔබව වළක්වන්නේ නැත.

name.FullName=null;
name.YearOfBirth=2200;
name.Age=-140;

කේතය වලංගු වේ, සියලු පැවරුම් තර්කානුකූල නොවන නමුත් ක්‍රියාත්මක වේ. Agenegative ණ අගයක් ඇති අතර YearOfBirthඑය අනාගතයේ දී බොහෝ දුරට වන අතර එය වයසට අනුරූප නොවන අතර FullNameඑය ශුන්‍ය වේ. ක්ෂේත්‍ර සමඟ පරිශීලකයින්ට class Nameඑවැනි වැරදි කිරීම වලක්වා ගත නොහැක .

මෙන්න මෙම ගැටළු නිරාකරණය කරන ගුණාංග සහිත කේතයක්.

class Name
{
    private string MFullName="";
    private int MYearOfBirth;

    public string FullName
    {
        get
        {
            return(MFullName);
        }
        set
        {
            if (value==null)
            {
                throw(new InvalidOperationException("Error !"));
            }

            MFullName=value;
        }
    }

    public int YearOfBirth
    {
        get
        {
            return(MYearOfBirth);
        }
        set
        {
            if (MYearOfBirth<1900 || MYearOfBirth>DateTime.Now.Year)
            {
                throw(new InvalidOperationException("Error !"));
            }

            MYearOfBirth=value;
        }
    }

    public int Age
    {
        get
        {
            return(DateTime.Now.Year-MYearOfBirth);
        }
    }

    public string FullNameInUppercase
    {
        get
        {
            return(MFullName.ToUpper());
        }
    }
}

පන්තියේ යාවත්කාලීන කළ අනුවාදයට පහත වාසි ඇත.

  1. FullNameසහ YearOfBirthඅවලංගු අගයන් සඳහා පරීක්ෂා කරනු ලැබේ.
  2. Ageලිවිය නොහැක. එය YearOfBirthවර්තමාන වර්ෂයේ සිට ගණනය කර ඇත .
  3. නව දේපලක් UPPER CASE FullNameInUppercaseබවට පරිවර්තනය FullNameවේ. මෙය දේපල භාවිතය පිළිබඳ කුඩා උපක්‍රමශීලී උදාහරණයකි, එහිදී පරිශීලකයාට වඩාත් සුදුසු ආකෘතියේ ක්ෂේත්‍ර අගයන් ඉදිරිපත් කිරීමට දේපල බහුලව භාවිතා වේ - නිදසුනක් ලෙස නිශ්චිත සංඛ්‍යාත්මක DateTimeආකෘතියක් මත වත්මන් පෙදෙසි භාවිතා කිරීම .

මේ හැරුණු විට, ගුණාංග අථත්ය හෝ අභිබවා යන ලෙස අර්ථ දැක්විය හැකිය - ඒවා නිතිපතා .NET ක්රම නිසා. නිත්‍ය ක්‍රම සඳහා වන දේපල ක්‍රම සඳහා එකම නීති අදාළ වේ.

C # දේපල ක්‍රමවල දර්ශක පරාමිතියක් ඇති ගුණාංග වන දර්ශක සඳහා ද සහාය දක්වයි. මෙන්න උදාහරණය.

class MyList
{
    private string[]                 MBuffer;

    public MyList()
    {
        MBuffer=new string[100];
    }

    public string this[int Index]
    {
        get
        {
            return(MBuffer[Index]);
        }
        set
        {
            MBuffer[Index]=value;
        }
    }
}

MyList   List=new MyList();

List[10]="ABC";
Console.WriteLine(List[10]);

C # 3.0 මඟින් ඔබට ස්වයංක්‍රීය ගුණාංග අර්ථ දැක්වීමට ඉඩ ලබා දේ. මෙන්න උදාහරණය.

class AutoProps
{
    public int Value1
    {
        get;
        set;
    }

    public int Value2
    {
        get;
        set;
    }
}

class AutoPropsගුණාංග පමණක් අඩංගු වුවද (හෝ එය පෙනේ), එයට අගයන් 2 ක් ගබඩා කළ හැකි අතර මෙම පන්තියේ වස්තූන්ගේ ප්‍රමාණය sizeof(Value1)+sizeof(Value2)= 4 + 4 = 8 බයිට් වලට සමාන වේ.

මේ සඳහා හේතුව සරල ය. ඔබ ස්වයංක්‍රීය දේපලක් නිර්වචනය කරන විට, C # සම්පාදකයා විසින් සැඟවුණු ක්ෂේත්‍රයක් සහ මෙම සැඟවුණු ක්ෂේත්‍රයට ප්‍රවේශ වන දේපල ක්‍රම සහිත දේපලක් අඩංගු ස්වයංක්‍රීය කේතයක් ජනනය කරයි. මෙන්න කේත සම්පාදකයා නිෂ්පාදනය කරයි.

සම්පාදනය කරන ලද එකලස් කිරීමෙන් ILSpy විසින් ජනනය කරන ලද කේතයක් මෙන්න . පන්තියේ ජනනය කරන ලද සැඟවුණු ක්ෂේත්‍ර සහ ගුණාංග අඩංගු වේ.

internal class AutoProps
{
    [CompilerGenerated]
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    private int <Value1>k__BackingField;

    [CompilerGenerated]
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    private int <Value2>k__BackingField;

    public int Value1
    {
        [CompilerGenerated]
        get
        {
            return <Value1>k__BackingField;
        }
        [CompilerGenerated]
        set
        {
            <Value1>k__BackingField = value;
        }
    }

    public int Value2
    {
        [CompilerGenerated]
        get
        {
            return <Value2>k__BackingField;
        }
        [CompilerGenerated]
        set
        {
            <Value2>k__BackingField = value;
        }
    }
}

එබැවින්, ඔබට පෙනෙන පරිදි, සම්පාදකයා තවමත් අගයන් ගබඩා කිරීම සඳහා ක්ෂේත්‍ර භාවිතා කරයි - වස්තු තුළ අගයන් ගබඩා කරන්නේ කෙසේද යන්න ක්ෂේත්‍ර පමණක් වන බැවින්.

ඔබට පෙනෙන පරිදි, දේපල හා ක්ෂේත්‍ර වලට සමාන භාවිත සින්ටැක්ස් තිබුණද ඒවා බෙහෙවින් වෙනස් සංකල්ප වේ. ඔබ ස්වයංක්‍රීය ගුණාංග හෝ සිදුවීම් භාවිතා කළත් - සැඟවුණු ක්ෂේත්‍ර ජනනය කරනු ලබන්නේ සැබෑ දත්ත ගබඩා කර ඇති සම්පාදකයා විසිනි.

ඔබට ක්ෂේත්‍ර වටිනාකමක් බාහිර ලෝකයට ලබා දීමට අවශ්‍ය නම් (ඔබේ පන්තියේ පරිශීලකයින්) පොදු හෝ ආරක්ෂිත ක්ෂේත්‍ර භාවිතා නොකරන්න. ක්ෂේත්‍ර සෑම විටම පුද්ගලික ලෙස සලකුණු කළ යුතුය. ගුණාංග මඟින් ඔබට වටිනාකම් පරීක්‍ෂා කිරීම, හැඩතල ගැන්වීම, පරිවර්තනය කිරීම ආදිය කළ හැකි අතර සාමාන්‍යයෙන් ඔබේ කේතය ආරක්ෂිත, කියවිය හැකි සහ අනාගත වෙනස් කිරීම් සඳහා පුළුල් කළ හැකිය.


7

ඔබේ පුද්ගලික විචල්‍යය (ක්ෂේත්‍රය) වෙනත් පංති වලින් ඔබේ පන්තියේ වස්තුවට ප්‍රවේශ වීමට ඔබට අවශ්‍ය වූ විට එම විචල්‍යයන් සඳහා ගුණාංග නිර්මාණය කළ යුතුය.

උදාහරණයක් ලෙස මට "හැඳුනුම්පත" සහ "නම" ලෙස නම් කර ඇති විචල්‍යයන් තිබේ නම් එය පුද්ගලික වන නමුත් පන්තියට පිටතින් කියවීමට / ලිවීමට මෙම විචල්‍යය අවශ්‍ය වන තත්වයක් තිබිය හැකිය. එම අවස්ථාවෙහිදී, දේපල සඳහා අර්ථ දක්වා ඇති / කට්ටලය මත පදනම්ව එම විචල්‍යය කියවීමට / ලිවීමට දේපල මට උපකාර කරයි. දේපලක් කියවීමට / ලිවීමට පමණක් / කියවීමට ලිවිය හැකිය.

මෙන්න නිරූපණය

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";
    }
}

6

මෙහි ඇති දෙවන ප්‍රශ්නය, “දේපලක් වෙනුවට ක්ෂේත්‍රයක් භාවිතා කළ යුත්තේ කවදාද?”, මෙම අනෙක් පිළිතුරෙහි කෙටියෙන් ස්පර්ශ වන අතර මෙයද කාරුණික , නමුත් එතරම් විස්තරාත්මක නොවේ.

පොදුවේ ගත් කල, අනෙක් සියලුම පිළිතුරු හොඳ නිර්මාණයක් පිළිබඳ අවධානය යොමු කරයි: නිරාවරණය වන ක්ෂේත්‍රවලට වඩා ගුණාංග නිරාවරණය කිරීමට කැමැත්තක් දක්වන්න. සමහර විට ඔබ නොවන අතර නිතිපතා ඔබ "වාව්, මට ඕන කරන දේවල් වෙනුවට දේපළ මෙම ක්ෂේත්ර සාදන නම් කොපමණ වඩාත් නරක අතට හැරෙනු ඇති බවත් උපකල්පනය කරන්න" කියා සොයා, ඒක ගොඩක් , ඔබ "වාව් කියන්නේ ඇති තත්වය ගැන හිතන්න වැඩි දුර්ලභ දෙවියන්ට ස්තූතියි මම දේපලක් වෙනුවට මෙහි ක්ෂේත්‍රයක් භාවිතා කළා. ”

නමුත් ක්ෂේත්‍රවලට ගුණාංගවලට වඩා එක් වාසියක් ඇත, එය "ref" / "out" පරාමිතීන් ලෙස භාවිතා කිරීමේ හැකියාවයි. ඔබට පහත අත්සන සහිත ක්‍රමයක් ඇතැයි සිතමු:

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

මේ ආකාරයට සාදන ලද අරාවක් පරිවර්තනය කිරීම සඳහා ඔබට එම ක්‍රමය භාවිතා කිරීමට අවශ්‍ය යැයි සිතමු:

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

මෙන්න මම හිතන්නේ X සහ Y ගුණාංග බැවින් එය කළ හැකි වේගවත්ම ක්‍රමය :

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ක්‍රමයට වඩා මිල අධික වන තරමට වෙනස බවට පත්වන තරමට අඩු වේ. මෙය ඔබම පුනරාවර්තනය කිරීම සඳහා, පළමු පේළිය විවරණය කර ඇති අතර එය අදහස් දැක්වීමකින් තොරව ධාවනය කරන්න.

ඉහත සඳහා කාර්ය සාධන ප්‍රතිලාභ නොතිබුණද, අන්තර් සම්බන්ධිත හෝ වාෂ්පශීලී පවුල් ක්‍රමෝපායන් ඇමතීම වැනි ref සහ out පරාමිතීන් භාවිතා කිරීම ප්‍රයෝජනවත් විය හැකි වෙනත් ස්ථාන තිබේ . සටහන: මෙය ඔබට අළුත් දෙයක් නම්, වාෂ්පශීලී යනු මූලික වශයෙන් volatileමූලපදය මඟින් සපයන ලද එකම හැසිරීම ලබා ගැනීමේ ක්‍රමයකි . එනිසා, volatileඑහි නම පවසන පරිදි එය නූල්-ආරක්‍ෂිත දුක් කරදර මැජික් ලෙස විසඳන්නේ නැත.

"අනේ, මම දේපල වෙනුවට ක්ෂේත්‍ර නිරාවරණය කිරීම ආරම්භ කළ යුතුයි" යනුවෙන් මා යෝජනා කරන බවක් පෙනෙන්නට මට අනිවාර්යයෙන්ම අවශ්‍ය නැත. කාරණය නම්, ඔබට මෙම සාමාජිකයන් "ref" හෝ "out" පරාමිතීන් ගන්නා ඇමතුම් වල නිතිපතා භාවිතා කිරීමට අවශ්‍ය නම්, විශේෂයෙන් සරල අගය වර්ගයක් විය හැකි, කිසියම් අගය එකතු කළ අංගයක් කිසි විටෙකත් අවශ්‍ය නොවනු ඇත, තර්කයක් ඉදිරිපත් කළ හැකිය.


4

එසේම, ගුණාංග මඟින් අගයන් සැකසීමේදී තර්කනය භාවිතා කිරීමට ඉඩ ලබා දේ.

එබැවින් ඔබට අවශ්‍ය වන්නේ පූර්ණ සංඛ්‍යා ක්ෂේත්‍රයකට අගයක් සැකසීමට පමණක් බව ඔබට කිව හැකිය, අගය x ට වඩා වැඩි නම්, එසේ නොමැතිනම් ව්‍යතිරේකයක් දමන්න.

සැබවින්ම ප්‍රයෝජනවත් අංගයකි.


4

ඔබ නූල් ප්‍රාථමික භාවිතා කිරීමට යන්නේ නම් ඔබට ක්ෂේත්‍ර භාවිතා කිරීමට බල කෙරෙයි. ගුණාංගවලට ඔබේ නූල් කේතය බිඳ දැමිය හැකිය. ඒ හැරුණු විට කෝරි පැවසූ දේ නිවැරදි ය.


1
කවදා සිටද? දේපල තුළ ඔබේ පසුබිම් ක්ෂේත්‍රය අගුළු දමන්න, එය සමාන වේ
සේකාත්

1
දේපල ක්‍රම වන අතර අද කිසිදු CIL JIT විසින් එය යොමු කර නොමැත. ඔබ ඉන්ටර්ලොක් වැනි නූල් ප්‍රාථමික භාවිතා කිරීමට යන්නේ නම් ඔබට ක්ෂේත්‍ර තිබිය යුතුය. ඔබේ ප්‍රභවයන් පරීක්ෂා කරන්න. 'අගුලු දැමීම' යනු වැරදි වචනය බව පිළිගත යුතුය.
ජොනතන් සී ඩිකින්සන්

4

(මෙය සැබවින්ම අදහස් දැක්වීමක් විය යුතුය, නමුත් මට අදහසක් පළ කළ නොහැක, එබැවින් එය තනතුරක් ලෙස නුසුදුසු නම් කරුණාකර සමාවෙන්න).

මම වරක් නිර්දේශිත පරිචය වූ ස්ථානයක සේවය කළෙමි. දේපල වෙනුවට පොදු ක්ෂේත්‍ර භාවිතා කිරීම සමාන දේපල ඩෙෆ් යන්තම් ක්ෂේත්‍රයකට පිවිසෙනු ඇත.

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

ඔවුන්ගේ තර්කය වූයේ අනාගතයේදී අවශ්‍ය නම් පොදු ක්ෂේත්‍රය දේපලක් බවට පරිවර්තනය කළ හැකි බවයි. එකල මට ටිකක් අමුතු බවක් පෙනෙන්නට තිබුණි. මෙම තනතුරු අනුව විනිශ්චය කිරීම, මෙහි බොහෝ දෙනෙක් එකඟ නොවන බව පෙනේ. දේවල් වෙනස් කිරීමට උත්සාහ කිරීමට ඔබ කුමක් පැවසිය හැකිද?

සංස්කරණය කරන්න: මෙම ස්ථානයේ ඇති සියලුම කේත පදනම එකවර සම්පාදනය කර ඇති බව මම එකතු කළ යුතුය, එබැවින් පංතිවල පොදු අතුරු මුහුණත වෙනස් කිරීම (පොදු ක්ෂේත්‍රයක් දේපලක් බවට පත් කිරීමෙන්) ගැටලුවක් නොවන බව ඔවුන් සිතන්නට ඇත.


සී # 3.0 සිට , මෙහි විස්තර කර ඇති රටාවට ස්වයංක්‍රීයව ක්‍රියාත්මක කරන ලද ගුණාංග යනුවෙන් හැඳින්වෙන අංගයක් මඟින් පහසුවෙන්ම සහාය වේ.
ඩේවිඩ් ආර් ආර්

මම හිතන්නේ C # හි ඇති ගුණාංග වලින් එකක් වන්නේ ක්ෂේත්‍ර වලට සමාන API ඇති බැවින් පන්තියේ සේවාදායකයින් ඔවුන් දේපළකට හෝ ක්ෂේත්‍රයකට ප්‍රවේශ වන්නේද යන්න ගැන තැකීමක් නොකරයි. (උදාහරණයක් ලෙස C ++ හි මෙය සත්‍ය නොවේ) .. මූලාකෘතිකරණයේදී, පොදු ක්ෂේත්‍ර වලින් ආරම්භ කිරීම සාධාරණ යැයි මම සිතමි, පසුව අවශ්‍ය පරිදි දේපල වෙත සංක්‍රමණය වීම. ගුණාංග සමඟ කාර්ය සාධනය සහ මතක පහරක් ඇති අතර අමතර ටයිප් කිරීමක් ඇත. ඔවුන් නිදහස් නොවේ. නමුත්, ඔබ ඔබේ අදහස වෙනස් කරන්නේ නම්, ඔබට කිසිදු යැපෙන කේතයක් ප්‍රතික්‍රියා කිරීමට අවශ්‍ය නොවේ.
මාර්ක් ලකාටා

ගුණාංග OUT හෝ REF පරාමිතීන් ලෙස භාවිතා කළ නොහැක, එබැවින් ක්ෂේත්‍රයක් දේපලක් බවට වෙනස් කිරීම මඟින් දෝෂයන් සම්පාදනය කිරීමට හේතු වේ. ආරම්භයේ සිටම වටිනාකම දේපලක් ලෙස ක්‍රියාත්මක වූයේ නම්, එය කිසි විටෙකත් OUT හෝ REF (පැස්කල් / ඩෙල්ෆි හි VAR) පරාමිතීන් ලෙස භාවිතා නොකරනු ඇති අතර, ඔබ ලබා ගන්නා / සැකසුම් තුළ සිදුකරන ඕනෑම වෙනසක් භාවිතයට විනිවිද පෙනෙන වනු ඇත.
හාට්වෙයාර්

4

තාක්‍ෂණිකව, වෙනසක් ඇතැයි මම නොසිතමි, මන්ද දේපල යනු පරිශීලකයා විසින් නිර්මාණය කරන ලද හෝ සම්පාදකයා විසින් ස්වයංක්‍රීයව නිර්මාණය කරන ලද ක්ෂේත්‍රයන් වටා එතීමකි. දේපලවල අරමුණ වන්නේ සංසරණය බලාත්මක කිරීම සහ සැහැල්ලු ක්‍රමයට සමාන අංගයක් ඉදිරිපත් කිරීමයි. ක්ෂේත්‍ර පොදු ලෙස ප්‍රකාශ කිරීම නරක පුරුද්දකි, නමුත් එයට කිසිදු ගැටළුවක් නොමැත.


4

ක්ෂේත්‍ර යනු සාමාන්‍ය සාමාජික විචල්‍යයන් හෝ පන්තියක සාමාජික අවස්ථා ය. ගුණාංග යනු ඒවායේ අගයන් ලබා ගැනීමට සහ සැකසීමට වියුක්ත කිරීමකි . ඔබ පංතියේ ක්ෂේත්‍රයක් පුද්ගලිකව නිරාවරණය කරන්නේ නම් ක්ෂේත්‍රයක් වෙනස් කිරීමට සහ ලබා ගැනීමට ක්‍රමයක් ඉදිරිපත් කරන බැවින් දේපල ප්‍රවේශයන් ලෙසද හැඳින්වේ. පොදුවේ ගත් කල, ඔබ ඔබේ සාමාජික විචල්‍යයන් පුද්ගලික ලෙස ප්‍රකාශ කළ යුතු අතර, පසුව ඒවා සඳහා ගුණාංග ප්‍රකාශ කිරීම හෝ අර්ථ දැක්වීම කළ යුතුය.

  class SomeClass
  {
     int numbera; //Field

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

  }

3

ගුණාංග ක්ෂේත්‍රයන් ආවරණය කරයි, එමඟින් සැකසීමට හෝ ලබා ගැනීමට ඇති වටිනාකම පිළිබඳ අතිරේක සැකසුම් සිදු කිරීමට ඔබට හැකි වේ. ඔබ ක්ෂේත්‍ර වටිනාකම පිළිබඳ පූර්ව හෝ පසු සැකසුම් කිරීමක් නොකරන්නේ නම් සාමාන්‍යයෙන් දේපල භාවිතා කිරීම අධික ලෙස මරා දැමීමකි.


1
නැත, මම සැමවිටම ගුණාංග භාවිතා කරමි, එය ඔබගේ API කඩ නොකර ඕනෑම වේලාවක ක්‍රියාත්මක කිරීම වෙනස් කිරීමේ නම්‍යතාවය ලබා දේ.
සේකාත්

API පරිණාමය සම්බන්ධයෙන්, ඔබට ගැටළු නොමැතිව පුද්ගලික දත්ත සඳහා ක්ෂේත්‍ර භාවිතා කළ හැකිය . එක්රැස්වීමක් තුළ දත්ත හුවමාරු කර ගැනීමට අවශ්‍ය අමුතු අවස්ථාවන්හිදී ඔබට ක්ෂේත්‍රවලට 'අභ්‍යන්තර' ප්‍රවේශය ලබා දිය හැකිය.
ඩැනියෙල් අර්විකර්

3

IMO, Properties යනු අප කලින් භාවිතා කළ "SetXXX ()" GetXXX () "කාර්යයන් / ක්‍රම / අතුරුමුහුණත් යුගල පමණි, නමුත් ඒවා වඩාත් සංක්ෂිප්ත හා අලංකාර වේ.


3

සාම්ප්‍රදායිකව පුද්ගලික ක්ෂේත්‍ර සැකසෙන්නේ ගෙටර් සහ සෙටර් ක්‍රම හරහා ය. අඩු කේතයක් සඳහා ඔබට ඒ වෙනුවට ක්ෂේත්‍ර සැකසීමට ගුණාංග භාවිතා කළ හැකිය.


3

ඔබට "කාර්" පන්තියක් ඇති විට. ගුණාංග වර්ණය, හැඩය ..

ක්ෂේත්‍ර ලෙස විචල්‍යයන් පන්තියක විෂය පථය තුළ අර්ථ දක්වා ඇත.


3

විකිපීඩියාවෙන් - වස්තු-නැඹුරු වැඩසටහන්කරණය :

වස්තු-නැඹුරු වැඩසටහන්කරණය (OOP) යනු “වස්තු” යන සංකල්පය මත පදනම් වූ ක්‍රමලේඛන ආදර්ශයකි, ඒවා දත්ත අඩංගු දත්ත ව්‍යුහයන් වන අතර ඒවා ක්ෂේත්‍ර ස්වරූපයෙන් බොහෝ විට ගුණාංග ලෙස හැඳින්වේ; සහ කේතය ක්‍රියා පටිපාටි ස්වරූපයෙන් බොහෝ විට ක්‍රම ලෙස හැඳින්වේ . (අවධාරණය එකතු කරන ලදි)

ගුණාංග ඇත්ත වශයෙන්ම වස්තුවක හැසිරීමේ කොටසකි, නමුත් නිර්මාණය කර ඇත්තේ වස්තුවේ පාරිභෝගිකයින්ට වස්තුවේ දත්ත සමඟ වැඩ කිරීමේ මිත්‍යාව / සාරාංශය ලබා දීම සඳහා ය.


3

ක්ෂේත්‍රයක් පිළිබඳ මගේ සැලසුම නම් ක්ෂේත්‍රයක් වෙනස් කළ යුත්තේ එහි මවුපියන් විසින් පමණි, එබැවින් පන්තිය. ප්‍රති variable ලය විචල්‍යය පුද්ගලික බවට පත් වේ, එවිට පිටත පන්ති / ක්‍රම කියවීමේ අයිතිය ලබා දීමට හැකිවීම සඳහා මම දේපල පද්ධතිය හරහා යන්නේ Get සමඟ පමණි. ක්ෂේත්‍රය පසුව දේපල මගින් ලබා ගන්නා අතර කියවීමට පමණි! ඔබට එය වෙනස් කිරීමට අවශ්‍ය නම් ඔබට ක්‍රමවේදයන් අනුගමනය කළ යුතුය (නිදසුනක් ලෙස ඉදිකිරීම්කරු) සහ ඔබව ආරක්ෂා කර ගැනීමේ මෙම ක්‍රමයට ස්තූතිවන්ත වන අතර, අපගේ කේතය මත අපට වඩා හොඳ පාලනයක් ඇත්තේ අප “ෆ්ලැන්ජ්” කරන බැවිනි. කෙනෙකුට සෑම විටම සෑම දෙයක්ම ප්‍රසිද්ධියේ තැබිය හැකි බැවින් හැකි සෑම අවස්ථාවකම විචල්‍යයන් / ක්‍රම / පංති යනාදිය පිළිබඳ සංකල්පය ... මගේ මතය අනුව කේතය සංවර්ධනය කිරීම, නඩත්තු කිරීම සඳහා ආධාරයක් පමණි. නිදසුනක් වශයෙන්, පුද්ගලයෙකු පොදු ක්ෂේත්‍ර සමඟ කේතයක් නැවත ආරම්භ කරන්නේ නම්, ඔහුට ඕනෑම දෙයක් කළ හැකි අතර එම නිසා “තර්කානුකූල නොවන” දේවල් පරමාර්ථයට සාපේක්ෂව, කේතය ලිවීමට හේතුව පිළිබඳ තර්කනය. එය මගේ දෘෂ්ටිකෝණයයි.

මම සම්භාව්‍ය ආකෘතියක් භාවිතා කරන විට පුද්ගලික ක්ෂේත්‍ර / පොදු කියවීමට පමණක් ඇති දේපල, පුද්ගලික ක්ෂේත්‍ර 10 ක් සඳහා මම පොදු දේපල 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;
 }
}

ඔව් මගේ නරක, සමාවෙන්න!
ටෝනි පිනොට්

3

මේ ගැන සිතා බලන්න: ඔබට මෙම කාමරයට ඇතුළු වීමට කාමරයක් හා දොරක් තිබේ. ඔබට පැමිණෙන්නේ කවුරුන්ද යන්න පරීක්ෂා කර ඔබගේ කාමරය සුරක්ෂිත කර ගැනීමට අවශ්‍ය නම්, ඔබ දේපල භාවිතා කළ යුතුය. එසේ නොමැතිනම් ඒවා කිසිදු දොරක් නොවනු ඇති අතර සෑම කෙනෙකුම පහසුවෙන් ඕනෑම රෙගුලාසියකට පැමිණේ.

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";

දැන් ඔබ එම පුද්ගලයා පරීක්ෂා කර ඔහු සමඟ යම්කිසි නපුරක් ඇත්දැයි දැන ගන්න


3

ක්ෂේත්ර යනු පන්තිවල විචල්යයන් වේ. ක්ෂේත්‍ර යනු ඔබට ප්‍රවේශ විකරණකාරක භාවිතයෙන් සංයුක්ත කළ හැකි දත්ත වේ.

ගුණාංග ක්ෂේත්‍රයන්ට සමාන වන අතර එමඟින් ඒවා රාජ්‍යයන් සහ වස්තුවක් හා සම්බන්ධ දත්ත අර්ථ දක්වයි.

ක්ෂේත්‍රයක් මෙන් නොව, දේපලකට විශේෂ වාක්‍ය ඛණ්ඩයක් ඇත, එය පුද්ගලයෙකු දත්ත කියවන ආකාරය සහ දත්ත ලියන ආකාරය පාලනය කරයි, මේවා හැඳින්වෙන්නේ ක්‍රියාකරවන්නන් ලෙසිනි. කට්ටල තර්කනය බොහෝ විට වලංගු කිරීම සඳහා භාවිතා කළ හැකිය.


3

මූලික හා සාමාන්‍ය වෙනස:

ක්ෂේත්ර

  • සෑම විටම ලබා ගැනීමට සහ සැකසීමට ප්‍රවේශය ලබා දේ
  • අතුරු ආබාධ ඇති කළ නොහැක (ව්‍යතිරේක විසි කිරීම, ඇමතුම් ක්‍රම, ලැබී ඇති / සකසා ඇති ඒවා හැර ක්ෂේත්‍ර වෙනස් කිරීම ආදිය)

දේපළ

  • සෑම විටම ලබා ගැනීමට සහ සැකසීමට ප්‍රවේශය ලබා නොදේ
  • CAN හේතුව අතුරු ආබාධ

ආයුබෝවන් සහ StackOverflow වෙත සාදරයෙන් පිළිගනිමු. කරුණාකර උදව් පිටුව කියවීමට යම් කාලයක් ගත කරන්න, විශේෂයෙන් පිළිතුරු දිය යුතු ආකාරය නම් කොට ඇත. අවම ප්‍රජනනය කළ හැකි උදාහරණය ගැන ඉගෙන ගැනීමටද ඔබට අවශ්‍ය විය හැකිය .
ඔඩ්මාර් වේල්ල

1
ආයුබෝවන්, ස්තූතියි! එය මගේ පිළිතුරේ යම් වැරැද්දක් ද? මම කලින් කියවූ සියල්ලම කියවා ඒවා ඉතා නරක යැයි මට සිතේ. C # හි ඇති ක්ෂේත්‍ර හා ගුණාංග අතර වෙනසෙහි සාරය මගේ එකක් බව මම විශ්වාස කරමි. එය හැකි තරම් කෙටි නමුත් තවමත් කාරණය පැහැදිලි කරයි.
ටෙඩ් මුකුසානි

හායි ed ටෙඩ්. මම අවුරුදු 12 ක් පමණ c # හි වැඩ කළ අතර අතුරු ආබාධ මොනවාදැයි කිසි විටෙකත් සිතුවේ නැත :) ඒවා ගැන දැනගැනීමට කැමතියි. නමුත් මම එකඟ වෙමි, පිළිතුර කෙටි හා නිරවද්‍ය ය. තව ටිකක් විස්තර අවශ්‍යයි :)
ඔඩ්මාර් වේල්ල

D ඔඩ්මාර් වේල්ල, මම ඒවා වරහන් වලින් ගණන් බැලුවෙමි. උදාහරණයක් ලෙස මෙය විය හැකිය ( dotnetfiddle.net/SFWC1d )
ටෙඩ් මුකුසානි

මාර්ගය වන විට, ඔබගේ මෙම පිළිතුර ඉතා ප්රයෝජනවත් බව පෙනේ. මම එය ඉහළට ඔසවා තබමි.
ටෙඩ් මුකුසානි

2

ගුණාංග යනු විශේෂිත පංතියේ සාමාජිකයෙකි, දේපල වලදී අපි කලින් නියම කළ කට්ටලයක් හෝ ලබා ගැනීමේ ක්‍රමයක් භාවිතා කරමු. ඔවුන් පුද්ගලික ක්ෂේත්‍රවල අගයන් කියවීමට, ලිවීමට හෝ වෙනස් කිරීමට හැකි ප්‍රවේශයන් භාවිතා කරයි.

උදාහරණයක් ලෙස, Employeeනම, වයස සහ සේවක_අයිඩී සඳහා පුද්ගලික ක්ෂේත්‍ර සමඟ නම් කරන ලද පන්තියක් ගනිමු . පංතියට පිටතින් අපට මෙම ක්ෂේත්‍ර වෙත ප්‍රවේශ විය නොහැක, නමුත් අපට දේපල හරහා මෙම පුද්ගලික ක්ෂේත්‍ර වෙත පිවිසිය හැකිය.

අපි දේපල භාවිතා කරන්නේ ඇයි?

පවරා ඇති සහ ආපසු ලබා දෙන දේ ඔබට පාලනය කළ නොහැකි බැවින් පන්ති ක්ෂේත්‍රය ප්‍රසිද්ධ කිරීම සහ එය නිරාවරණය කිරීම අවදානම් සහගත ය.

උදාහරණයකින් මෙය පැහැදිලිව වටහා ගැනීම සඳහා හැඳුනුම්පත, මුරපදය, නම ඇති ශිෂ්‍ය පන්තියක් ගැනීමට ඉඩ දෙයි. දැන් මෙම උදාහරණයේ දී පොදු ක්ෂේත්‍රයේ යම් ගැටළුවක්

  • හැඳුනුම්පත -ve නොවිය යුතුය.
  • නම ශුන්‍ය ලෙස සැකසිය නොහැක
  • පාස් ලකුණ කියවිය යුත්තේ පමණි.
  • ශිෂ්‍යයාගේ නම අස්ථානගත වී ඇත්නම් නමක් ආපසු ලබා නොදිය යුතුය.

මෙම ගැටළුව ඉවත් කිරීම සඳහා අපි Get සහ set ක්‍රමය භාවිතා කරමු.

// 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;
    }
}

2

අතිරේක තොරතුරු: පෙරනිමියෙන්, ලබා ගන්න සහ සකසන්න ප්‍රවේශකයන්ට දේපල මෙන් ම ප්‍රවේශ විය හැකිය. ඔබට ප්‍රවේශවීමේ ප්‍රවේශය තනි තනිව පාලනය කිරීමට / සීමා කිරීමට (ලබා ගැනීමට සහ සැකසීමට) ඒවා මත වඩාත් සීමිත ප්‍රවේශ විකරණකාරක යෙදීමෙන්.

උදාහරණයක්:

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

මෙහි ලබා ගැනීම තවමත් ප්‍රසිද්ධියේ ප්‍රවේශ වේ (දේපල පොදු බැවින්), නමුත් කට්ටලය ආරක්‍ෂා කර ඇත (වඩා සීමිත ප්‍රවේශ පිරිවිතරයක්).


2

ක්ෂේත්‍රය නිරාවරණය කිරීම සඳහා ගුණාංග භාවිතා වේ. ඔවුන් පුද්ගලික ක්ෂේත්‍රවල අගයන් කියවීමට, ලිවීමට හෝ හැසිරවීමට හැකි ප්‍රවේශයන් (සැකසීම, ලබා ගැනීම) භාවිතා කරයි.

දේපල ගබඩා ස්ථාන නම් නොකරයි. ඒ වෙනුවට, ඔවුන්ගේ අගයන් කියවීමට, ලිවීමට හෝ ගණනය කිරීමට ප්‍රවේශයන් ඇත.

ගුණාංග භාවිතා කරමින් අපට ක්ෂේත්‍රයක සකසා ඇති දත්ත වර්ගය මත වලංගුකරණය සැකසිය හැකිය.

නිදසුනක් ලෙස අපට පෞද්ගලික නිඛිල ක්ෂේත්‍ර වයස් සීමාවක් ඇති අතර වයස negative ණ විය නොහැකි බැවින් ධනාත්මක අගයන්ට ඉඩ දිය යුතුය.

අපට මෙය ක්‍රම දෙකකින් ලබා ගත හැකිය.

 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()
       }
    }

ස්වයංක්‍රීයව ක්‍රියාත්මක කරන ලද දේපල අප ලබා ගැනීමේදී තර්කානුකූල නොවන්නේ නම් සහ අපට ස්වයංක්‍රීයව ක්‍රියාත්මක කළ දේපල භාවිතා කළ හැකිය.

ඔබ විට ස්වයංක්රීය-ක්රියාත්මක දේපල සථායිතාව දකින්නේ පෞද්ගලික, නිර්නාමික ක්ෂේත්රය මගින් ලබා ගැනීමට හා කට්ටලයක් accessors තුළින් පමණක් ප්රවේශ විය හැකි බව.

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; }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.