C # හි const සහ readonly අතර වෙනස කුමක්ද?


1379

C # අතර constසහ වෙනස readonlyකුමක්ද?

ඔබ එකකට වඩා එකක් භාවිතා කරන්නේ කවදාද?


මෙම සබැඳිය සොයා ගැනීමට මට පිළිතුරු කිහිපයක් බැලීමට සිදු විය, නමුත් එය හොඳ එකකි. එරික් ලිපර්ට් සී # හි වෙනස් කළ නොහැකි බව
ෆ්‍රෑන්ක් බ්‍රයිස්

2
# ඩොන්ස්ටැක්, ඇත්ත වශයෙන්ම සී # යොමුව අනුව , කියවිය හැකි ක්ෂේත්‍රයක් ක්ෂේත්‍ර ප්‍රකාශනය සහ ඉදිකිරීම්කරු තුළ කිහිප වතාවක් පැවරිය හැකි අතර නැවත පැවරිය හැකිය.
මාර්ක්ස්

Answers:


1295

හි පැහැදිලි වෙනස හැරුණු විට

  • constවීඑස් readonlyඅගයන් සඳහා අර්ථ දැක්වීමේ අවස්ථාවේදී අගය ප්‍රකාශ කිරීම ගතිකව ගණනය කළ හැකි නමුත් ඉදිකිරීම්කරු පිටවීමට පෙර එය පැවරිය යුතුය .. ඉන්පසු එය ශීත කළ පසු.
  • කොන්ස් යනු ව්‍යංගයෙන් ය static. ClassName.ConstantNameඒවාට ප්‍රවේශ වීම සඳහා ඔබ අංකනයක් භාවිතා කරයි .

සියුම් වෙනසක් ඇත. අර්ථ දක්වා ඇති පන්තියක් සලකා බලන්න AssemblyA.

public class Const_V_Readonly
{
  public const int I_CONST_VALUE = 2;
  public readonly int I_RO_VALUE;
  public Const_V_Readonly()
  {
     I_RO_VALUE = 3;
  }
}

AssemblyBAssemblyAමෙම අගයන් කේතයෙන් යොමු කරයි. මෙය සම්පාදනය කළ විට,

  • constඅගය සම්බන්ධයෙන් ගත් කල , එය සොයා ගැනීම ප්‍රතිස්ථාපනය කිරීමක් වැනිය, අගය 2 AssemblyB'අයිඑල්' තුළට පුළුස්සනු ලැබේ . මෙයින් අදහස් කරන්නේ හෙට නම් මම I_CONST_VALUEඅනාගතයේදී 20 දක්වා යාවත්කාලීන කරමි . AssemblyBමම එය නැවත සකස් කරන තුරු තවමත් 2 ක් ඇත .
  • readonlyඅගය සම්බන්ධයෙන් ගත් කල , එය refමතක ස්ථානයකට සමාන වේ. වටිනාකම AssemblyBඅයිඑල් වෙත පුළුස්සනු නොලැබේ . මෙයින් අදහස් කරන්නේ මතක පිහිටීම යාවත්කාලීන කරන්නේ නම්, AssemblyBනැවත සකස් කිරීමකින් තොරව නව අගය ලබා ගන්නා බවයි. එබැවින් I_RO_VALUE30 දක්වා යාවත්කාලීන කරන්නේ නම් , ඔබට අවශ්‍ය වන්නේ ගොඩ නැගීමයි AssemblyA. සියලුම සේවාදායකයින් නැවත සම්පාදනය කිරීම අවශ්‍ය නොවේ.

එබැවින් නියතයේ අගය වෙනස් නොවන බව ඔබට විශ්වාස නම් a භාවිතා කරන්න const.

public const int CM_IN_A_METER = 100;

නමුත් ඔබට වෙනස් විය හැකි නියතයක් තිබේ නම් (උදා: නිරවද්‍යතාව) .. හෝ සැකයක් ඇති විට a භාවිතා කරන්න readonly.

public readonly float PI = 3.14;

යාවත්කාලීන කිරීම: අකූට මුලින්ම මෙය පෙන්වා දුන් සඳහනක් ලබා ගත යුතුය. එසේම මම මෙය ඉගෙන ගත් තැනට ප්ලග් කිරීමට අවශ්‍යයි .. C ලදායී සී # - බිල් වැග්නර්


79
මෙම staticස්ථානය ඉතා වැදගත් හා ප්රයෝජනවත් ලක්ෂ්යයක් බව පෙනේ -consts are implicitly static
LCJ

