C # හි, දේපලකට වඩා ක්ෂේත්රයක් වෙනස් වන්නේ කුමක් ද, දේපලක් වෙනුවට ක්ෂේත්රයක් භාවිතා කළ යුත්තේ කවදාද?
C # හි, දේපලකට වඩා ක්ෂේත්රයක් වෙනස් වන්නේ කුමක් ද, දේපලක් වෙනුවට ක්ෂේත්රයක් භාවිතා කළ යුත්තේ කවදාද?
Answers:
ගුණාංග ක්ෂේත්ර නිරාවරණය කරයි. ක්ෂේත්ර (සෑම විටම පාහේ) පන්තියකට පුද්ගලිකව තබා ගත යුතු අතර ලබා ගත හැකි සහ සැකසූ දේපල හරහා ප්රවේශ විය යුතුය. ඔබේ පන්තිය භාවිතා කරන දේවලින් ඒවාට ප්රවේශ වන බාහිර මාර්ගයට බලපෑම් නොකරන අතරම ගුණාංග වෙනස් කිරීමට ගුණාංග ඔබට ඉඩ සලසයි.
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 පෙන්වා දෙයි.
string
, මගේ කොන්ත්රාත්තුව: b 2 බිල් දිග දක්වා ඕනෑම අක්ෂර පවරන්න. දේපලක් නම් DateTime
, මගේ කොන්ත්රාත්තුව නම්: මට සොයා බැලිය හැකි ඩේටයිම් හි සීමාවන් තුළ ඕනෑම අංකයක් යොදන්න. නිර්මාතෘ විසින් සැකසුම්කරුවන්ට අවහිරතා එකතු කරන්නේ නම්, එම සීමාවන් සන්නිවේදනය නොකෙරේ. එහෙත්, ඒ වෙනුවට, එහි නිර්මාපකයාගේ සිට වර්ගය වෙනස් කරනවා නම් string
කිරීමට Surname
, ඔවුන්ගේ නව වාසගම පන්තිය සීමාවන් සන්නිවේදනය, සහ දේපළ public Surname LastName
පන්දු පිරිනමන්නා වලංගු නැත. එසේම, Surname
නැවත භාවිතා කළ හැකිය.
Surname
මගේ උදාහරණයේ දී, නැවත භාවිතා කළ හැකි බැවින් , එම වලංගු කිරීම් දේපල කට්ටලයක කේතයේ වෙනත් ස්ථානවලට පිටපත් කිරීම / ඇලවීම ගැන ඔබ පසුව කරදර විය යුතු නැත. වාසගම සඳහා වලංගු භාවය ස්ථාන කිහිපයක තිබේදැයි ඔබ කල්පනා නොකරයි. අගය වස්තු ගැන මා පළ කළ සබැඳිය බලන්න
වස්තු දිශානත ක්රමලේඛන මූලධර්ම පවසන පරිදි, පන්තියක අභ්යන්තර කටයුතු බාහිර ලෝකයෙන් සැඟවිය යුතුය. ඔබ ක්ෂේත්රයක් නිරාවරණය කරන්නේ නම් ඔබ සාරාංශයක් ලෙස පන්තියේ අභ්යන්තර ක්රියාත්මක කිරීම හෙළි කරයි. එබැවින් අප මත පදනම්ව කේත කඩ නොකර ක්රියාත්මක කිරීම වෙනස් කිරීමේ හැකියාව ලබා දීම සඳහා අපි ගුණාංග (හෝ ජාවා නඩුවේ ක්රම) සමඟ ක්ෂේත්ර ඔතා. අපට දේපල තුළ තර්කනය තැබිය හැකි බව දැකීම අපට අවශ්ය නම් වලංගු කිරීමේ තර්කනය යනාදිය සිදු කිරීමට ඉඩ දෙයි. 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
}
public int myVar { get; set; }
සැබවින්ම අදහස් කරන්නේ කුමක්ද යන්න ග්රහණය කර ගැනීම තවමත් දුෂ්කර විය හැකිය (තවද එය හේතුව යැයි මම සිතමි මෙම ප්රශ්නයට ලැබෙන පහර වලින් අවම වශයෙන් 50% ක් සඳහා).
virtual
එය වස්තු-නැඹුරු වැඩසටහන්කරණයේ කොටසකි.
virtual
OOP අමතන්නේ නැහැ . එය බහුඅවයවිකතාව සක්රීය කරන මෙවලමක් වන අතර එය OOP සක්රීය කළ හැකි ප්රධාන මෙවලම්වලින් එකකි. එය OOP තුළ සහ තමා තුළම නොවේ, සහ පොදු ස්වයං පාලනයක් පිළිබඳ සහජයෙන්ම OOP කිසිවක් නොමැත. OOP සම්බන්ධ පරාවර්තනය හෝ දත්ත සමුදාය වැනි දේවල් මම ගණන් නොගන්නෙමි. සාමාන්යයෙන් මම ඒ ගැන එතරම් තැකීමක් නොකරමි, නමුත් පිළිතුරෙහි OO මූලධර්ම කේත උදාහරණයේ ගාමක බලය ලෙස සඳහන් කර ඇති අතර මම එයට එකඟ නොවෙමි.
වැදගත් වෙනසක් වන්නේ අතුරුමුහුණත් වලට ගුණාංග තිබිය හැකි නමුත් ක්ෂේත්ර නොවේ. මෙය මට අවධාරණය කරන්නේ පන්තියේ පොදු අතුරුමුහුණත නිර්වචනය කිරීම සඳහා ගුණාංග භාවිතා කළ යුතු අතර ක්ෂේත්රයන් යනු පන්තියක පුද්ගලික, අභ්යන්තර කටයුතු සඳහා භාවිතා කිරීමට අදහස් කරන බවයි. රීතියක් ලෙස මම කලාතුරකින් පොදු ක්ෂේත්ර නිර්මාණය කරන අතර ඒ හා සමානව මම පොදු නොවන දේපල නිර්මාණය කරන්නේ කලාතුරකිනි.
ගියර් හැරවිය හැකි ගුණාංග භාවිතා කිරීම පිළිබඳ උදාහරණ කිහිපයක් මම ඔබට දෙන්නම්:
දේපල භාවිතා කිරීමෙන්, දේපලෙහි වටිනාකම වෙනස් වූ විට (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);
}
}
ඔවුන්ගෙන් බොහෝ දෙනෙක් සිට තාක්ෂණික වාසි සහ අවාසි සමග පැහැදිලි කර 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;
}
}
ඒ ක්ෂේත්රයේ පන්ති හෝ struct සෘජුවම ප්රකාශ කරන බව විචල්ය වේ. පංතියකට හෝ ව්යුහයකට නිදර්ශන ක්ෂේත්ර හෝ ස්ථිතික ක්ෂේත්ර හෝ දෙකම තිබිය හැකිය. සාමාන්යයෙන්, ඔබ ක්ෂේත්ර භාවිතා කළ යුත්තේ පුද්ගලික හෝ ආරක්ෂිත ප්රවේශයක් ඇති විචල්යයන් සඳහා පමණි . ඔබේ පන්තිය සේවාදායක කේතයට නිරාවරණය වන දත්ත ලබා දිය යුත්තේ ක්රම, ගුණාංග මගිනි සහ දර්ශක . අභ්යන්තර ක්ෂේත්ර වෙත වක්රව පිවිසීම සඳහා මෙම ඉදිකිරීම් භාවිතා කිරීමෙන්, ඔබට අවලංගු ආදාන අගයන්ගෙන් ආරක්ෂා විය හැකිය.
ඒ දේපල , ලිවීම් කියවීමට හෝ පෞද්ගලික ක්ෂේත්රයේ අගය ගණනය නම්යශීලී යාන්ත්රණයක් සම්පාදනය කරන සාමාජිකයෙකි. ඔවුන් පොදු දත්ත සාමාජිකයන් නම් දේපළ භාවිතා කළ හැක, නමුත් ඔවුන් ඇත්තටම ඊනියා විශේෂ ක්රම accessors . මෙමඟින් දත්ත පහසුවෙන් ප්රවේශ විය හැකි අතර ක්රමවේදයන්ගේ ආරක්ෂාව සහ නම්යතාවය ප්රවර්ධනය කිරීමට උපකාරී වේ. ක්රියාවට නැංවීමේ හෝ සත්යාපන කේතය සඟවන අතරම, වටිනාකම් ලබා ගැනීමේ සහ සැකසීමේ පොදු ක්රමයක් හෙළි කිරීමට ගුණාංග පන්තියට ඉඩ දෙයි. දේපල වටිනාකම ආපසු ලබා ගැනීම සඳහා Get property accessor භාවිතා කරන අතර නව අගයක් පැවරීම සඳහා set accessor භාවිතා කරයි.
වස්තුවක පොදු අතුරුමුහුණත නොබලා ප්රවේශ වන ආකාරය වෙනස් කිරීමට ඔබට ඉඩ දීමේ මූලික වාසිය ගුණාංගවලට ඇත. උදාහරණයක් ලෙස, ඔබට අමතර වලංගු භාවයක් එක් කිරීමට අවශ්ය නම්, හෝ ගබඩා කළ ක්ෂේත්රයක් ගණනය කිරීමකට වෙනස් කිරීමට නම්, ඔබ මුලින් ක්ෂේත්රය දේපලක් ලෙස නිරාවරණය කළහොත් ඔබට එය පහසුවෙන් කළ හැකිය. ඔබ කෙලින්ම ක්ෂේත්රයක් නිරාවරණය කළහොත්, නව ක්රියාකාරිත්වය එක් කිරීම සඳහා ඔබේ පන්තියේ පොදු අතුරු මුහුණත වෙනස් කළ යුතුය. එම වෙනස පවත්නා සේවාදායකයින් බිඳ දමනු ඇති අතර, ඔවුන් ඔබේ කේතයේ නව අනුවාදය භාවිතා කිරීමට පෙර ඒවා නැවත සකස් කිරීම අවශ්ය වේ.
පුළුල් පරිභෝජනය සඳහා නිර්මාණය කර ඇති පන්ති පුස්තකාලයක් ඔබ ලියන්නේ නම් (මිලියන සංඛ්යාත ජනතාවක් භාවිතා කරන .NET Framework වැනි), එය ගැටළුවක් විය හැකිය. කෙසේ වෙතත්, ඔබ කුඩා කේත පදනමක් තුළ අභ්යන්තරව භාවිතා කරන පන්තියක් ලියන්නේ නම් (<= 50 K රේඛා කියන්න), එය ඇත්ත වශයෙන්ම ලොකු දෙයක් නොවේ, මන්ද ඔබේ වෙනස්වීම් කිසිවෙකුට අහිතකර ලෙස බලපාන්නේ නැත. එවැනි අවස්ථාවකදී එය සැබවින්ම පුද්ගලික මනාපයන් වෙතට පැමිණේ.
ගුණාංග අසමමිතික ප්රවේශයට සහය දක්වයි, එනම් ඔබට ලබා ගන්නෙකු සහ කට්ටලයක් හෝ දෙකෙන් එකක් පමණක් තිබිය හැකිය. ඒ හා සමානව ගුණාංග ලබා ගන්නා / සැකසුම් සඳහා තනි ප්රවේශයට සහාය වේ. ක්ෂේත්ර සෑම විටම සමමිතික වේ, එනම් ඔබට සෑම විටම අගය ලබා ගැනීමට සහ සැකසීමට හැකිය. මෙයට ව්යතිරේකය කියවීමෙන් පමණක් ක්ෂේත්ර වන අතර එය ආරම්භ කිරීමෙන් පසු සැකසිය නොහැක.
දේපල ඉතා දිගු කාලයක් ධාවනය විය හැකිය, අතුරු ආබාධ ඇති විය හැකිය, සහ ව්යතිරේකයන් පවා විසි කළ හැකිය. ක්ෂේත්ර වේගවත් වන අතර කිසිදු අතුරු ආබාධයක් නොමැති අතර කිසි විටෙකත් ව්යතිරේකයන් විසි නොකරනු ඇත. අතුරු ආබාධ හේතුවෙන් දේපලක් සෑම ඇමතුමකටම වෙනස් අගයක් ලබා දිය හැකිය (DateTime.Now, එනම් DateTime.Now සෑම විටම DateTime.Now ට සමාන නොවේ). ක්ෂේත්ර සෑම විටම එකම අගය ලබා දෙයි.
පිටත / ref පරාමිතීන් සඳහා ක්ෂේත්ර භාවිතා කළ හැකිය, ගුණාංග නොතිබිය හැකිය. ගුණාංග අතිරේක තර්කනයට සහය දක්වයි - මෙය වෙනත් දේ අතර කම්මැලි පැටවීම ක්රියාත්මක කිරීමට භාවිතා කළ හැකිය.
ගුණාංග ලබා ගැනීම / සැකසීම යන්නෙන් අදහස් කරන ඕනෑම දෙයක් සංක්ෂිප්ත කිරීමෙන් ගුණාංග වියුක්ත මට්ටමකට සහාය වේ.
බොහෝ / සෑම අවස්ථාවකම ගුණාංග භාවිතා කරන්න, නමුත් අතුරු ආබාධ වළක්වා ගැනීමට උත්සාහ කරන්න.
පසුබිම තුළ දේපලක් ක්රමයට සම්පාදනය කෙරේ. එබැවින් Name
දේපලක් සම්පාදනය කරනු ලබන්නේ get_Name()
සහ set_Name(string value)
. ඔබ සම්පාදනය කළ කේතය අධ්යයනය කරන්නේ නම් ඔබට මෙය දැක ගත හැකිය. එබැවින් ඒවා භාවිතා කරන විට ඉහළින් (ඉතා) කුඩා කාර්ය සාධනයක් ඇත. ඔබ ක්ෂේත්රයක් පිටතින් නිරාවරණය කරන්නේ නම් සාමාන්යයෙන් ඔබ සැමවිටම දේපලක් භාවිතා කරනු ඇති අතර, වටිනාකම වලංගු කිරීම අවශ්ය නම් ඔබ එය බොහෝ විට අභ්යන්තරව භාවිතා කරනු ඇත.
ක්ෂේත්ර සහ ගුණාංග එකිනෙකට සමාන බව පෙනුනද ඒවා සම්පූර්ණයෙන්ම වෙනස් භාෂා අංග 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 කින් කළ හැකිය.
මෙන්න පොදු ක්ෂේත්ර භාවිතා කරන පන්තියක්.
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;
කේතය වලංගු වේ, සියලු පැවරුම් තර්කානුකූල නොවන නමුත් ක්රියාත්මක වේ. Age
negative ණ අගයක් ඇති අතර 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());
}
}
}
පන්තියේ යාවත්කාලීන කළ අනුවාදයට පහත වාසි ඇත.
FullName
සහ YearOfBirth
අවලංගු අගයන් සඳහා පරීක්ෂා කරනු ලැබේ.Age
ලිවිය නොහැක. එය YearOfBirth
වර්තමාන වර්ෂයේ සිට ගණනය කර ඇත .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;
}
}
}
එබැවින්, ඔබට පෙනෙන පරිදි, සම්පාදකයා තවමත් අගයන් ගබඩා කිරීම සඳහා ක්ෂේත්ර භාවිතා කරයි - වස්තු තුළ අගයන් ගබඩා කරන්නේ කෙසේද යන්න ක්ෂේත්ර පමණක් වන බැවින්.
ඔබට පෙනෙන පරිදි, දේපල හා ක්ෂේත්ර වලට සමාන භාවිත සින්ටැක්ස් තිබුණද ඒවා බෙහෙවින් වෙනස් සංකල්ප වේ. ඔබ ස්වයංක්රීය ගුණාංග හෝ සිදුවීම් භාවිතා කළත් - සැඟවුණු ක්ෂේත්ර ජනනය කරනු ලබන්නේ සැබෑ දත්ත ගබඩා කර ඇති සම්පාදකයා විසිනි.
ඔබට ක්ෂේත්ර වටිනාකමක් බාහිර ලෝකයට ලබා දීමට අවශ්ය නම් (ඔබේ පන්තියේ පරිශීලකයින්) පොදු හෝ ආරක්ෂිත ක්ෂේත්ර භාවිතා නොකරන්න. ක්ෂේත්ර සෑම විටම පුද්ගලික ලෙස සලකුණු කළ යුතුය. ගුණාංග මඟින් ඔබට වටිනාකම් පරීක්ෂා කිරීම, හැඩතල ගැන්වීම, පරිවර්තනය කිරීම ආදිය කළ හැකි අතර සාමාන්යයෙන් ඔබේ කේතය ආරක්ෂිත, කියවිය හැකි සහ අනාගත වෙනස් කිරීම් සඳහා පුළුල් කළ හැකිය.
ඔබේ පුද්ගලික විචල්යය (ක්ෂේත්රය) වෙනත් පංති වලින් ඔබේ පන්තියේ වස්තුවට ප්රවේශ වීමට ඔබට අවශ්ය වූ විට එම විචල්යයන් සඳහා ගුණාංග නිර්මාණය කළ යුතුය.
උදාහරණයක් ලෙස මට "හැඳුනුම්පත" සහ "නම" ලෙස නම් කර ඇති විචල්යයන් තිබේ නම් එය පුද්ගලික වන නමුත් පන්තියට පිටතින් කියවීමට / ලිවීමට මෙම විචල්යය අවශ්ය වන තත්වයක් තිබිය හැකිය. එම අවස්ථාවෙහිදී, දේපල සඳහා අර්ථ දක්වා ඇති / කට්ටලය මත පදනම්ව එම විචල්යය කියවීමට / ලිවීමට දේපල මට උපකාර කරයි. දේපලක් කියවීමට / ලිවීමට පමණක් / කියවීමට ලිවිය හැකිය.
මෙන්න නිරූපණය
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";
}
}
මෙහි ඇති දෙවන ප්රශ්නය, “දේපලක් වෙනුවට ක්ෂේත්රයක් භාවිතා කළ යුත්තේ කවදාද?”, මෙම අනෙක් පිළිතුරෙහි කෙටියෙන් ස්පර්ශ වන අතර මෙයද කාරුණික ය , නමුත් එතරම් විස්තරාත්මක නොවේ.
පොදුවේ ගත් කල, අනෙක් සියලුම පිළිතුරු හොඳ නිර්මාණයක් පිළිබඳ අවධානය යොමු කරයි: නිරාවරණය වන ක්ෂේත්රවලට වඩා ගුණාංග නිරාවරණය කිරීමට කැමැත්තක් දක්වන්න. සමහර විට ඔබ නොවන අතර නිතිපතා ඔබ "වාව්, මට ඕන කරන දේවල් වෙනුවට දේපළ මෙම ක්ෂේත්ර සාදන නම් කොපමණ වඩාත් නරක අතට හැරෙනු ඇති බවත් උපකල්පනය කරන්න" කියා සොයා, ඒක ගොඩක් , ඔබ "වාව් කියන්නේ ඇති තත්වය ගැන හිතන්න වැඩි දුර්ලභ දෙවියන්ට ස්තූතියි මම දේපලක් වෙනුවට මෙහි ක්ෂේත්රයක් භාවිතා කළා. ”
නමුත් ක්ෂේත්රවලට ගුණාංගවලට වඩා එක් වාසියක් ඇත, එය "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" පරාමිතීන් ගන්නා ඇමතුම් වල නිතිපතා භාවිතා කිරීමට අවශ්ය නම්, විශේෂයෙන් සරල අගය වර්ගයක් විය හැකි, කිසියම් අගය එකතු කළ අංගයක් කිසි විටෙකත් අවශ්ය නොවනු ඇත, තර්කයක් ඉදිරිපත් කළ හැකිය.
එසේම, ගුණාංග මඟින් අගයන් සැකසීමේදී තර්කනය භාවිතා කිරීමට ඉඩ ලබා දේ.
එබැවින් ඔබට අවශ්ය වන්නේ පූර්ණ සංඛ්යා ක්ෂේත්රයකට අගයක් සැකසීමට පමණක් බව ඔබට කිව හැකිය, අගය x ට වඩා වැඩි නම්, එසේ නොමැතිනම් ව්යතිරේකයක් දමන්න.
සැබවින්ම ප්රයෝජනවත් අංගයකි.
ඔබ නූල් ප්රාථමික භාවිතා කිරීමට යන්නේ නම් ඔබට ක්ෂේත්ර භාවිතා කිරීමට බල කෙරෙයි. ගුණාංගවලට ඔබේ නූල් කේතය බිඳ දැමිය හැකිය. ඒ හැරුණු විට කෝරි පැවසූ දේ නිවැරදි ය.
(මෙය සැබවින්ම අදහස් දැක්වීමක් විය යුතුය, නමුත් මට අදහසක් පළ කළ නොහැක, එබැවින් එය තනතුරක් ලෙස නුසුදුසු නම් කරුණාකර සමාවෙන්න).
මම වරක් නිර්දේශිත පරිචය වූ ස්ථානයක සේවය කළෙමි. දේපල වෙනුවට පොදු ක්ෂේත්ර භාවිතා කිරීම සමාන දේපල ඩෙෆ් යන්තම් ක්ෂේත්රයකට පිවිසෙනු ඇත.
get { return _afield; }
set { _afield = value; }
ඔවුන්ගේ තර්කය වූයේ අනාගතයේදී අවශ්ය නම් පොදු ක්ෂේත්රය දේපලක් බවට පරිවර්තනය කළ හැකි බවයි. එකල මට ටිකක් අමුතු බවක් පෙනෙන්නට තිබුණි. මෙම තනතුරු අනුව විනිශ්චය කිරීම, මෙහි බොහෝ දෙනෙක් එකඟ නොවන බව පෙනේ. දේවල් වෙනස් කිරීමට උත්සාහ කිරීමට ඔබ කුමක් පැවසිය හැකිද?
සංස්කරණය කරන්න: මෙම ස්ථානයේ ඇති සියලුම කේත පදනම එකවර සම්පාදනය කර ඇති බව මම එකතු කළ යුතුය, එබැවින් පංතිවල පොදු අතුරු මුහුණත වෙනස් කිරීම (පොදු ක්ෂේත්රයක් දේපලක් බවට පත් කිරීමෙන්) ගැටලුවක් නොවන බව ඔවුන් සිතන්නට ඇත.
තාක්ෂණිකව, වෙනසක් ඇතැයි මම නොසිතමි, මන්ද දේපල යනු පරිශීලකයා විසින් නිර්මාණය කරන ලද හෝ සම්පාදකයා විසින් ස්වයංක්රීයව නිර්මාණය කරන ලද ක්ෂේත්රයන් වටා එතීමකි. දේපලවල අරමුණ වන්නේ සංසරණය බලාත්මක කිරීම සහ සැහැල්ලු ක්රමයට සමාන අංගයක් ඉදිරිපත් කිරීමයි. ක්ෂේත්ර පොදු ලෙස ප්රකාශ කිරීම නරක පුරුද්දකි, නමුත් එයට කිසිදු ගැටළුවක් නොමැත.
ක්ෂේත්ර යනු සාමාන්ය සාමාජික විචල්යයන් හෝ පන්තියක සාමාජික අවස්ථා ය. ගුණාංග යනු ඒවායේ අගයන් ලබා ගැනීමට සහ සැකසීමට වියුක්ත කිරීමකි . ඔබ පංතියේ ක්ෂේත්රයක් පුද්ගලිකව නිරාවරණය කරන්නේ නම් ක්ෂේත්රයක් වෙනස් කිරීමට සහ ලබා ගැනීමට ක්රමයක් ඉදිරිපත් කරන බැවින් දේපල ප්රවේශයන් ලෙසද හැඳින්වේ. පොදුවේ ගත් කල, ඔබ ඔබේ සාමාජික විචල්යයන් පුද්ගලික ලෙස ප්රකාශ කළ යුතු අතර, පසුව ඒවා සඳහා ගුණාංග ප්රකාශ කිරීම හෝ අර්ථ දැක්වීම කළ යුතුය.
class SomeClass
{
int numbera; //Field
//Property
public static int numbera { get; set;}
}
ගුණාංග ක්ෂේත්රයන් ආවරණය කරයි, එමඟින් සැකසීමට හෝ ලබා ගැනීමට ඇති වටිනාකම පිළිබඳ අතිරේක සැකසුම් සිදු කිරීමට ඔබට හැකි වේ. ඔබ ක්ෂේත්ර වටිනාකම පිළිබඳ පූර්ව හෝ පසු සැකසුම් කිරීමක් නොකරන්නේ නම් සාමාන්යයෙන් දේපල භාවිතා කිරීම අධික ලෙස මරා දැමීමකි.
IMO, Properties යනු අප කලින් භාවිතා කළ "SetXXX ()" GetXXX () "කාර්යයන් / ක්රම / අතුරුමුහුණත් යුගල පමණි, නමුත් ඒවා වඩාත් සංක්ෂිප්ත හා අලංකාර වේ.
සාම්ප්රදායිකව පුද්ගලික ක්ෂේත්ර සැකසෙන්නේ ගෙටර් සහ සෙටර් ක්රම හරහා ය. අඩු කේතයක් සඳහා ඔබට ඒ වෙනුවට ක්ෂේත්ර සැකසීමට ගුණාංග භාවිතා කළ හැකිය.
ඔබට "කාර්" පන්තියක් ඇති විට. ගුණාංග වර්ණය, හැඩය ..
ක්ෂේත්ර ලෙස විචල්යයන් පන්තියක විෂය පථය තුළ අර්ථ දක්වා ඇත.
විකිපීඩියාවෙන් - වස්තු-නැඹුරු වැඩසටහන්කරණය :
වස්තු-නැඹුරු වැඩසටහන්කරණය (OOP) යනු “වස්තු” යන සංකල්පය මත පදනම් වූ ක්රමලේඛන ආදර්ශයකි, ඒවා දත්ත අඩංගු දත්ත ව්යුහයන් වන අතර ඒවා ක්ෂේත්ර ස්වරූපයෙන් බොහෝ විට ගුණාංග ලෙස හැඳින්වේ; සහ කේතය ක්රියා පටිපාටි ස්වරූපයෙන් බොහෝ විට ක්රම ලෙස හැඳින්වේ . (අවධාරණය එකතු කරන ලදි)
ගුණාංග ඇත්ත වශයෙන්ම වස්තුවක හැසිරීමේ කොටසකි, නමුත් නිර්මාණය කර ඇත්තේ වස්තුවේ පාරිභෝගිකයින්ට වස්තුවේ දත්ත සමඟ වැඩ කිරීමේ මිත්යාව / සාරාංශය ලබා දීම සඳහා ය.
ක්ෂේත්රයක් පිළිබඳ මගේ සැලසුම නම් ක්ෂේත්රයක් වෙනස් කළ යුත්තේ එහි මවුපියන් විසින් පමණි, එබැවින් පන්තිය. ප්රති 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;
}
}
මේ ගැන සිතා බලන්න: ඔබට මෙම කාමරයට ඇතුළු වීමට කාමරයක් හා දොරක් තිබේ. ඔබට පැමිණෙන්නේ කවුරුන්ද යන්න පරීක්ෂා කර ඔබගේ කාමරය සුරක්ෂිත කර ගැනීමට අවශ්ය නම්, ඔබ දේපල භාවිතා කළ යුතුය. එසේ නොමැතිනම් ඒවා කිසිදු දොරක් නොවනු ඇති අතර සෑම කෙනෙකුම පහසුවෙන් ඕනෑම රෙගුලාසියකට පැමිණේ.
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";
දැන් ඔබ එම පුද්ගලයා පරීක්ෂා කර ඔහු සමඟ යම්කිසි නපුරක් ඇත්දැයි දැන ගන්න
ක්ෂේත්ර යනු පන්තිවල විචල්යයන් වේ. ක්ෂේත්ර යනු ඔබට ප්රවේශ විකරණකාරක භාවිතයෙන් සංයුක්ත කළ හැකි දත්ත වේ.
ගුණාංග ක්ෂේත්රයන්ට සමාන වන අතර එමඟින් ඒවා රාජ්යයන් සහ වස්තුවක් හා සම්බන්ධ දත්ත අර්ථ දක්වයි.
ක්ෂේත්රයක් මෙන් නොව, දේපලකට විශේෂ වාක්ය ඛණ්ඩයක් ඇත, එය පුද්ගලයෙකු දත්ත කියවන ආකාරය සහ දත්ත ලියන ආකාරය පාලනය කරයි, මේවා හැඳින්වෙන්නේ ක්රියාකරවන්නන් ලෙසිනි. කට්ටල තර්කනය බොහෝ විට වලංගු කිරීම සඳහා භාවිතා කළ හැකිය.
මූලික හා සාමාන්ය වෙනස:
ක්ෂේත්ර
දේපළ
ගුණාංග යනු විශේෂිත පංතියේ සාමාජිකයෙකි, දේපල වලදී අපි කලින් නියම කළ කට්ටලයක් හෝ ලබා ගැනීමේ ක්රමයක් භාවිතා කරමු. ඔවුන් පුද්ගලික ක්ෂේත්රවල අගයන් කියවීමට, ලිවීමට හෝ වෙනස් කිරීමට හැකි ප්රවේශයන් භාවිතා කරයි.
උදාහරණයක් ලෙස, Employee
නම, වයස සහ සේවක_අයිඩී සඳහා පුද්ගලික ක්ෂේත්ර සමඟ නම් කරන ලද පන්තියක් ගනිමු . පංතියට පිටතින් අපට මෙම ක්ෂේත්ර වෙත ප්රවේශ විය නොහැක, නමුත් අපට දේපල හරහා මෙම පුද්ගලික ක්ෂේත්ර වෙත පිවිසිය හැකිය.
අපි දේපල භාවිතා කරන්නේ ඇයි?
පවරා ඇති සහ ආපසු ලබා දෙන දේ ඔබට පාලනය කළ නොහැකි බැවින් පන්ති ක්ෂේත්රය ප්රසිද්ධ කිරීම සහ එය නිරාවරණය කිරීම අවදානම් සහගත ය.
උදාහරණයකින් මෙය පැහැදිලිව වටහා ගැනීම සඳහා හැඳුනුම්පත, මුරපදය, නම ඇති ශිෂ්ය පන්තියක් ගැනීමට ඉඩ දෙයි. දැන් මෙම උදාහරණයේ දී පොදු ක්ෂේත්රයේ යම් ගැටළුවක්
මෙම ගැටළුව ඉවත් කිරීම සඳහා අපි 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;
}
}
අතිරේක තොරතුරු: පෙරනිමියෙන්, ලබා ගන්න සහ සකසන්න ප්රවේශකයන්ට දේපල මෙන් ම ප්රවේශ විය හැකිය. ඔබට ප්රවේශවීමේ ප්රවේශය තනි තනිව පාලනය කිරීමට / සීමා කිරීමට (ලබා ගැනීමට සහ සැකසීමට) ඒවා මත වඩාත් සීමිත ප්රවේශ විකරණකාරක යෙදීමෙන්.
උදාහරණයක්:
public string Name
{
get
{
return name;
}
protected set
{
name = value;
}
}
මෙහි ලබා ගැනීම තවමත් ප්රසිද්ධියේ ප්රවේශ වේ (දේපල පොදු බැවින්), නමුත් කට්ටලය ආරක්ෂා කර ඇත (වඩා සීමිත ප්රවේශ පිරිවිතරයක්).
ක්ෂේත්රය නිරාවරණය කිරීම සඳහා ගුණාංග භාවිතා වේ. ඔවුන් පුද්ගලික ක්ෂේත්රවල අගයන් කියවීමට, ලිවීමට හෝ හැසිරවීමට හැකි ප්රවේශයන් (සැකසීම, ලබා ගැනීම) භාවිතා කරයි.
දේපල ගබඩා ස්ථාන නම් නොකරයි. ඒ වෙනුවට, ඔවුන්ගේ අගයන් කියවීමට, ලිවීමට හෝ ගණනය කිරීමට ප්රවේශයන් ඇත.
ගුණාංග භාවිතා කරමින් අපට ක්ෂේත්රයක සකසා ඇති දත්ත වර්ගය මත වලංගුකරණය සැකසිය හැකිය.
නිදසුනක් ලෙස අපට පෞද්ගලික නිඛිල ක්ෂේත්ර වයස් සීමාවක් ඇති අතර වයස 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; }
}