const
හා readonly
සමාන වේ, නමුත් ඔවුන් හරියටම එම නැත.
ඒ const
ක්ෂේත්රය, වටිනාකම සම්පාදනය කාලීන ගණනය කළ හැකි බව, එහි තේරුම බැදීමකට-කාල නියතය වේ. ඒ readonly
ක්ෂේත්රයේ යම් කේතය වර්ගය ඉදි තුළ ක්රියාත්මක කළ යුතු අතිරේක අවස්ථාවන්හීදී හැකියාව ලබා දෙයි. ඉදිකිරීමෙන් පසු readonly
ක්ෂේත්රයක් වෙනස් කළ නොහැක.
උදාහරණයක් ලෙස, const
සාමාජිකයන් වැනි සාමාජිකයින් අර්ථ දැක්වීමට භාවිතා කළ හැකිය:
struct Test
{
public const double Pi = 3.14;
public const int Zero = 0;
}
3.14 සහ 0 වැනි අගයන් සම්පාදක කාල නියතයන් බැවින්. කෙසේ වෙතත්, ඔබ වර්ගයක් නිර්වචනය කර එහි පූර්ව-ෆැබ් අවස්ථා කිහිපයක් සැපයීමට අවශ්ය අවස්ථාව සලකා බලන්න. උදා: ඔබට වර්ණ පංතියක් නිර්වචනය කර කළු, සුදු වැනි පොදු වර්ණ සඳහා “නියතයන්” සැපයීමට අවශ්ය විය හැකිය. දකුණු පැත්තේ සම්පාදක කාල නියතයන් නොවන බැවින් නියත සාමාජිකයන් සමඟ මෙය කළ නොහැක. සාමාන්ය ස්ථිතික සාමාජිකයන් සමඟ කෙනෙකුට මෙය කළ හැකිය:
public class Color
{
public static Color Black = new Color(0, 0, 0);
public static Color White = new Color(255, 255, 255);
public static Color Red = new Color(255, 0, 0);
public static Color Green = new Color(0, 255, 0);
public static Color Blue = new Color(0, 0, 255);
private byte red, green, blue;
public Color(byte r, byte g, byte b) => (red, green, blue) = (r, g, b);
}
නමුත් කළු හා සුදු අගයන් හුවමාරු කර ගැනීමෙන් වර්ණ සේවාදායකයකු සමඟ නොගැලපීමට කිසිවක් නැත. මෙය වර්ණ පන්තියේ අනෙකුත් සේවාදායකයින්ට ව්යාකූලත්වයක් ඇති කරන බව අමුතුවෙන් කිව යුතු නැත. "කියවීමට පමණක්" විශේෂාංගය මෙම තත්වය ආමන්ත්රණය කරයි.
readonly
ප්රකාශනවල මූලික පදය සරලව හඳුන්වා දීමෙන්, සේවාදායක කේතය අවහිර කිරීමෙන් වලක්වන අතරම නම්යශීලී ආරම්භය අපි ආරක්ෂා කරමු.
public class Color
{
public static readonly Color Black = new Color(0, 0, 0);
public static readonly Color White = new Color(255, 255, 255);
public static readonly Color Red = new Color(255, 0, 0);
public static readonly Color Green = new Color(0, 255, 0);
public static readonly Color Blue = new Color(0, 0, 255);
private byte red, green, blue;
public Color(byte r, byte g, byte b) => (red, green, blue) = (r, g, b);
}
සංයුක්ත සාමාජිකයන් සැමවිටම ස්ථිතික වන අතර කියවිය හැකි සාමාජිකයෙකු සාමාන්ය ක්ෂේත්රයක් මෙන් ස්ථිතික හෝ නොවිය හැකිය.
මෙම අරමුණු දෙක සඳහා තනි මූල පදයක් භාවිතා කළ හැකි නමුත් මෙය අනුවාදකරණ ගැටළු හෝ කාර්ය සාධන ගැටළු වලට මග පාදයි. අපි මේ සඳහා තනි මූල පදයක් භාවිතා කළ බව මොහොතකට උපකල්පනය කරන්න, සහ සංවර්ධකයෙකු මෙසේ ලිවීය:
public class A
{
public static const C = 0;
}
වෙනත් සංවර්ධකයෙක් ඒ මත යැපෙන කේතයක් ලිවීය:
public class B
{
static void Main() => Console.WriteLine(A.C);
}
දැන්, ජනනය කරන ලද කේතයට ප්රත්යාවර්ත ධාරා සංයුක්ත කාල නියතය යන කාරණය මත රඳා පැවතිය හැකිද? එනම්, AC භාවිතය හුදෙක් 0 අගය මගින් ප්රතිස්ථාපනය කළ හැකිද? ඔබ මේ සඳහා "ඔව්" යැයි පැවසුවහොත්, එයින් අදහස් වන්නේ A හි සංවර්ධකයාට AC ආරම්භ කරන ආකාරය වෙනස් කළ නොහැකි බවයි - මෙය අවසරයකින් තොරව A හි සංවර්ධකයාගේ දෑත් බැඳ තබයි.
ඔබ මෙම ප්රශ්නයට "එපා" යැයි පැවසුවහොත් වැදගත් ප්රශස්තිකරණයක් මග හැරේ. සමහර විට A හි කතුවරයා ධනාත්මක වන්නේ AC සෑම විටම ශුන්ය වනු ඇති බවයි. සංයුක්ත හා කියවීමට පමණක් භාවිතා කිරීම මඟින් A හි සංවර්ධකයාට අභිප්රාය නියම කිරීමට ඉඩ ලබා දේ. මෙය වඩා හොඳ අනුවාද හැසිරීමක් සහ වඩා හොඳ කාර්ය සාධනයක් ඇති කරයි.
static readonly
: සොයාගත නොහැකි දෙයක් අවුලුවන කොන්ස්ට් එකක් තුළ කොන්ස්ට් එකක් භාවිතා කිරීමට උත්සාහ කරන්න , එවිට ඔබට භයානක "අභ්යන්තර සම්පාදක දෝෂයක්" ලැබෙනු ඇතIEnumerator
yield
. මම යුනිටි 3 ඩී වලින් පිටත කේතය පරීක්ෂා නොකළ නමුත් මෙය මොනෝ හෝ .නෙට් දෝෂයක් යැයි මම විශ්වාස කරමි . කෙසේ වෙතත් එය c # ප්රශ්නයකි.