29
යොමු අගයන් පිළිබඳ කොටස වඩාත්ම වැදගත් එකකි. නියත අගයන් ප්‍රශස්තිකරණය කළ හැකිය.
CodingBarfield

23
readonlyඉදිකිරීම්කරුට පිටතින් විචල්යයන් වෙනස් කළ හැකිය (පරාවර්තනය). ඉදිකිරීම්කරුට පිටතින් var වෙනස් කිරීමට ඔබට බාධා කිරීමට උත්සාහ කරන්නේ සම්පාදකයා පමණි.
බිටර්බ්ලූ

12
readonlyඉදිකිරීම්කරු අවසන් වූ පසු පරාවර්තනය හරහා වුවද මිනි- මී විචල්‍යයන් වෙනස් කිරීමට ඉඩ නොදේ. මෙය ක්‍රියාත්මක නොකිරීමට ධාවන කාලය සිදු වේ. මෙම ධාවන ඔබ වෙනස් නැති බව බලාත්මක කිරීම සඳහා නොවේ සිදු string.Emptyකිරීමට "Hello, world!", නමුත් මම තවමත් මේ කරයි බව කියා නැහැ string.Emptymodifiable, හෝ කේතය බව උපකල්පනය නොකළ යුතුය string.Emptyසැමවිටම ශුන්ය-දිග, සංගීත වනු ඇත.

7
blogs.msmvps.com/jonskeet/2014/07/16/… යනු කියවීමට පමණක් වන පොදු කාර්ය පිරිවැය පමණි
CAD bloke

275

කොන්ස්ටස් සහිත ගොචා එකක් තිබේ! ඔබ වෙනත් එකලස් කිරීමකින් නියතයක් සඳහන් කරන්නේ නම්, එහි වටිනාකම ඇමතුම් එකලස් කිරීම සඳහා සම්පාදනය කෙරේ. ඔබ යොමු කරන ලද එකලස් කිරීමේදී නියතය යාවත්කාලීන කරන විට එය ඇමතුම් එකලස් කිරීමේදී වෙනස් නොවේ!


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

160

නියතයන්

  • නියතයන් පෙරනිමියෙන් ස්ථිතික වේ
  • සම්පාදනය කරන වේලාවේදී ඒවාට අගයක් තිබිය යුතුය (ඔබට උදා: 3.14 * 2 තිබිය හැක, නමුත් ක්‍රම ඇමතිය නොහැක)
  • කාර්යයන් තුළ ප්‍රකාශ කළ හැකිය
  • ඒවා භාවිතා කරන සෑම එකලස් කිරීමකටම පිටපත් කරනු ලැබේ (සෑම සභාවකටම දේශීය වටිනාකම් පිටපතක් ලැබේ)
  • ගුණාංගවල භාවිතා කළ හැකිය

කියවීමට පමණක් නිදසුන් ක්ෂේත්‍ර

  • ඉදිකිරීම්කරු පිටවන වේලාව වන විට අගය නියම කර තිබිය යුතුය
  • නිදසුනක් නිර්මාණය කරන විට ඇගයීමට ලක් කෙරේ

ස්ථිතික කියවීමට පමණක් ඇති ක්ෂේත්‍ර

  • කේත ක්‍රියාත්මක කිරීම පන්ති යොමු වලට පහර දෙන විට ඇගයීමට ලක් කෙරේ (නව අවස්ථාවක් නිර්මාණය කළ විට හෝ ස්ථිතික ක්‍රමයක් ක්‍රියාත්මක කළ විට)
  • ස්ථිතික ඉදිකිරීම්කරු කරන කාලය වන විට තක්සේරු කළ අගයක් තිබිය යුතුය
  • මේවාට ThreadStaticAttribute තැබීම රෙකමදාරු කරනු නොලැබේ (ස්ථිතික ඉදිකිරීම්කරුවන් එක් ත්‍රෙඩ් එකකින් පමණක් ක්‍රියාත්මක වන අතර එහි නූල් සඳහා අගය සකසනු ඇත; අනෙක් සියලුම නූල්වල මෙම අගය ආරම්භ නොකරනු ඇත)

60

එකතු කිරීම සඳහා, විමර්ශන වර්ග සඳහා ReadOnly පමණක් යොමු කිරීම කියවීමට පමණක් වටිනාකම් නොවේ. උදාහරණයක් වශයෙන්:

public class Const_V_Readonly
{
  public const int I_CONST_VALUE = 2;
  public readonly char[] I_RO_VALUE = new Char[]{'a', 'b', 'c'};

  public UpdateReadonly()
  {
     I_RO_VALUE[0] = 'V'; //perfectly legal and will update the value
     I_RO_VALUE = new char[]{'V'}; //will cause compiler error
  }
}

ඔබට stringනියතයක් ලෙස භාවිතා කළ හැකි වෙනත් යොමු වර්ගයක් තිබේද?
springy76

ඔබට constනූල් හැර වෙනත් විමර්ශන වර්ග තිබිය හැකිය , නමුත් නියතයට තිබිය හැක්කේ වටිනාකම පමණි null.
මයික් රොසොෆ්ට්

41

මෙය එය පැහැදිලි කරයි . සාරාංශය: ප්‍රකාශන වේලාවේදී const ආරම්භ කළ යුතු අතර, කියවන්නාට පමණක් ඉදිකිරීම්කරු මත ආරම්භ කළ හැකිය (එමඟින් භාවිතා කළ ඉදිකිරීම්කරු මත පදනම්ව වෙනස් අගයක් ඇත).

සංස්කරණය කරන්න: සියුම් වෙනස සඳහා ඉහත ගිෂුගේ ගොචා බලන්න


33

const: කොතැනකවත් වෙනස් කළ නොහැක.

readonly: මෙම අගය වෙනස් කළ හැක්කේ ඉදිකිරීම්කරු තුළ පමණි. සාමාන්‍ය කාර්යයන්හි වෙනස් කළ නොහැක.


27

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


public class Sample {
    private readonly string ro;

    public Sample() {
        ro = "set";
    }

    public Sample(string value) : this() {
        ro = value; // this works even though it was set in the no-arg ctor
    }
}

27

නියත සාමාජිකයෙකු සම්පාදනය කරන වේලාවේදී අර්ථ දක්වා ඇති අතර ධාවන වේලාවේදී එය වෙනස් කළ නොහැක. constමූල පද භාවිතා කරමින් නියතයන් ක්ෂේත්‍රයක් ලෙස ප්‍රකාශයට පත් කරන අතර ඒවා ප්‍රකාශයට පත් කළ පරිදි ආරම්භ කළ යුතුය.

public class MyClass
{
    public const double PI1 = 3.14159;
}

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

public class MyClass1
{
     public readonly double PI2 = 3.14159;

     //or

     public readonly double PI3;

     public MyClass2()
     {
         PI3 = 3.14159;
     }
}

const

  • ඒවා ලෙස ප්‍රකාශ කළ නොහැක static(ඒවා ව්‍යංගයෙන් ස්ථිතික වේ)
  • සංයුක්ත වේලාවේදී නියතයේ අගය ඇගයීමට ලක් කෙරේ
  • නියතයන් ආරම්භ කරනු ලබන්නේ ප්‍රකාශනයේදී පමණි

කියවීමට පමණි

  • ඒවා නිදර්ශන මට්ටමේ හෝ ස්ථිතික විය හැකිය
  • ධාවන වේලාවේදී අගය ඇගයීමට ලක් කෙරේ
  • කියවීමේදී පමණක් ප්‍රකාශනයේ හෝ ඉදිකිරීම්කරුගේ කේතය මඟින් ආරම්භ කළ හැකිය

6
ඒවා ස්ථිතික විය නොහැක , ඒවා ස්ථිතික වේ. කෙනෙකුට ප්‍රකාශ කළ නොහැකිstatic const int i = 0;
nawfal

constක්‍රමවේදයන් තුළ ප්‍රකාශ කළ නොහැක්කේ මන්දැයි ඔබට පැහැදිලි කළ හැකිද ?
මිං ට්‍රාන්

22

නියතයක් යනු සම්පාදක කාල නියතයක් වන අතර කියවීමේදී පමණක් ධාවන වේලාවේදී අගය ගණනය කිරීමට ඉඩ සලසයි. එබැවින්, 'කොන්ස්' සැමවිටම නියත වන නමුත් 'කියවීමට පමණක්' කියවනු ලැබේ.

සී # කණ්ඩායමේ එරික් ලිපර්ට් හට විවිධ වර්ගයේ වෙනස් කළ නොහැකි බව පිළිබඳ වැඩි විස්තර ඇත


15

සංස්කරණය අනුවාදය ආරක්ෂිත නොවන ආකාරය හෝ යොමු වර්ග සඳහා අදාළ වන්නේ කෙසේද යන්න නිරූපණය කරන තවත් සබැඳියක් මෙන්න .

සාරාංශය :

  • ඔබේ දේපලෙහි වටිනාකම සම්පාදනය කරන වේලාවට සකසා ඇති අතර ධාවන වේලාවේදී වෙනස් කළ නොහැක
  • කොන්ස්ට් එක ස්ථිතික ලෙස සලකුණු කළ නොහැක - කියවිය හැකි ක්ෂේත්‍ර මෙන් නොව ඒවා ස්ථිතික බව යතුරු පදයෙන් දැක්වේ.
  • කොන්ස් අගය (ප්‍රාථමික) වර්ග හැර වෙනත් කිසිවක් විය නොහැක
  • කියවීමට පමණක් ඇති මූලික පදය ක්ෂේත්‍රය වෙනස් කළ නොහැකි ලෙස සලකුණු කරයි. කෙසේ වෙතත් පන්තියේ ඉදිකිරීම්කරු තුළ දේපල වෙනස් කළ හැකිය
  • කියවීමට පමණක් ඇති යතුරු පදය ස්ථිතික සමඟ සංයෝජනය කර එය නියතයක් ලෙස ක්‍රියා කරයි (මතුපිටින් අවම වශයෙන්). ඔබ දෙදෙනා අතර IL දෙස බලන විට කැපී පෙනෙන වෙනසක් ඇත
  • const ක්ෂේත්‍ර IL හි “වචනානුසාරයෙන්” සලකුණු කර ඇති අතර කියවීමට පමණක් “ආරම්භක” වේ

11

කියවීමට පමණි : ධාවන වේලාවේදී Ctor හරහා අගය වෙනස් කළ හැකිය. නමුත් සාමාජික ක්‍රියාකාරිත්වය හරහා නොවේ

නියත : ස්ථිතික අපවිත්‍ර වීමෙන්. අගය ඕනෑම තැනක සිට වෙනස් කළ නොහැක (Ctor, Function, Runime etc etc no-where)


මෙම ගමන් මාර්ග දෙක සඳහා මට ඡේද 4 ක් කියවීමට නොහැකි වීම ගැන ස්තූතියි ...
දොන් චෙඩ්ල්

9

තවත් ගොචා: කියවීමට පමණක් ඇති අගයන් පරාවර්තනය හරහා “වංක” කේතයෙන් වෙනස් කළ හැකිය.

var fi = this.GetType()
             .BaseType
             .GetField("_someField", 
                       BindingFlags.Instance | BindingFlags.NonPublic);
fi.SetValue(this, 1);

පරාවර්තනය භාවිතා කර මට C # හි පුද්ගලික කියවීමට පමණක් උරුම වූ ක්ෂේත්‍රයක් වෙනස් කළ හැකිද?


7

constසෑම වස්තුවකටම අගයක් සමාන බව මම විශ්වාස කරමි (සහ එය වචනානුසාරයෙන් ප්‍රකාශනයකින් ආරම්භ කළ යුතුය), නමුත් readonlyඑක් එක් ක්ෂණිකකරණය සඳහා වෙනස් විය හැකිය ...


6

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

උදාහරණයක්:

public static class Text {
  public const string ConstDescription = "This can be used.";
  public readonly static string ReadonlyDescription = "Cannot be used.";
}

public class Foo 
{
  [Description(Text.ConstDescription)]
  public int BarThatBuilds {
    { get; set; }
  }

  [Description(Text.ReadOnlyDescription)]
  public int BarThatDoesNotBuild {
    { get; set; }
  }
}

5

අපගේ කාර්යාලයේ සිටින කණ්ඩායම් සාමාජිකයෙකු විසින් නියත, ස්ථිතික සහ කියවීමට පමණක් භාවිතා කළ යුතු ආකාරය පිළිබඳ පහත සඳහන් මග පෙන්වීම් ලබා දී ඇත:

  • ධාවන වේලාවේදී ඔබට දැනගත හැකි ආකාරයේ විචල්‍යයක් ඇති විට const භාවිතා කරන්න (string වචනාර්ථයෙන්, int, double, enums, ...) ඔබට අවශ්‍ය වන්නේ පන්තියේ සියලුම අවස්ථාවන් හෝ පාරිභෝගිකයින්ට අගය වෙනස් නොවිය යුතු තැනට ප්‍රවේශ වීමයි.
  • ඔබට අවශ්‍ය දත්ත ඇති විට ස්ථිතිකව භාවිතා කරන්න , පන්තියේ සියලුම අවස්ථා හෝ පාරිභෝගිකයින්ට වටිනාකම වෙනස් විය හැකි ස්ථානයට ප්‍රවේශ විය යුතුය.
  • ස්ථිතික කියවීමට පමණක් භාවිතා කරන්නධාවන වේලාවේදී (වස්තූන්) ඔබට දැනගත නොහැකි ආකාරයේ විචල්‍යයක් ඇති විට ඔබට අවශ්‍ය වන්නේ පන්තියේ සියලුම අවස්ථාවන් හෝ පාරිභෝගිකයින්ට වටිනාකම වෙනස් නොවිය යුතු තැනට ප්‍රවේශ වීමයි.
  • ඔබට නිදසුන් මට්ටමේ විචල්‍යයක් ඇති විට කියවීමට පමණක් භාවිතා කරන්න, එය වෙනස් නොවිය යුතු වස්තු නිර්මාණය කරන අවස්ථාවේ ඔබ දැන ගනු ඇත.

එක් අවසාන සටහනක්: සංයුක්ත ක්ෂේත්‍රයක් ස්ථිතික නමුත් ප්‍රතිලෝම සත්‍ය නොවේ.


1
මම හිතන්නේ ඔබ අදහස් කළේ "සංවාද" යන්නයි. ප්‍රතිලෝම යනු “නියත නොවන ක්ෂේත්‍රයක් ස්ථිතික නොවේ.” ඒවා සත්‍ය විය හැකි හෝ නොවිය හැකිය. "ස්ථිතික ක්ෂේත්‍රයක් (සැමවිටම) const" යන සංවාදය සත්‍ය නොවේ.
මයිකල් බ්ලැක්බර්න්

5
  • භාවිතා කළ යුතු විට constහෝreadonly

    • const

      • compile-time නියතය: නිරපේක්ෂ නියතය, ප්‍රකාශය අතරතුර අගය සකසා ඇත, එය IL කේතයේම ඇත
    • readonly

      • ධාවන කාල නියතය: වින්‍යාස ගොනුව හරහා ඉදිකිරීම්කරු / init තුළ සැකසිය හැක App.config, නමුත් එය ආරම්භ කළ පසු එය වෙනස් කළ නොහැක

4

විචල්‍ය ලෙස සලකුණු කරන ලද විචල්‍යයන් තදින් ටයිප් කළ # මැක්‍රෝස් වලට වඩා මඳක් වැඩි ය, සම්පාදනය කරන වේලාවේදී විචල්‍ය විචල්‍ය යොමුව පේළිගත අගයන් සමඟ ප්‍රතිස්ථාපනය වේ. මෙහි ප්‍රති consequ ලයක් ලෙස මේ ආකාරයෙන් භාවිතා කළ හැක්කේ ඇතැම් සාදන ලද ප්‍රාථමික අගය වර්ග පමණි. කියවීමට පමණක් සලකුණු කරන ලද විචල්‍යයන්, ඉදිකිරීම්කරුවෙකු තුළ, ධාවන වේලාවේදී සැකසිය හැකි අතර, කියවීමේ-පමණක්-නෙස් ක්‍රියාත්මක වන වේලාවේදී ද ක්‍රියාත්මක වේ. මේ හා සම්බන්ධ සුළු කාර්ය සාධන පිරිවැයක් ඇති නමුත් එයින් අදහස් කරන්නේ ඔබට ඕනෑම වර්ගයක් (විමර්ශන වර්ග පවා) සමඟ කියවීමට පමණක් භාවිතා කළ හැකි බවයි.

එසේම, විචල්‍ය විචල්‍යයන් සහජයෙන්ම ස්ථිතික වන අතර, කියවීමට පමණක් විචල්‍යයන් අවශ්‍ය නම් නිදර්ශන විශේෂිත විය හැකිය.


සංයුක්තයන් තදින් ටයිප් කර ඇති බව සඳහන් කර ඇත # මැක්‍රෝස් අර්ථ දක්වන්න. එසේ නොමැතිනම්, අපි සියලු සී හෝ සී ++ පුද්ගලයින් බිය ගන්වමු. :-)
ජේසන් බේකර්

4

CONST

  1. ක්ෂේත්‍ර සඳහා හෝ දේශීය විචල්‍යයන්ට const keyword යෙදිය හැකිය
  2. ප්‍රකාශ කරන අවස්ථාවේ දී අපි කොන්ස් ක්ෂේත්‍රය පැවරිය යුතුය
  3. මතකය වෙන් නොකෙරේ සංයුක්ත අගය සම්පාදනය කිරීමෙන් පසුව IL කේතයේම අන්තර්ගත වී ඇති බැවිනි. එය හරියට විචල්‍ය විචල්‍යයේ සියලු සිදුවීම් සොයාගෙන එහි අගය අනුව ආදේශ කිරීම වැනිය. එබැවින් සම්පාදනය කිරීමෙන් පසු IL කේතයට විචල්‍ය විචල්‍යයන් වෙනුවට දෘඩ කේත කළ අගයන් ඇත
  4. C # හි කොන්ස්ට් පෙරනිමියෙන් ස්ථිතික වේ.
  5. සියලු වස්තු සඳහා අගය නියත වේ
  6. ඩීඑල් අනුවාදකරණ ගැටළුවක් ඇත - මෙයින් අදහස් කරන්නේ අප පොදු සංයුක්ත විචල්‍යයක් හෝ දේපලක් වෙනස් කරන සෑම අවස්ථාවකම (ඇත්ත වශයෙන්ම එය න්‍යායාත්මකව වෙනස් කළ යුතු නොවේ), මෙම විචල්‍යය භාවිතා කරන වෙනත් ඕනෑම ඩීඑල් හෝ එකලස් කිරීමක් නැවත ගොඩනැඟිය යුතු බවයි.
  7. නියත යැයි ප්‍රකාශ කළ හැක්කේ C # සාදන ලද වර්ග පමණි
  8. නියත ක්ෂේත්‍රය ref හෝ out පරාමිතියක් ලෙස සම්මත කළ නොහැක

කියවීමට පමණි

  1. readonly keyword අදාළ වන්නේ දේශීය විචල්‍යයන් නොවන ක්ෂේත්‍ර සඳහා පමණි
  2. ප්‍රකාශ කිරීමේ වේලාවේදී හෝ ඉදිකිරීම්කරු තුළ අපට කියවිය හැකි ක්ෂේත්‍රයක් පැවරිය හැකිය, වෙනත් ක්‍රමයකින් නොවේ.
  3. කියවිය හැකි ක්ෂේත්‍ර සඳහා ගතික මතකය වෙන් කර ඇති අතර අපට ක්‍රියාත්මක වන වේලාවේදී අගය ලබා ගත හැකිය.
  4. කියවීමට පමණක් අයත් වන්නේ නිර්මාණය කරන ලද වස්තුවට පමණි. එය පන්ති සාමාජිකයෙකු බවට පත් කිරීම සඳහා කියවීමට පෙර ස්ථිතික මූල පදයක් එක් කළ යුතුය.
  5. භාවිතා කරන ඉදිකිරීම්කරු මත පදනම්ව අගය වෙනස් විය හැකිය (එය පන්තියේ වස්තුවට අයත් බැවින්)
  6. ඔබ ප්‍රාථමික නොවන වර්ගයක් (විමර්ශන වර්ගය) කියවීමට පමණක් යොමු කළහොත් එය වෙනස් කළ නොහැකි වන්නේ එහි අඩංගු වස්තුව නොවේ.
  7. ධාවන වේලාවේදී අගය ලබාගෙන ඇති බැවින්, කියවිය හැකි ක්ෂේත්‍ර / ගුණාංග සමඟ ඩීඑල් අනුවාදකරණ ගැටලුවක් නොමැත.
  8. ඉදිකිරීම්කරු සන්දර්භය තුළ අපට කියවිය හැකි ක්ෂේත්‍රය ref හෝ out පරාමිතීන් ලෙස සම්මත කළ හැකිය.

3

තවත් ගොචා .

කොන්ස් ඇත්ත වශයෙන්ම ක්‍රියාත්මක වන්නේ මූලික දත්ත වර්ග සමඟ පමණක් බැවින්, ඔබට පන්තියක් සමඟ වැඩ කිරීමට අවශ්‍ය නම්, ඔබට කියවීමට පමණක් බල කිරීමට සිදුවනු ඇත. කෙසේ වෙතත්, උගුලෙන් පරිස්සම් වන්න! ReadOnly යන්නෙන් අදහස් කරන්නේ ඔබට වෙනත් වස්තුවක් සමඟ වස්තුව ප්‍රතිස්ථාපනය කළ නොහැකි බවයි (ඔබට එය වෙනත් වස්තුවකට යොමු කළ නොහැක). නමුත් වස්තුවට යොමු දැක්වීමක් ඇති ඕනෑම ක්‍රියාවලියක් තුළ ඇති අගයන් වෙනස් කිරීමට නිදහස ඇත වස්තුව ඇති !

එබැවින් කියවීමට පමණක් පරිශීලකයාට දේවල් වෙනස් කළ නොහැකි යැයි සිතීම ව්‍යාකූල නොකරන්න. පංතියක අභ්‍යන්තර අගයන් වෙනස් වීම වැළැක්වීම සඳහා සී # හි සරල වාක්‍ය ඛණ්ඩයක් නොමැත (මා දන්නා පරිදි).


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

3

constවිය යුතුය දැඩි, ව්යංගාර්ථවත්ව ලෙස එහිදී readonlyකළ හැකි ද ඉදිකිරීමටත් පිහිටුවා , පන්ති.


3

C # .Net හි const සහ readonly ක්ෂේත්‍ර අතර සැලකිය යුතු වෙනසක් ඇත

const යනු පෙරනිමියෙන් ස්ථිතික වන අතර එය නියත අගයකින් ආරම්භ කළ යුතුය, එය පසුව වෙනස් කළ නොහැක. ඉදිකිරීම්කරුවන් තුළ ද අගය වෙනස් කිරීමට අවසර නැත. එය සියලු දත්ත සමුදායන් සමඟ භාවිතා කළ නොහැක. හිටපු දිනය ටයිම් සඳහා. එය ඩේටයිම් දත්ත සමුදාය සමඟ භාවිතා කළ නොහැක.

public const DateTime dt = DateTime.Today;  //throws compilation error
public const string Name = string.Empty;    //throws compilation error
public readonly string Name = string.Empty; //No error, legal

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

class A
{
    public readonly int Id;

    public A(int i)
    {
        Id = i;
    }
}

පහත දැක්වෙන පරිදි ක්ෂණික නිශ්චිත අගයන් සමඟ කියවීමට පමණක් ක්ෂේත්‍රය ආරම්භ කළ හැකිය:

A objOne = new A(5);
A objTwo = new A(10);

මෙහිදී, objOne හට කියවිය හැකි ක්ෂේත්‍රයේ අගය 5 ක් වන අතර objTwo ට 10 ක් ඇත. එය const භාවිතා කළ නොහැක.


2

නියතයක් පාරිභෝගිකයාට වචනාර්ථමය අගයක් ලෙස සම්පාදනය කෙරෙන අතර ස්ථිතික නූල් අර්ථ දක්වා ඇති අගය වෙත යොමු වේ.

අභ්‍යාසයක් ලෙස, බාහිර පුස්තකාලයක් නිර්මාණය කර එය කොන්සෝල යෙදුමක පරිභෝජනය කරන්න, ඉන්පසු පුස්තකාලයේ ඇති අගයන් වෙනස් කර එය නැවත සකස් කරන්න (පාරිභෝගික වැඩසටහන නැවත සකස් නොකර), ඩීඑල්එල් ඩිරෙක්ටරියට දමා EXE අතින් ක්‍රියාත්මක කරන්න, ඔබ සොයා ගත යුතුය නියත නූල වෙනස් නොවන බව.


එය සත්‍යයක් බව මට අවංකවම සැකයි ... මම පරීක්ෂා කර බලන්නම්.
ljs



Nd ඇන්ඩ rew හාරේ - ඔව්, මම දැන් පරීක්ෂා කළා. මම හරිම පුදුමයි, ඒක නියම ගොචා එකක්, මම ඒ ගැන ඇත්තටම පුදුම වෙනවා, පුදුමයි ඒක තමයි ...!
ljs

කෙසේ වෙතත්, මෙහි දර්ශකය යන වචනය භාවිතා කිරීම ගැන මම විරුද්ධ වෙමි. එය එය යොමු තියෙන්නේ, අවධානය යොමුකළ නැහැ, එහි වන එය ඒ දෙක අතර වෙනස හඳුනා ගැනීම වැදගත් වේ එසේ ඔබ අනාරක්ෂිත ආකාරයෙන් කළමනාකරණය නොකළ සූචක මෙහෙයවිය හැකි ලෙස C # තුළ වෙනසක්.
ljs

2

නියතයි

නියත ක්ෂේත්‍රය නිර්වචනය කළ විට එය ලබා දිය යුතුය. ඉන්පසු සම්පාදකයා එකලස් කිරීමේ පාර-දත්තවල නියතයේ අගය ඉතිරි කරයි. මෙයින් අදහස් කරන්නේ නියතයක් නිර්වචනය කළ හැක්කේ බූලියන්, චාර්, බයිට් වැනි ප්‍රාථමික වර්ගයට පමණි. නියතයන් සැමවිටම ස්ථිතික සාමාජිකයන් ලෙස සලකනු ලැබේ, උදාහරණ සාමාජිකයන් නොවේ.

කියවීමට පමණි

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

මේ ගැන වැඩි විස්තර මෙම ලිපියෙන් විස්තර කෙරේ


1

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


1

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

උදාහරණයක් ලෙස, සාමාජිකයන් අර්ථ දැක්වීම සඳහා 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 = r;
        green = g;
        blue = b;
    }
}

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

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 = r;
        green = g;
        blue = 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 හි සංවර්ධකයාට අභිප්‍රාය නියම කිරීමට ඉඩ ලබා දේ. මෙය වඩා හොඳ අනුවාද හැසිරීමක් සහ වඩා හොඳ කාර්ය සාධනයක් ඇති කරයි.


1

කියවීමට පමණක්: අගය ආරම්භ කරනු ලබන්නේ පන්තියේ ඉදිකිරීම්කරුගෙන් එක් වරක් පමණි.
const: ඕනෑම ශ්‍රිතයකින් ආරම්භ කළ හැකි නමුත් එක් වරක් පමණි


1

වෙනස වන්නේ ස්ථිතික කියවිය හැකි ක්ෂේත්‍රයක වටිනාකම ක්‍රියාත්මක වන වේලාවට සකසා තිබීමයි, එබැවින් වැඩසටහනේ විවිධ ක්‍රියාත්මක කිරීම් සඳහා එය වෙනස් අගයක් ලබා ගත හැකිය. කෙසේ වෙතත්, සංයුක්ත ක්ෂේත්‍රයක අගය සම්පාදක කාල නියතයකට සකසා ඇත.

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

වැඩි විස්තර සඳහා කරුණාකර මෙම මාතෘකාව පිළිබඳ සී # නිතර අසනු ලබන ප්‍රශ්න බලන්න: http://blogs.msdn.com/csharpfaq/archive/2004/12/03/274791.aspx


1

සංයුක්ත වේලාවේදී නියත විචල්‍යයන් ප්‍රකාශයට පත් කර ආරම්භ කරනු ලැබේ. වාට්ටුවලින් පසු වටිනාකම වෙනස් කළ නොහැක. කියවීමට-පමණක් විචල්‍යයන් ආරම්භ කරනු ලබන්නේ පන්තියේ ස්ථිතික ඉදිකිරීම්කරුගෙන් පමණි. කියවීම පමණක් භාවිතා කරනුයේ අපට ක්‍රියාත්මක වන වේලාවේදී අගය පැවරීමට අවශ්‍ය වූ විට පමණි.


1

Const : යෙදුමේ ආයු කාලය තුළ නිරපේක්ෂ නියත අගය.

කියවීමට පමණි : ධාවන කාලය තුළ එය වෙනස් කළ හැකිය.


1
එය වෙනස් කළ හැකි 'කියවීමට පමණක්' පිළිබඳ ඔබේ අර්ථ දැක්වීම දෝෂ සහිතය. මම හිතන්නේ 'වෙනස් කිරීම' මඟින් ඔබ අදහස් කළේ 'ක්‍රියාත්මක කිරීම' ලෙස 'සෙට්' යන්නයි.
අහමඩ්

0

මිනිසුන් ඉහත කී දෙයට එකතු කළ යුතු එක් දෙයක්. ඔබට කියවිය හැකි වටිනාකමක් ඇති එකලස් කිරීමක් තිබේ නම් (උදා: කියවීමට පමණක් මැක්ස්ෆූකවුන්ට් = 4;), එම එකලස් කිරීමේ නව අනුවාදයක් වෙනත් අගයකින් නැව්ගත කිරීමෙන් ඇමතුම් එකලස් කිරීමේ වටිනාකම ඔබට වෙනස් කළ හැකිය (උදා: කියවීමට පමණක් මැක්ස්ෆූකවුන්ට් = 5;).

නමුත් නියතයක් සමඟ, ඇමතුම්කරු සම්පාදනය කරන විට එය ඇමතුම්කරුගේ කේතයට නැමෙනු ඇත.

ඔබ මෙම C # ප්‍රවීණතා මට්ටමට ළඟා වී ඇත්නම්, ඔබ බිල් වැග්නර්ගේ පොත වන C ලදායී C #: 50 ඔබේ C # වැඩි දියුණු කිරීමට නිශ්චිත ක්‍රම # මෙම ප්‍රශ්නයට සවිස්තරාත්මකව පිළිතුරු සපයන (සහ තවත් කරුණු 49 ක්) සූදානම්.

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.