C # හි පන්තියකට වඩා මම ව්‍යුහයක් භාවිතා කළ යුත්තේ කවදාද?


1407

ඔබ C # පන්තියේ නොව struct භාවිතා කළ යුත්තේ කවදාද? මගේ සංකල්පීය ආකෘතිය නම්, අයිතමය හුදෙක් වටිනාකම් එකතුවක් වන කාලවලදී ව්‍යුහයන් භාවිතා කිරීමයි . ඒවා සියල්ලම තාර්කිකව එකට එකතු කර ගත හැකි ක්‍රමයක්.

මම මෙම නීති රීති මෙතැනින් ආවා :

  • ව්‍යුහයක් තනි අගයක් නියෝජනය කළ යුතුය.
  • ව්‍යුහයකට මතක පාද සටහන බයිට් 16 ට අඩු විය යුතුය.
  • ව්‍යුහයක් නිර්මාණය කිරීමෙන් පසු වෙනස් නොකළ යුතුය.

මෙම නීති ක්‍රියාත්මක වේද? ව්‍යුහයක් අර්ථවත් ලෙස අදහස් කරන්නේ කුමක්ද?


253
System.Drawing.Rectangleමෙම නීති තුනම උල්ලං lates නය කරයි.
ක්‍රිස්ඩබ්

4
C # හි ලියා ඇති වාණිජ ක්‍රීඩා කිහිපයක් තිබේ, කාරණය වන්නේ ඒවා ප්‍රශස්ත කේත සඳහා භාවිතා කිරීමයි
BlackTigerX

25
ඔබට එකට එකතු වීමට අවශ්‍ය වටිනාකම් වර්ග කුඩා එකතුවක් ඇති විට ව්‍යුහයන් වඩා හොඳ කාර්ය සාධනයක් ලබා දෙයි. ක්‍රීඩා ක්‍රමලේඛනයේ සෑම විටම මෙය සිදු වේ, නිදසුනක් ලෙස, ත්‍රිමාණ ආකෘතියක සිරස් තලයට ස්ථානයක්, වයනය සම්බන්ධීකරණයක් සහ සාමාන්‍යයක් ඇත, එය සාමාන්‍යයෙන් වෙනස් කළ නොහැකි වනු ඇත. තනි මාදිලියක සිරස් දෙදහසක් තිබිය හැකිය, නැතහොත් දුසිමක් තිබිය හැක, නමුත් මෙම භාවිතයේ දී ව්‍යුහයන් සමස්තයක් ලෙස අඩු පිරිවැයක් සපයයි. මම මෙය මගේම එන්ජින් සැලසුම හරහා සත්‍යාපනය කර ඇත්තෙමි.
ක්‍රිස් ඩී

6
@ එරික් ෆෝර්බ්ස්: මම හිතන්නේ මෙය සාමාන්‍යයෙන් විශාලතම

4
H ක්‍රිස්ව් මට පෙනේ, නමුත් එම අගයන් සෘජුකෝණාස්රයක් නියෝජනය නොකරයි, එනම් “තනි” අගයක් නොවේද? Vector3D හෝ Color මෙන්, ඒවා ද ඇතුළත අගයන් කිහිපයක් වේ, නමුත් මම හිතන්නේ ඒවා තනි අගයන් නියෝජනය කරයි ද?
මාසන් මාඕ

Answers:


609

OP විසින් යොමු කරන ලද ප්‍රභවයට යම් විශ්වසනීයත්වයක් ඇත ... නමුත් මයික්‍රොසොෆ්ට් ගැන කුමක් කිව හැකිද - ව්‍යුහාත්මක භාවිතය පිළිබඳ ස්ථාවරය කුමක්ද? මම මයික්‍රොසොෆ්ට් වෙතින් අමතර ඉගෙනීමක් ලබා ගැනීමට උත්සාහ කළෙමි.

වර්ගයේ අවස්ථා කුඩා හා පොදුවේ කෙටිකාලීන හෝ වෙනත් වස්තූන් තුළ පොදුවේ කාවැදී ඇත්නම් පන්තියක් වෙනුවට ව්‍යුහයක් නිර්වචනය කිරීම සලකා බලන්න.

වර්ගයට පහත සඳහන් සියලු ලක්ෂණ නොමැති නම් ව්‍යුහයක් නිර්වචනය නොකරන්න:

  1. එය තාර්කිකව ප්‍රාථමික වර්ග වලට සමාන තනි අගයක් නියෝජනය කරයි (නිඛිල, ද්විත්ව සහ යනාදිය).
  2. එහි උදාහරණ ප්‍රමාණය බයිට් 16 ට වඩා කුඩාය.
  3. එය වෙනස් කළ නොහැකි ය.
  4. එය නිතර කොටු කිරීමට අවශ්‍ය නොවනු ඇත.

මයික්‍රොසොෆ්ට් නිරන්තරයෙන් එම නීති උල්ලං lates නය කරයි

හරි, කෙසේ වෙතත් # 2 සහ # 3. අපගේ ආදරණීය ශබ්දකෝෂයට අභ්‍යන්තර ව්‍යුහ 2 ක් ඇත:

[StructLayout(LayoutKind.Sequential)]  // default for structs
private struct Entry  //<Tkey, TValue>
{
    //  View code at *Reference Source
}

[Serializable, StructLayout(LayoutKind.Sequential)]
public struct Enumerator : 
    IEnumerator<KeyValuePair<TKey, TValue>>, IDisposable, 
    IDictionaryEnumerator, IEnumerator
{
    //  View code at *Reference Source
}

* විමර්ශන මූලාශ්රය

'ජොනී කැන්ට්කෝඩ්.කොම්' ප්‍රභවයට 4 න් 3 ක් ලැබී ඇත - # 4 සමාව දිය හැකි බැවින් # 4 බොහෝ විට ගැටලුවක් නොවනු ඇත. ඔබ බොක්සිං ව්‍යුහයක් සොයා ගන්නේ නම්, ඔබේ ගෘහ නිර්මාණ ශිල්පය ගැන නැවත සිතා බලන්න.

මයික්‍රොසොෆ්ට් මෙම ව්‍යුහයන් භාවිතා කරන්නේ මන්දැයි සොයා බලමු:

  1. සෑම ව්‍යුහයක්ම, Entryසහ Enumerator, තනි අගයන් නියෝජනය කරයි.
  2. වේගය
  3. Entryශබ්ද කෝෂ පන්තියෙන් පිටත කිසි විටෙකත් පරාමිතියක් ලෙස සම්මත නොවේ. වැඩිදුර විමර්ශන වලින් පෙනී යන්නේ IEnumerable ක්‍රියාත්මක කිරීම තෘප්තිමත් කිරීම සඳහා, සංඛ්‍යා ලේඛකයෙකු Enumeratorඉල්ලා සිටින සෑම අවස්ථාවකම එය පිටපත් කරන ව්‍යුහය ශබ්දකෝෂය භාවිතා කරන බවයි ... අර්ථවත් කරයි.
  4. ශබ්ද කෝෂ පන්තියට අභ්‍යන්තරය. Enumeratorශබ්දකෝෂය ගණන් කළ නොහැකි බැවින් IEnumerator අතුරුමුහුණත ක්‍රියාත්මක කිරීමට සමාන ප්‍රවේශයක් තිබිය යුතුය - උදා: IEnumerator getter.

යාවත්කාලීන කිරීම - ඊට අමතරව, ව්‍යුහයක් අතුරුමුහුණතක් ක්‍රියාත්මක කරන විට - ගණන් ගැනීමේ යන්ත්‍රය මෙන් - සහ එය ක්‍රියාත්මක කරන ලද වර්ගයට දැමූ විට, ව්‍යුහය විමර්ශන වර්ගයක් බවට පත් වන අතර එය ගොඩට ගෙන යනු ලැබේ. ශබ්දකෝෂය පන්තියට අභ්යන්තර, ගණන් වේ තවමත් අගය වර්ගය. කෙසේ වෙතත්, ක්‍රමයක් ඇමතූ විගසම GetEnumerator()විමර්ශන වර්ගයක් IEnumeratorආපසු ලබා දෙනු ලැබේ.

අප මෙහි නොදකින දෙය නම් ව්‍යුහයන් වෙනස් කළ නොහැකි ලෙස තබා ගැනීමට හෝ නිදර්ශන ප්‍රමාණය බයිට් 16 ක් හෝ ඊට අඩු ප්‍රමාණයක් පවත්වා ගැනීමට අවශ්‍ය ඕනෑම උත්සාහයක් හෝ සාක්ෂියක්:

  1. ඉහත ව්‍යුහයන්හි කිසිවක් ප්‍රකාශ කර නැතreadonly - වෙනස් කළ නොහැක
  2. මෙම ව්‍යුහයේ ප්‍රමාණය බයිට් 16 ට වඩා වැඩි විය හැකිය
  3. Entry(සිට undetermined ජීවිත කාලය ඇත Add()කිරීමට, Remove(), Clear(), හෝ කැළි කසළ);

සහ ... 4. ව්‍යුහයන් දෙකම TKey සහ TValue ගබඩා කර ඇති අතර ඒවා අප දන්නා පරිදි විමර්ශන වර්ග විය හැකිය (ප්‍රසාද තොරතුරු එකතු කරන ලදි)

හැෂ් යතුරු තිබියදීත්, ශබ්දකෝෂ අර්ධ වශයෙන් වේගවත් බැවින් ව්‍යුහයක් ස්ථාපනය කිරීම විමර්ශන වර්ගයකට වඩා ඉක්මන් වේ. මෙන්න, මට Dictionary<int, int>අනුක්‍රමිකව වැඩි කරන ලද යතුරු සමඟ අහඹු සංඛ්‍යා 300,000 ක් ගබඩා කර ඇත .

ධාරිතාව: 312874 මතක
ප්‍රමාණය: බයිට් 2660827
සම්පූර්ණ කරන ලද
ප්‍රමාණය: 5ms පිරවීමට ගතවන කාලය: 889ms

ධාරිතාව : අභ්‍යන්තර අරාවට පෙර ලබා ගත හැකි මූලද්‍රව්‍ය ගණන ප්‍රමාණය වෙනස් කළ යුතුය.

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

සම්පූර්ණ කළ ප්‍රමාණය: අභ්‍යන්තර අරාව මූලද්‍රව්‍ය 150862 සිට මූලද්‍රව්‍ය 312874 දක්වා ප්‍රමාණය වෙනස් කිරීමට ගතවන කාලය. සෑම මූලද්‍රව්‍යයක්ම අනුපිළිවෙලින් පිටපත් කර Array.CopyTo()ඇති බව ඔබ වටහා ගත් විට, එය එතරම් අවුල් සහගත නොවේ.

පිරවීම සඳහා ගතවන මුළු කාලය : ලොග් වීම සහ OnResizeමා ප්‍රභවයට එකතු කළ සිදුවීමක් හේතුවෙන් පිළිගත හැකි ය; කෙසේ වෙතත්, මෙහෙයුමේදී 15 වතාවක් ප්‍රතිප්‍රමාණනය කරන අතරම 300k පූර්ණ සංඛ්‍යා පිරවීම තවමත් සිත් ඇදගන්නා සුළුය. කුතුහලයෙන් යුතුව, මා දැනටමත් ධාරිතාව දැන සිටියේ නම් පිරවීමට ගතවන කාලය කොපමණ වේද? 13ms

ඉතින්, දැන්, Entryපංතියක් නම් කුමක් කළ යුතුද? මෙම වේලාවන් හෝ ප්‍රමිතික ඇත්ත වශයෙන්ම එතරම් වෙනස් වේද?

ධාරිතාව: 312874 මතක
ප්‍රමාණය: බයිට් 2660827
සම්පූර්ණ කරන ලද
ප්‍රමාණය: 26ms පිරවීමට ගතවන මුළු කාලය: මීටර් 964

නිසැකවම, විශාල වෙනස වන්නේ ප්‍රමාණය වෙනස් කිරීමයි. ධාරිතාවයෙන් ශබ්දකෝෂය ආරම්භ කරන්නේ නම් යම් වෙනසක් තිබේද? සැලකිලිමත් වීමට ප්රමාණවත් නොවේ ... 12ms .

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

/*
 *  Added to satisfy initialization of entry elements --
 *  this is where the extra time is spent resizing the Entry array
 * **/
for (int i = 0 ; i < prime ; i++)
{
    destinationArray[i] = new Entry( );
}
/*  *********************************************** */  

එක් එක් අරාව මූලද්‍රව්‍යයන් Entryවිමර්ශන වර්ගයක් ලෙස ආරම්භ කිරීමට මට සිදු වූ හේතුව MSDN: ව්‍යුහ නිර්මාණයෙන් සොයාගත හැකිය . කෙටියෙන්:

ව්‍යුහයක් සඳහා පෙරනිමි ඉදිකිරීම්කරුවෙකු ලබා නොදෙන්න.

ව්‍යුහයක් පෙරනිමි ඉදිකිරීම්කරුවෙකු නිර්වචනය කරන්නේ නම්, ව්‍යුහයේ අරා නිර්මාණය කරන විට, පොදු භාෂා ධාවන කාලය සෑම අරා මූලද්‍රව්‍යයකම පෙරනිමි ඉදිකිරීම්කරු ස්වයංක්‍රීයව ක්‍රියාත්මක කරයි.

C # සම්පාදකයා වැනි සමහර සම්පාදකයින් ව්‍යුහයන්ට පෙරනිමි ඉදිකිරීම්කරුවන් වීමට ඉඩ නොදේ.

එය ඇත්ත වශයෙන්ම තරමක් සරල වන අතර අපි අසිමොව්ගේ රොබෝ තාක්ෂණය පිළිබඳ නීති තුනෙන් ණයට ගන්නෙමු :

  1. ව්‍යුහය භාවිතා කිරීමට ආරක්ෂිත විය යුතුය
  2. මෙය # 1 රීතිය උල්ලං would නය නොකරන්නේ නම්, ව්‍යුහය එහි කාර්යය කාර්යක්ෂමව ඉටු කළ යුතුය
  3. රීතිය # 1 තෘප්තිමත් කිරීම සඳහා එහි විනාශය අවශ්‍ය නොවන්නේ නම්, ව්‍යුහය එහි භාවිතයේදී නොවෙනස්ව පැවතිය යුතුය

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


8
මයික්‍රොසොෆ්ට් හි නීතිරීති සම්බන්ධයෙන් ගත් කල, වෙනස් කළ නොහැකි බව පිළිබඳ රීතිය සැලසුම් කර ඇති බව පෙනෙන්නේ, වටිනාකම් වර්ග භාවිතය අධෛර්යමත් කිරීම සඳහා වන අතර, ඒවායේ හැසිරීම විමර්ශන වර්ග වලට වඩා වෙනස් වන අතර, කැබලි-විකෘති අගය අර්ථ නිරූපණයන් ප්‍රයෝජනවත් විය හැකි වුවත් . වර්ගයක් කැබලි-විකෘති කළ හැකි නම් එය සමඟ වැඩ කිරීම පහසු වන අතර, වර්ගයේ ගබඩා ස්ථාන එකිනෙකාගෙන් තර්කානුකූලව වෙන් කළ යුතු නම්, වර්ගය “විකෘති” ව්‍යුහයක් විය යුතුය.
සුපර් කැට්


2
මයික්‍රොසොෆ්ට් වර්ග බොහොමයක් එම නීති උල්ලං that නය කිරීම එම වර්ග සමඟ ගැටළුවක් නිරූපණය නොකරන නමුත් ඇඟවුම් කරන්නේ සියලුම ව්‍යුහ වර්ග සඳහා නීති අදාළ නොවිය යුතු බවයි. ව්‍යුහයක් තනි වස්තුවක් [සමඟ Decimalහෝ DateTime] නියෝජනය කරන්නේ නම්, එය අනෙක් නීති තුනට අනුකූල නොවන්නේ නම්, එය පන්තියකින් ප්‍රතිස්ථාපනය කළ යුතුය. යම් ව්‍යුහයක් ස්ථාවර විචල්‍ය එකතුවක් දරන්නේ නම්, ඒ සෑම එකක්ම එහි වර්ගයට වලංගු වන ඕනෑම අගයක් දරයි [උදා Rectangle], එවිට එය විවිධ නීති රීති වලට අනුකූල විය යුතුය , සමහර ඒවා “තනි-වටිනාකම්” ව්‍යුහයන්ට පටහැනි වේ. .
සුපර් කැට්

4
BIAbstract: සමහර අය Dictionaryඇතුල්වීමේ වර්ගය සාධාරණීකරණය කරන්නේ එය අභ්‍යන්තර වර්ගයක් පමණක් වන නිසා, කාර්ය සාධනය අර්ථ නිරූපණයට වඩා වැදගත් යැයි හෝ වෙනත් නිදහසට කරුණක් ලෙස ය. මගේ අදහස නම්, යම් ආකාරයක Rectangleඑහි අන්තර්ගතයන් තනි තනිව සංස්කරණය කළ හැකි ක්ෂේත්‍ර ලෙස නිරාවරණය විය යුතු නිසා “කාර්ය සාධන ප්‍රතිලාභ එහි ප්‍රති ant ලයක් ලෙස ඇති වන අර්ථකථන අඩුපාඩුකම් වලට වඩා වැඩි නොවේ, නමුත් වර්ගය අර්ථකථනය මගින් ස්ථාවර ස්වාධීන අගයන් සමූහයක් නිරූපණය කරන නිසා විකෘති ව්‍යුහය දෙකම වේ වඩා කාර්ය සාධනය සහ අර්ථාන්විතව උසස් .
සුපර් කැට්

2
up සුපර්කැට්: මම එකඟ වෙමි ... මගේ පිළිතුරේ මුලික කාරණය වූයේ 'මාර්ගෝපදේශ' තරමක් දුර්වල වන අතර හැසිරීම් පිළිබඳ පූර්ණ දැනුමක් හා අවබෝධයක් සහිතව ව්‍යුහයන් භාවිතා කළ යුතු බවයි. විකෘති ව්‍යුහය පිළිබඳ මගේ පිළිතුර මෙතැනින් බලන්න: stackoverflow.com/questions/8108920/…
IAbstract

156

ඔබ විට:

  1. බහුමාපකය අවශ්‍ය නැත,
  2. අගය අර්ථ නිරූපණය අවශ්‍යයි, සහ
  3. ගොඩවල් වෙන් කිරීම සහ ඊට සම්බන්ධ කසළ එකතු කිරීම වළක්වා ගැනීමට අවශ්‍යය.

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


1
එය එක් "අවවාදයක්" පමණි. වටිනාකම් වර්ග සහ එසවුම් කාරණා "එසවීම" වැනි කරුණු සලකා බැලිය යුතුය (Guid)null.

1
සී / සී ++ ට වඩා මිල අධිකද? C ++ හි නිර්දේශිත ක්‍රමය වන්නේ වස්තු අගය අනුව ගමන් කිරීමයි
අයන ටොඩිරෙල්

OnIonTodirel එය කාර්ය සාධනයට වඩා මතක ආරක්ෂිත හේතූන් නිසා නොවේද? එය සැමවිටම වෙළඳාමකි, නමුත් 32 බී තොගයක් පසු කිරීම සැමවිටම (ටීඑම්) ලේඛනයකින් 4 බී යොමු කිරීමක් සම්මත කිරීමට වඩා මන්දගාමී වේ. කෙසේ වෙතත් , "අගය / යොමු කිරීම" භාවිතය C # සහ C ++ වල ටිකක් වෙනස් බව සලකන්න - ඔබ යම් වස්තුවක් වෙත යොමු කිරීමක් කළ විට, ඔබ යොමු කිරීමක් පසු කළත් ඔබ තවමත් අගය අනුව ගමන් කරයි (ඔබ ' නැවත යොමුකිරීමේ වටිනාකම පසු කිරීම මිස මූලික වශයෙන් යොමු කිරීම සඳහා යොමු කිරීමක් නොවේ). එය අර්ථකථන අගය නොවේ , නමුත් එය තාක්ෂණික වශයෙන් "අගය පසුකර යාම" වේ.
ලුවාන්

U ලුවාන් පිටපත් කිරීම යනු පිරිවැයේ එක් අංගයක් පමණි. දර්ශකය / යොමු කිරීම හේතුවෙන් ඇති අමතර අවිනිශ්චිතතාව ද එක් ප්‍රවේශයකට පිරිවැය වේ. සමහර අවස්ථාවලදී ව්‍යුහය චලනය කළ හැකි අතර පිටපත් කිරීමට පවා අවශ්‍ය නොවේ.
ඔනූර්

N එය සිත්ගන්නා සුළුය. පිටපත් නොකර ඔබ "චලනය" කරන්නේ කෙසේද? මම හිතුවේ asm "mov" උපදෙස් ඇත්ත වශයෙන්ම "චලනය" නොවන බවයි. එය පිටපත් කරයි.
වින්ගර් සෙන්ඩන්

148

මුල් ලිපියේ දක්වා ඇති නීතිරීති සමඟ මම එකඟ නොවෙමි. මෙන්න මගේ නීති:

1) අරා වල ගබඩා කර ඇති විට කාර්ය සාධනය සඳහා ඔබ ව්‍යුහයන් භාවිතා කරයි. (ද බලන්න පිළිතුර structs විට? )

2) ව්‍යුහාත්මක දත්ත C / C ++ සිට / දක්වා කේත සම්මත කිරීමේදී ඔබට ඒවා අවශ්‍ය වේ

3) ඔබට අවශ්‍ය නම් ඒවා භාවිතා නොකරන්න:

  • පැවරුම් යටතේ සහ තර්ක ලෙස සම්මත කිරීමේදී ඒවා අනපේක්ෂිත ලෙස හැසිරීමට හේතු විය හැකි “සාමාන්‍ය වස්තූන්” ( යොමු වර්ග ) වලට වඩා වෙනස් ලෙස හැසිරේ ; කේතය දෙස බලන පුද්ගලයා ඔවුන් ව්‍යුහයක් සමඟ කටයුතු කරන බව නොදන්නේ නම් මෙය විශේෂයෙන් භයානක ය.
  • ඒවා උරුම කර ගත නොහැක.
  • ව්‍යුහයන් තර්ක ලෙස සම්මත කිරීම පන්තිවලට වඩා මිල අධිකය.

4
+1 ඔව්, මම # 1 ට සම්පුර්ණයෙන්ම එකඟ වෙමි ( රූප වැනි දේ සමඟ කටයුතු කිරීමේදී මෙය විශාල වාසියකි) සහ ඒවා “සාමාන්‍ය වස්තූන්” වලට වඩා වෙනස් බව පෙන්වා දීම සඳහා සහ පවතින දැනුමෙන් හැර මෙය දැන ගැනීමේ ක්‍රමයක් තිබේ. හෝ වර්ගයම පරීක්ෂා කිරීම. ද, ඔබ struct වර්ගය සඳහා හිස් අගයක් ප්රකාශ කළ නොහැකි :-) මෙම ඇත්තටම මම එහිදී එක් නඩුවක් පාහේ විචල්ය ප්රකාශ අඩවිය නොවන-Core අගය වර්ග හෝ අනිවාර්ය 'struct' මූල පදය සඳහා යම් යම් 'හංගේරියානු' ඇති විය කැමති .

stpst: යමෙකු යමක් structදැන සිටිය යුතු අතර එය හැසිරෙන්නේ කෙසේද යන්න දැන ගැනීම සත්‍යයකි , නමුත් යමක් structනිරාවරණය වූ ක්ෂේත්‍ර සමඟ නම් , ඒ සියල්ල දැනගත යුතුය. යම් වස්තුවක් නිරාවරණය වූ-ක්ෂේත්‍ර-ව්‍යුහාත්මක වර්ගයක දේපලක් නිරාවරණය කරන්නේ නම් සහ කේතය එම ව්‍යුහය විචල්‍යයකට කියවා වෙනස් කරන්නේ නම්, එම ක්‍රියාව ව්‍යුහය ලියන තුරු හෝ තෙක් කියවන ලද වස්තුවට එවැනි ක්‍රියාවක් බලපාන්නේ නැතැයි කෙනෙකුට ආරක්ෂිතව පුරෝකථනය කළ හැකිය. ආපසු. ඊට වෙනස්ව, දේපල විකෘති පංති වර්ගයක් නම්, එය කියවීම සහ වෙනස් කිරීම මගින් අපේක්ෂිත පරිදි යටින් පවතින වස්තුව යාවත්කාලීන කළ හැකිය, නමුත් ...
සුපර් කැට්

... එය කිසිවක් වෙනස් කිරීමකින් අවසන් විය හැකිය, නැතහොත් එය වෙනස් කිරීමට අදහස් නොකරන වස්තූන් වෙනස් කිරීමට හෝ දූෂිත වීමට ඉඩ ඇත. "ඔබ කැමති සියල්ල මෙම විචල්‍යය වෙනස් කරන්න; ඔබ ඒවා පැහැදිලිව යම් තැනක ගබඩා කරන තුරු වෙනස්කම් කිසිවක් නොකරනු ඇත" යනුවෙන් කේතයක් තිබීම "ඔබට යම් වස්තුවක් ගැන සඳහනක් ලැබෙනවා, එය ඕනෑම අංකයක් සමඟ බෙදා ගත හැකිය" යනුවෙන් සඳහන් කේතයට වඩා පැහැදිලි ය. වෙනත් යොමු කිරීම්, හෝ කිසිසේත් බෙදා නොගත හැකිය; ඔබ එය වෙනස් කළහොත් කුමක් සිදුවේදැයි දැන ගැනීමට මෙම වස්තුව ගැන වෙනත් අයගෙන් විමසීම් තිබිය හැකිදැයි ඔබට සොයා ගැනීමට සිදුවේ. ”
සුපර් කැට්

# 1 සමඟින් ඉදිරියට යන්න. ව්‍යුහයන්ගෙන් පිරුණු ලැයිස්තුවකට වස්තු යොමු කිරීම් වලින් පිරුණු ලැයිස්තුවකට වඩා L1 / L2 හැඹිලි වලට වඩා අදාළ දත්ත මිරිකා ගත හැකිය (නිවැරදි ප්‍රමාණයේ ව්‍යුහය සඳහා).
මැට් ස්ටීවන්සන්

2
උරුමය කලාතුරකින් රැකියාව සඳහා නිවැරදි මෙවලම වන අතර පැතිකඩ නොමැතිව කාර්ය සාධනය ගැන ඕනෑවට වඩා තර්ක කිරීම නරක අදහසකි. පළමුවෙන්ම, ව්‍යුහයන් යොමු කිරීමෙන් සම්මත කළ හැකිය. දෙවනුව, යොමු කිරීම හෝ අගය අනුව ගමන් කිරීම කලාතුරකින් සැලකිය යුතු කාර්ය සාධන ගැටලුවක් වේ. අවසාන වශයෙන්, පංතියක් සඳහා සිදුවිය යුතු අතිරේක ගොඩවල් වෙන් කිරීම සහ කසළ එකතු කිරීම පිළිබඳව ඔබ ගණන් නොගනී. පෞද්ගලිකව මම දේවල් ලෙස සරල-පැරණි දත්ත සහ පංති ලෙස structs හිතන්න කැමති නැහැ ඔබ structs මත ක්රම මෙන්ම අර්ථ දැක්විය හැකි වුවත් දේවල් (වස්තූන්).
weberc2

88

යොමු අර්ථ නිරූපණයට වඩා වටිනාකමේ අර්ථකථන අවශ්‍ය විට ව්‍යුහයක් භාවිතා කරන්න.

සංස්කරණය කරන්න

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

ඔබට යොමු අර්ථකථන අවශ්‍ය නම් ඔබට අවශ්‍ය වන්නේ පන්තියක් නොව ව්‍යුහයකි.


13
හැමෝම ඒක දන්නවා. ඔහු "struct යනු අගය වර්ගයක්" පිළිතුරකට වඩා වැඩි යමක් සොයන බවක් පෙනේ.
TheSmurf

21
එය වඩාත්ම මූලික අවස්ථාව වන අතර මෙම ලිපිය කියවන සහ එය නොදන්නා ඕනෑම අයෙකුට ප්‍රකාශ කළ යුතුය.
ජොෂ්බර්ක්

3
මෙම පිළිතුර සත්‍ය නොවන බව නොවේ; එය පැහැදිලිවම ය. එය ඇත්ත වශයෙන්ම කාරණය නොවේ.
TheSmurf

55
Osh ජොෂ්: දැනටමත් එය නොදන්නා ඕනෑම කෙනෙකුට, එය ප්‍රමාණවත් පිළිතුරක් යැයි පැවසීම, මන්ද එහි තේරුම ඔවුන් නොදන්නා හෙයිනි.
TheSmurf

1
මම මෙය පහත් කොට සලකන්නේ අනෙක් පිළිතුරු වලින් එකක් ඉහළින් තිබිය යුතු යැයි මා සිතන හෙයිනි - “කළමනාකරණය නොකළ කේත සමඟ අන්තර් ක්‍රියා කිරීම සඳහා වෙනත් ආකාරයකින් වළකින්න” යනුවෙන් පවසන ඕනෑම පිළිතුරක්.
ඩැනියෙල් අර්විකර්

60

"එය වටිනාකමක් ඇති" පිළිතුරට අමතරව, ව්‍යුහයන් භාවිතා කිරීම සඳහා එක් විශේෂිත අවස්ථාවක් වන්නේ ඔබ සතුව කසළ එකතු කිරීමේ ගැටළු ඇති කරන දත්ත සමූහයක් ඇති බව ඔබ දන්නා විට සහ ඔබට බොහෝ වස්තු ඇති බවයි. උදාහරණයක් ලෙස, පුද්ගල අවස්ථා විශාල ලැයිස්තුවක් / පෙළක්. මෙහි ස්වාභාවික රූපකය පංතියකි, නමුත් ඔබට දිගු කලක් ජීවත් වූ පුද්ගලයින් විශාල සංඛ්‍යාවක් සිටී නම්, ඔවුන්ට GEN-2 අවහිර වී GC කුටි ඇති විය හැකිය. තත්වය එයට අවශ්‍ය නම්, මෙහි ඇති එක් විභව ප්‍රවේශයක් නම් පුද්ගල ව්‍යුහයන්ගේ පෙළක් (ලැයිස්තුවක් නොවේ) භාවිතා කිරීමයි , එනම් Person[]. දැන්, GEN-2 හි වස්තූන් මිලියන ගණනක් තිබීම වෙනුවට, ඔබට LOH හි තනි කැබැල්ලක් තිබේ (මම මෙහි නූල් ආදිය උපකල්පනය නොකරමි - එනම් කිසිදු සඳහනක් නොමැතිව පිරිසිදු අගයක්). මෙය ඉතා සුළු GC බලපෑමක් ඇති කරයි.

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

int index = ...
int id = peopleArray[index].Id;

සාරධර්ම වෙනස් කළ නොහැකි ලෙස තබා ගැනීම මෙහි උපකාරී වන බව සලකන්න. වඩාත් සංකීර්ණ තර්කනය සඳහා, අතුරු-පරාමිතියක් සහිත ක්‍රමයක් භාවිතා කරන්න:

void Foo(ref Person person) {...}
...
Foo(ref peopleArray[index]);

නැවතත්, මෙය ක්‍රියාත්මක වේ - අපි අගය පිටපත් කර නැත.

ඉතා නිශ්චිත අවස්ථා වලදී, මෙම උපක්‍රමය ඉතා සාර්ථක විය හැකිය; කෙසේ වෙතත්, එය උත්සාහ කළ යුත්තේ තරමක් දියුණු පරිමාණයකි, ඔබ කරන්නේ කුමක්ද සහ ඇයි දැයි ඔබ දන්නේ නම් පමණි. මෙහි පෙරනිමිය පන්තියක් වනු ඇත.


+1 සිත්ගන්නා පිළිතුර. එවැනි ප්‍රවේශයක් භාවිතා කිරීම පිළිබඳව සැබෑ ලෝකයේ කතන්දර බෙදා ගැනීමට ඔබ කැමතිද?
ජෝර්ඩෝ

Ord ජෝර්දාඕ ජංගම දුරකථනයෙන්, නමුත් ගූගල් සඳහා සොයන්න: + gravell + "GC විසින් පහරදීම"
මාක් ග්‍රෙවෙල්

1
ගොඩක් ස්තුතියි. මම එය මෙහි සොයාගත්තා .
ජෝර්ඩෝ

2
Arc මාක්ග්‍රැවෙල් ඔබ සඳහන් කළේ ඇයි: අරාවක් භාවිතා කරන්න (ලැයිස්තුවක් නොවේ) ? Listමම විශ්වාස කරනවා, Arrayතිරය ​​පිටුපස භාවිතා කරයි . නැත ?
රෝයි නමීර්

4
Oy රොයිනමීර් මටත් මේ ගැන කුතුහලයක් ඇති විය, නමුත් මාක්ගේ පිළිතුරේ දෙවන ඡේදයේ පිළිතුර ඇතැයි මම විශ්වාස කරමි. "කෙසේ වෙතත්, එය සෘජුවම අරාවකට ප්‍රවේශ වීමෙන් ව්‍යුහය පිටපත් නොවේ - එය ක්‍රියාත්මක වේ (ලැයිස්තු දර්ශකයට වෙනස්ව, එය පිටපත් කරයි)."
user1323245

41

සිට C # භාෂා පිරිවිතර :

1.7 ව්‍යුහ

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

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

class Point
{
   public int x, y;

   public Point(int x, int y) {
      this.x = x;
      this.y = y;
   }
}

class Test
{
   static void Main() {
      Point[] points = new Point[100];
      for (int i = 0; i < 100; i++) points[i] = new Point(i, i);
   }
}

විකල්පයක් වන්නේ පොයින්ට් ව්‍යුහයක් බවට පත් කිරීමයි.

struct Point
{
   public int x, y;

   public Point(int x, int y) {
      this.x = x;
      this.y = y;
   }
}

දැන්, එක් වස්තුවක් පමණක් ක්ෂණිකව - අරාව සඳහා එකකි - සහ ලක්ෂ්‍ය අවස්ථා අරාව තුළ පේළියේ ගබඩා කර ඇත.

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

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

Point a = new Point(10, 10);
Point b = a;
a.x = 20;
Console.WriteLine(b.x);

ලක්ෂ්‍යය පංතියක් නම්, ප්‍රතිදානය 20 ක් වන බැවින් a සහ b එකම වස්තුවක් යොමු කරයි. ලක්ෂ්‍යය ව්‍යුහයක් නම්, ප්‍රතිදානය 10 ක් වන බැවින් a සිට b දක්වා පැවරීම අගයෙහි පිටපතක් නිර්මාණය කරන අතර අක්ෂයට පසුව පැවරීමෙන් මෙම පිටපත බලපාන්නේ නැත

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


4
ව්‍යුහයන් පිළිබඳ සඳහන දිගටම පැවතිය නොහැකි වීම සමහර විට සීමාවක් වුවද, එය ද ඉතා ප්‍රයෝජනවත් ලක්ෂණයකි. .Net හි එක් ප්‍රධාන දුර්වලතාවයක් නම්, එම වස්තුවේ පාලනය සදහටම අහිමි නොවී විකෘති වස්තුවක් පිළිබඳ සඳහනක් පිටත කේතයෙන් යැවීමට යහපත් ක්‍රමයක් නොමැති වීමයි. ඊට හාත්පසින්ම වෙනස්ව, යමෙකුට බාහිර ක්‍රමයක් refවිකෘති ව්‍යුහයකට ආරක්ෂිතව ලබා දිය හැකි අතර බාහිර ක්‍රමය එය මත සිදුකරන ඕනෑම විකෘති නැවත පැමිණීමට පෙර සිදු කරන බව දනී. එය ඉතා නරකයි .නෙට් හට
කාලානුරූපී

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

34

දත්ත පරමාණුක නිරූපණය සඳහා ව්‍යුහයන් හොඳය, එහිදී එම දත්ත කේතය මඟින් කිහිප වතාවක් පිටපත් කළ හැකිය. වස්තුවක් ක්ලෝන කිරීම සාමාන්‍යයෙන් ව්‍යුහයක් පිටපත් කිරීමට වඩා මිල අධිකය, එයට මතකය වෙන් කිරීම, ඉදිකිරීම්කරු ධාවනය කිරීම සහ එය සිදු කරන විට කසළ එකතු කිරීම ඉවත් කිරීම ඇතුළත් වේ.


4
ඔව්, නමුත් විශාල ව්‍යුහයන් පන්ති යොමු වලට වඩා මිල අධික විය හැකිය (ක්‍රම වෙත ගමන් කරන විට).
ඇලෙක්ස්

27

මෙන්න මූලික රීතියකි.

  • සියලුම සාමාජික ක්ෂේත්‍ර අගය වර්ග නම් ව්‍යුහයක් සාදන්න .

  • ඕනෑම එක් සාමාජික ක්ෂේත්‍රයක් විමර්ශන වර්ගයක් නම්, පන්තියක් සාදන්න . මෙයට හේතුව විමර්ශන වර්ග ක්ෂේත්‍රයට කෙසේ හෝ ගොඩවල් වෙන් කිරීම අවශ්‍ය වේ.

නිදර්ශන

public struct MyPoint 
{
    public int X; // Value Type
    public int Y; // Value Type
}

public class MyPointWithName 
{
    public int X; // Value Type
    public int Y; // Value Type
    public string Name; // Reference Type
}

3
stringවෙනස් කළ නොහැකි විමර්ශන වර්ග අර්ථකථනමය වශයෙන් අගයන්ට සමාන වන අතර, වෙනස් කළ නොහැකි වස්තුවක් ක්ෂේත්‍රයක් තුළට යොමු කිරීම ගොඩවල් වෙන් කිරීමක් සිදු නොකරයි. නිරාවරණය මහජන ක්ෂේත්ර සමග struct හා නිරාවරණය මහජන ක්ෂේත්ර සමග පන්ති වස්තුව අතර වෙනස කේතය අනුක්රමය දී කියා ඇත var q=p; p.X=4; q.X=5;, p.Xනම්, අගය 4 ඇත aව්යුහයකට වර්ගය වන අතර, 5 එය පන්ති වර්ගය වේ නම්. වර්ගයේ සාමාජිකයින්ට පහසුවෙන් වෙනස් කිරීමට යමෙකුට අවශ්‍ය නම්, වෙනස්කම් qවලට බලපෑම් කිරීමට යමෙකුට අවශ්‍යද යන්න මත පදනම්ව 'පන්තිය' හෝ 'ව්‍යුහය' තෝරා ගත යුතුය p.
සුපර් කැට්

ඔව්, මම එකඟ වෙමි සමුද්දේශ විචල්‍යය තොගයේ ඇති නමුත් එය යොමු කරන වස්තුව ගොඩවල් මත පවතිනු ඇත. වෙනස් විචල්‍යයකට පවරා ඇති විට ව්‍යුහයන් සහ පන්ති වෙනස් ලෙස හැසිරුණද, එය ප්‍රබල තීරණාත්මක සාධකයක් යැයි මම නොසිතමි.
උස්මාන් සාෆර්

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

බොහෝ විට ඔබ පංතියක් හෝ ව්‍යුහයක් නිර්මාණය කරන විට එය භාවිතා කරන්නේ කෙසේදැයි ඔබට විශ්වාස නැති නිසා එය ප්‍රබල තීරණාත්මක සාධකයක් නොවන බව මම කීවෙමි. එබැවින් ඔබ නිර්මාණ දෘෂ්ටි කෝණයෙන් දේවල් වඩාත් අර්ථවත් කරන්නේ කෙසේද යන්න පිළිබඳව අවධානය යොමු කරයි. කෙසේ වෙතත් .NET පුස්තකාලයේ එක තැනකවත් මා දැක නැත.
උස්මාන් සාෆර්

1
ව්යුහය වර්ගය ArraySegment<T>ඉතා encapsulates T[]සෑම විටම පන්ති වර්ගය වන. ව්‍යුහ වර්ගය KeyValuePair<TKey,TValue>බොහෝ විට පන්ති වර්ග සමඟ සාමාන්‍ය පරාමිතීන් ලෙස භාවිතා කරයි.
සුපර් කැට්

19

පළමුවැන්න: අන්තර් ක්‍රියාකාරී අවස්ථා හෝ ඔබට මතක පිරිසැලසුම නියම කිරීමට අවශ්‍ය වූ විට

දෙවනුව: දත්ත කෙසේ හෝ විමර්ශන දර්ශකයක ප්‍රමාණයට සමාන වන විට.


17

සාමාන්‍යයෙන් PInvoke සඳහා - StructLayoutAttribute භාවිතා කරමින් මතක සැකැස්ම පැහැදිලිව සඳහන් කිරීමට අවශ්‍ය අවස්ථාවන්හිදී ඔබ "struct" භාවිතා කළ යුතුය.

සංස්කරණය කරන්න: StructLayoutAttribute සමඟ ඔබට පන්තිය හෝ ව්‍යුහය භාවිතා කළ හැකි බව අදහස් දක්වන්න. එය සත්‍යයකි. ප්‍රායෝගිකව, ඔබ සාමාන්‍යයෙන් ව්‍යුහයක් භාවිතා කරනු ඇත - එය කළමනාකරණය කර නොගත් ක්‍රම ඇමතුමකට තර්කයක් යවන්නේ නම් එය අර්ථවත් වන ගොඩට එදිරිව ගොඩගැසී ඇත.


5
StructLayoutAttribute structs හෝ පන්ති සඳහා යෙදිය හැකි බැවින් මෙය structs භාවිතා කිරීමට හේතුවක් නොවේ.
ස්ටීවන් මාටින්

ඔබ කළමනාකරණය නොකළ ක්‍රම ඇමතුමකට තර්කයක් යවන්නේ නම් එය අර්ථවත් වන්නේ ඇයි?
ඩේවිඩ් ක්ලෙම්ප්නර්

16

ඕනෑම ආකාරයක ද්විමය සන්නිවේදන ආකෘතියක් ඇසුරුම් කිරීම හෝ ඉවත් කිරීම සඳහා මම ව්‍යුහයන් භාවිතා කරමි. තැටියට කියවීම හෝ ලිවීම, ඩිරෙක්ට්එක්ස් සිරස් ලැයිස්තු, ජාල ප්‍රොටෝකෝල හෝ සංකේතාත්මක / සම්පීඩිත දත්ත සමඟ කටයුතු කිරීම ඊට ඇතුළත් ය.

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


ඒ සඳහා ඔබට පහසුවෙන් විමර්ශන වර්ගයක් භාවිතා කළ නොහැකිද?
ඩේවිඩ් ක්ලෙම්ප්නර්

15

ධාවන කාලය සහ වෙනත් අය විසින් PInvoke අරමුණු සඳහා කෙලින්ම භාවිතා කරන තක්සේරුකරණ හැරුණු විට, ඔබ භාවිතා කළ යුත්තේ අවස්ථා 2 කදී පමණි.

  1. ඔබට පිටපත් අර්ථ නිරූපණය අවශ්‍ය විට.
  2. ඔබට ස්වයංක්‍රීය ආරම්භයක් අවශ්‍ය වූ විට, සාමාන්‍යයෙන් මෙම වර්ගවල අරා වල.

# 2 බව පෙනේ කොටසක් .Net එකතුව පන්ති struct ව්යාප්තිය හේතුව ..
IAbstract

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

13

.NET සහය value typesසහ reference types(ජාවා හි ඔබට අර්ථ දැක්විය හැක්කේ යොමු වර්ග පමණි). reference typesකළමණාකරන ගොඩවල වෙන් කර ඇති අවස්ථා සහ ඒවා ගැන කැපී පෙනෙන සඳහනක් නොමැති විට එකතු කරනු ලබන කුණු කසළ වේ. අවස්ථා value types, අනිත් අතට, තුළ වෙන් කරනු ලැබේ stack, සහ ඒ නිසා වෙන් මතකය ඔවුන්ගේ විෂය පථය දෙකෙළවර ඉක්මනින් මුහුද ගොඩ කර ඇත. ඇත්ත වශයෙන්ම, value typesවටිනාකමෙන් සහ reference typesයොමු කිරීමෙන් සම්මත වන්න . System.String හැර අනෙකුත් සියලුම C # ප්‍රාථමික දත්ත වර්ග අගය වර්ග වේ.

පන්තිය පුරා struct භාවිතා කළ යුතු විට,

C # දී, structsඇත value types, පංති reference types. C # හි, enumයතුරුපදය සහ මූල පදය භාවිතා කර ඔබට වටිනාකම් වර්ග සෑදිය හැකිය struct. value typeඒ වෙනුවට ආදේශකයක් භාවිතා කිරීමෙන් reference typeකළමනාකරණ ගොඩවල් මත වස්තූන් අඩු වන අතර එමඟින් කුණු එකතු කරන්නා (GC) මත අඩු බරක් පැටවීම, නිතර නිතර සිදුවන GC චක්‍ර සහ එහි ප්‍රති better ලයක් ලෙස වඩා හොඳ ක්‍රියාකාරීත්වයක් ඇති වේ. කෙසේ වෙතත්, value typesඒවායේ අවාසි ද ඇත. structයොමු කිරීමක් සම්මත කිරීමට වඩා විශාල ප්‍රමාණයක් පසු කිරීම අනිවාර්යයෙන්ම මිල අධිකය, එය එක් පැහැදිලි ගැටළුවකි. අනෙක් ගැටළුව වන්නේ ඊට ඉහළින් ඇති පොදු කාර්යයයි boxing/unboxing. එහි boxing/unboxingතේරුම කුමක්දැයි ඔබ කල්පනා කරන්නේ නම්, හොඳ පැහැදිලි කිරීමක් සඳහා මෙම සබැඳි අනුගමනය කරන්නboxing සහunboxing. කාර්ය සාධනය හැරුණු විට, ඔබට වටිනාකම් අර්ථ නිරූපණය කිරීමට වර්ග අවශ්‍ය වන අවස්ථා තිබේ, ඒවා නම් ක්‍රියාත්මක කිරීම ඉතා අපහසු (හෝ කැත)reference typesඔබට ඇති සියල්ල ඔබ භාවිතා කළ යුත්තේ value types, ඔබට පිටපත් අර්ථකථන අවශ්‍ය වූ විට හෝ ස්වයංක්‍රීයව ආරම්භ කිරීම අවශ්‍ය වූ විට, සාමාන්‍යයෙන් arraysමෙම වර්ගවල ය.


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

... (2) විවිධ හේතූන් මත ව්‍යුහයක් සරලව භාවිතා කළ නොහැකි විට [උදා: යමෙකුට ගසක් වැනි දෙයක් සඳහා කැදැලි යොමු භාවිතා කළ යුතු නිසා හෝ කෙනෙකුට බහුමාපකය අවශ්‍ය නිසා]. අගය වර්ග භාවිතා කරන විට, යමෙකු සාමාන්‍යයෙන් නොපැමිණීමට නිශ්චිත හේතුවක් නොමැති කෙලින්ම ක්ෂේත්‍ර නිරාවරණය කළ යුතු බව සලකන්න (බොහෝ පන්ති වර්ග සමඟ ක්ෂේත්‍ර ගුණාංග ඔතා තිබිය යුතුය). Mutable අගය වර්ග ඊනියා "නපුරු" බොහෝ සමහර අවස්තා එය සමහර මන්ද එක් එය කියවීමට පමණක් struct මත දේපල පන්දු පිරිනමන්නා කතා කිරීමට ඉඩ ඇති අතර ගුණ (උදා: ක්ෂේත්ර අනවශ්ය සේ ඔතන සිටත් ...
supercat

... නිවැරදි දේ කරන්න, සියලු සම්පාදකයින් එවැනි ව්‍යුහයන් මත කෙලින්ම ක්ෂේත්‍ර සැකසීමේ උත්සාහයන් නිසි ලෙස ප්‍රතික්ෂේප කරනු ඇත; සම්පාදනය ප්රතික්ෂේප සහතික කිරීම සඳහා හොඳම ක්රමය readOnlyStruct.someMember = 5;බවට පත් කිරීම නොවේ someMemberනම් එය කියවීමට පමණක් දේපල, එහෙත් ඒ වෙනුවට එය ක්ෂේත්රයේ කරන්න.
සුපර් කැට්

13

struct අගය වර්ගය වේ. ඔබ නව විචල්‍යයකට ව්‍යුහයක් පවරන්නේ නම්, නව විචල්‍යයේ මුල් පිටපතක් අඩංගු වේ.

public struct IntStruct {
    public int Value {get; set;}
}

මතකයේ ගබඩා කර ඇති ව්‍යුහයේ අවස්ථා 5 ක් සඳහා පහත සඳහන් ප්‍රති results ල බැහැර කිරීම :

var struct1 = new IntStruct() { Value = 0 }; // original
var struct2 = struct1;  // A copy is made
var struct3 = struct2;  // A copy is made
var struct4 = struct3;  // A copy is made
var struct5 = struct4;  // A copy is made

// NOTE: A "copy" will occur when you pass a struct into a method parameter.
// To avoid the "copy", use the ref keyword.

// Although structs are designed to use less system resources
// than classes.  If used incorrectly, they could use significantly more.

පන්තියේ සැඳහුම වර්ගය වේ. ඔබ නව විචල්‍යයකට පන්තියක් පවරන විට, විචල්‍යයේ මුල් පන්ති වස්තුවට යොමු දැක්වීමක් අඩංගු වේ.

public class IntClass {
    public int Value {get; set;}
}

පහත දැක්වෙන ප්‍රති ex ල මතකයේ රැඳී ඇත්තේ පන්තියේ වස්තුව මතකයේ එක් අවස්ථාවක් පමණි .

var class1 = new IntClass() { Value = 0 };
var class2 = class1;  // A reference is made to class1
var class3 = class2;  // A reference is made to class1
var class4 = class3;  // A reference is made to class1
var class5 = class4;  // A reference is made to class1  

ව්‍යුහය මඟින් කේත අත්වැරැද්දක සම්භාවිතාව වැඩි විය හැක. අගය වස්තුවක් විකෘති යොමු වස්තුවක් ලෙස සලකන්නේ නම්, සිදු කරන ලද වෙනස්කම් අනපේක්ෂිත ලෙස නැති වූ විට සංවර්ධකයෙකු පුදුමයට පත් විය හැකිය.

var struct1 = new IntStruct() { Value = 0 };
var struct2 = struct1;
struct2.Value = 1;
// At this point, a developer may be surprised when 
// struct1.Value is 0 and not 1

13

මම බෙන්ච්මාර්ක් ඩොට්නෙට් සමඟ කුඩා මිණුම් දණ්ඩක් සෑදුවෙමිසංඛ්‍යා වල “ව්‍යුහාත්මක” ප්‍රතිලාභ පිළිබඳ වඩා හොඳ අවබෝධයක් ලබා ගැනීම සඳහා සාදමි. මම ව්‍යුහයන්ගේ (හෝ පංති) අරාව (හෝ ලැයිස්තුව) හරහා ලූප පරීක්ෂා කරමි. එම අරා හෝ ලැයිස්තු නිර්මාණය කිරීම මිණුම් ලකුණෙන් බැහැර ය - “පන්තිය” වඩා බර බව වැඩි මතකයක් උපයෝගී කර ගන්නා අතර GC ද ඊට සම්බන්ධ වේ.

එබැවින් නිගමනය වන්නේ: ලින්ක් සහ සැඟවුණු ව්‍යුහයන් බොක්සිං / අන්බොක්සිං සමඟ ප්‍රවේශම් වන්න සහ මයික්‍රොපයිටිමේෂන් සඳහා ව්‍යුහයන් භාවිතා කිරීම අරා සමඟ තදින් රැඳී සිටින්න.

PS කෝල් ස්ටැක් හරහා struct / class සමත් වීම පිළිබඳ තවත් මිණුම් ලකුණක් ඇත https://stackoverflow.com/a/47864451/506147

BenchmarkDotNet=v0.10.8, OS=Windows 10 Redstone 2 (10.0.15063)
Processor=Intel Core i5-2500K CPU 3.30GHz (Sandy Bridge), ProcessorCount=4
Frequency=3233542 Hz, Resolution=309.2584 ns, Timer=TSC
  [Host] : Clr 4.0.30319.42000, 64bit RyuJIT-v4.7.2101.1
  Clr    : Clr 4.0.30319.42000, 64bit RyuJIT-v4.7.2101.1
  Core   : .NET Core 4.6.25211.01, 64bit RyuJIT


          Method |  Job | Runtime |      Mean |     Error |    StdDev |       Min |       Max |    Median | Rank |  Gen 0 | Allocated |
---------------- |----- |-------- |----------:|----------:|----------:|----------:|----------:|----------:|-----:|-------:|----------:|
   TestListClass |  Clr |     Clr |  5.599 us | 0.0408 us | 0.0382 us |  5.561 us |  5.689 us |  5.583 us |    3 |      - |       0 B |
  TestArrayClass |  Clr |     Clr |  2.024 us | 0.0102 us | 0.0096 us |  2.011 us |  2.043 us |  2.022 us |    2 |      - |       0 B |
  TestListStruct |  Clr |     Clr |  8.427 us | 0.1983 us | 0.2204 us |  8.101 us |  9.007 us |  8.374 us |    5 |      - |       0 B |
 TestArrayStruct |  Clr |     Clr |  1.539 us | 0.0295 us | 0.0276 us |  1.502 us |  1.577 us |  1.537 us |    1 |      - |       0 B |
   TestLinqClass |  Clr |     Clr | 13.117 us | 0.1007 us | 0.0892 us | 13.007 us | 13.301 us | 13.089 us |    7 | 0.0153 |      80 B |
  TestLinqStruct |  Clr |     Clr | 28.676 us | 0.1837 us | 0.1534 us | 28.441 us | 28.957 us | 28.660 us |    9 |      - |      96 B |
   TestListClass | Core |    Core |  5.747 us | 0.1147 us | 0.1275 us |  5.567 us |  5.945 us |  5.756 us |    4 |      - |       0 B |
  TestArrayClass | Core |    Core |  2.023 us | 0.0299 us | 0.0279 us |  1.990 us |  2.069 us |  2.013 us |    2 |      - |       0 B |
  TestListStruct | Core |    Core |  8.753 us | 0.1659 us | 0.1910 us |  8.498 us |  9.110 us |  8.670 us |    6 |      - |       0 B |
 TestArrayStruct | Core |    Core |  1.552 us | 0.0307 us | 0.0377 us |  1.496 us |  1.618 us |  1.552 us |    1 |      - |       0 B |
   TestLinqClass | Core |    Core | 14.286 us | 0.2430 us | 0.2273 us | 13.956 us | 14.678 us | 14.313 us |    8 | 0.0153 |      72 B |
  TestLinqStruct | Core |    Core | 30.121 us | 0.5941 us | 0.5835 us | 28.928 us | 30.909 us | 30.153 us |   10 |      - |      88 B |

කේතය:

[RankColumn, MinColumn, MaxColumn, StdDevColumn, MedianColumn]
    [ClrJob, CoreJob]
    [HtmlExporter, MarkdownExporter]
    [MemoryDiagnoser]
    public class BenchmarkRef
    {
        public class C1
        {
            public string Text1;
            public string Text2;
            public string Text3;
        }

        public struct S1
        {
            public string Text1;
            public string Text2;
            public string Text3;
        }

        List<C1> testListClass = new List<C1>();
        List<S1> testListStruct = new List<S1>();
        C1[] testArrayClass;
        S1[] testArrayStruct;
        public BenchmarkRef()
        {
            for(int i=0;i<1000;i++)
            {
                testListClass.Add(new C1  { Text1= i.ToString(), Text2=null, Text3= i.ToString() });
                testListStruct.Add(new S1 { Text1 = i.ToString(), Text2 = null, Text3 = i.ToString() });
            }
            testArrayClass = testListClass.ToArray();
            testArrayStruct = testListStruct.ToArray();
        }

        [Benchmark]
        public int TestListClass()
        {
            var x = 0;
            foreach(var i in testListClass)
            {
                x += i.Text1.Length + i.Text3.Length;
            }
            return x;
        }

        [Benchmark]
        public int TestArrayClass()
        {
            var x = 0;
            foreach (var i in testArrayClass)
            {
                x += i.Text1.Length + i.Text3.Length;
            }
            return x;
        }

        [Benchmark]
        public int TestListStruct()
        {
            var x = 0;
            foreach (var i in testListStruct)
            {
                x += i.Text1.Length + i.Text3.Length;
            }
            return x;
        }

        [Benchmark]
        public int TestArrayStruct()
        {
            var x = 0;
            foreach (var i in testArrayStruct)
            {
                x += i.Text1.Length + i.Text3.Length;
            }
            return x;
        }

        [Benchmark]
        public int TestLinqClass()
        {
            var x = testListClass.Select(i=> i.Text1.Length + i.Text3.Length).Sum();
            return x;
        }

        [Benchmark]
        public int TestLinqStruct()
        {
            var x = testListStruct.Select(i => i.Text1.Length + i.Text3.Length).Sum();
            return x;
        }
    }

ලැයිස්තු වල භාවිතා කරන විට ව්‍යුහයන් මෙතරම් මන්දගාමී වන්නේ මන්දැයි ඔබ සොයාගෙන තිබේද? ඔබ සඳහන් කළ සැඟවුණු බොක්සිං සහ බොක්සිං ක්‍රීඩාව නිසාද? එසේ නම් එය සිදු වන්නේ ඇයි?
මාර්කෝ ග්‍රඩිනික්

අතිරේක යොමු කිරීමක් අවශ්‍ය නොවන නිසා අරාවෙහි ව්‍යුහයට ප්‍රවේශ වීම ඉක්මන් විය යුතුය. බොක්සිං / අන්බොක්සිං යනු ලින්ක් සඳහා වන අවස්ථාවකි.
රෝමන් පොක්‍රොව්ස්කිජ්

11

C # හෝ වෙනත් .net භාෂාවල ව්‍යුහාත්මක වර්ග සාමාන්‍යයෙන් භාවිතා කරනුයේ ස්ථාවර ප්‍රමාණයේ අගයන් ලෙස හැසිරෙන දේවල් රඳවා ගැනීමට ය. ව්‍යුහ වර්ගවල ප්‍රයෝජනවත් අංගයක් නම්, ව්‍යුහයේ ආකාරයේ නිදසුනක ක්ෂේත්‍රය එය තබා ඇති ගබඩා ස්ථානය වෙනස් කිරීමෙන් වෙනස් කළ හැකි අතර වෙනත් ආකාරයකින් නොවේ. ඕනෑම ක්ෂේත්‍රයක් විකෘති කිරීමට ඇති එකම ක්‍රමය වන්නේ නව අවස්ථාවක් ගොඩනඟා ගැනීම සඳහා ව්‍යුහයක් කේතනය කළ හැකි අතර පසුව ඉලක්කයේ සියලුම ක්ෂේත්‍ර විකෘති කිරීම සඳහා ව්‍යුහාත්මක පැවරුමක් භාවිතා කර ඒවා නව උදාහරණයෙන් වටිනාකම් සමඟ නැවත ලිවීමයි. ව්‍යුහයක් එහි ක්ෂේත්‍රවල පෙරනිමි නොවන අගයන් ඇති අවස්ථාවක් නිර්මාණය කිරීමට ක්‍රමයක් සපයන්නේ නැත්නම්, ව්‍යුහය විකෘති ස්ථානයක ගබඩා කර තිබේ නම් සහ එහි සියලුම ක්ෂේත්‍ර විකෘති වනු ඇත.

ව්‍යුහය පෞද්ගලික පංති වර්ගයේ ක්ෂේත්‍රයක් අඩංගු නම් සහ එහි සාමාජිකයන් ඔතා ඇති පන්ති වස්තුව වෙත හරවා යැවුවහොත්, එය ව්‍යුහ වර්ගයක් සැලසුම් කළ හැකි බව සලකන්න. උදාහරණයක් ලෙස, PersonCollectionශක්තිය ඉදිරිපත් ගුණ SortedByNameහා SortedByIdඑය කිරීමට "මා තුලද" සඳහන් පැවැත්වීමට දෙකම, PersonCollection(ඔවුන්ගේ ඉදිකිරීමටත් දී කට්ටලයක්) සහ ක්රියාත්මක කිරීම GetEnumeratorහෝ ආයාචනා කිරීම මගින් creator.GetNameSortedEnumeratorහෝ creator.GetIdSortedEnumerator. එවැනි ව්‍යුහයන් a හි යොමු දැක්වීමක් මෙන් හැසිරෙනු ඇත PersonCollection, ඒවායේ GetEnumeratorක්‍රම විවිධ ක්‍රමවලට බැඳී ඇති බව හැර PersonCollection. කෙනෙකුට අරාවෙහි කොටසක් ආවරණය කළ හැකි ව්‍යුහයක් ද තිබිය හැකිය (උදා: කෙනෙකුට හැඳින්වීමක් , පූර්ණ ArrayRange<T>සංඛ්‍යාවක් ඇති ව්‍යුහයක් අර්ථ දැක්විය හැකියT[]ArrOffset , සහ intLength, idx0 සිට පරාසය දක්වා වූ දර්ශකයක් සඳහා Length-1ප්‍රවේශ විය හැකි සුචිගත දේපල සමඟ Arr[idx+Offset]). අවාසනාවකට මෙන්, fooඑවැනි ව්‍යුහයක කියවීමට පමණක් නිදසුනක් නම්, වර්තමාන සම්පාදක අනුවාදයන් වැනි ක්‍රියාකාරකම් වලට ඉඩ නොදෙන foo[3]+=4;බැවින් එවැනි ක්‍රියාකාරකම් ක්ෂේත්‍රයන්ට ලිවීමට උත්සාහ කරයිද යන්න තීරණය කිරීමට ඔවුන්ට හැකියාවක් නැත foo.

විචල්ය ප්‍රමාණයේ එකතුවක් ඇති (එය ව්‍යුහය පවතින සෑම විටම පිටපත් කරන බවක් පෙනේ) සමාන ආකාරයේ හැසිරීමට ව්‍යුහයක් සැලසුම් කළ හැකි නමුත් එම කාර්යය කිරීමට ඇති එකම ක්‍රමය වන්නේ කිසිදු වස්තුවක් නොමැති බව සහතික කිරීමයි. struct විසින් එය විකෘති කළ හැකි ඕනෑම දෙයකට නිරාවරණය වනු ඇත. නිදසුනක් ලෙස, කෙනෙකුට පුද්ගලික අරාවක් ඇති අරාව වැනි ව්‍යුහයක් තිබිය හැකි අතර, සුචිගත කරන ලද “දැමීමේ” ක්‍රමය මඟින් නව අරා නිර්මාණය කරයි, එහි අන්තර්ගතය වෙනස් කළ එක් අංගයක් හැර මුල් පිටපතට සමාන වේ. අවාසනාවකට මෙන්, එවැනි ව්‍යුහයන් කාර්යක්ෂමව සිදු කිරීම තරමක් අපහසු විය හැකිය. ව්‍යුහාත්මක අර්ථකථන පහසු විය හැකි අවස්ථා ඇති අතර (උදා: අරාව වැනි එකතුවක් දෛනික කටයුත්තකට යැවීමට හැකිවීම, අමතන්නා සහ ඇමතුම යන දෙකම බාහිර කේතය එකතුව වෙනස් නොකරන බව දන්නා නිසා,


10

නෑ - මම නීතිවලට සම්පූර්ණයෙන්ම එකඟ නැහැ. ඒවා කාර්ය සාධනය සහ ප්‍රමිතිකරණය සමඟ සලකා බැලිය යුතු හොඳ මාර්ගෝපදේශ වන නමුත් හැකියාවන් සැලකිල්ලට ගෙන නොවේ.

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

මෙම අවස්ථාවේ දී, මම සැබෑ ලෝක වස්තූන් ඒවායේ විශාල ස්වරූපයෙන් නිරූපණය කිරීමට පන්ති භාවිතා කරමි, වඩාත් නිවැරදි භාවිතයන් ඇති කුඩා වස්තූන් නිරූපණය කිරීමට මම ව්‍යුහයන් භාවිතා කරමි. ඔබ එය පැවසූ ආකාරය, "වඩාත් සංයුක්ත සමස්තයක්". මූලික පදය සංයුක්ත වීම. පංති වඩා වස්තු දිශානත මූලද්‍රව්‍යයන් වන අතර කුඩා පරිමාණයෙන් වුවද ව්‍යුහයන්ට එම ලක්ෂණ කිහිපයක් තිබිය හැකිය. IMO.

පොදු ස්ථිතික ගුණාංග ඉතා ඉක්මණින් ලබා ගත හැකි Treeview සහ Listview ටැග් වල මම ඒවා බොහෝ දේ භාවිතා කරමි. මෙම තොරතුරු වෙනත් ආකාරයකින් ලබා ගැනීමට මම සැමවිටම වෙහෙස වී සිටිමි. උදාහරණයක් ලෙස, මගේ දත්ත සමුදා යෙදුම් වලදී, මම මේස, එස්පී, කාර්යයන් හෝ වෙනත් ඕනෑම වස්තුවක් ඇති ට්‍රීවීව් එකක් භාවිතා කරමි. මම මගේ ව්‍යුහය නිර්මාණය කර ජනගහනය කර, ටැගය තුළට දමා, එය පිටතට අදින්න, තේරීමේ දත්ත ලබා ගනිමි. මම මෙය පන්තියක් සමඟ නොකරමි!

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


සැහැල්ලු නිශ්චල නොවන වස්තූන් නිරූපණය කිරීම සඳහා ව්‍යුහයන් සංවේදීව භාවිතා කළ හැකිය, නැතහොත් ඒවා සම්බන්ධිත නමුත් ස්වාධීන විචල්‍යයන්ගේ ස්ථාවර කට්ටල නියෝජනය කිරීමට සංවේදීව භාවිතා කළ හැකිය (උදා: ලක්ෂ්‍යයක ඛණ්ඩාංක). එම පිටුවේ ඇති උපදෙස් කලින් අරමුණු ඉටු කර ගැනීම සඳහා නිර්මාණය කර ඇති ව්‍යුහයන් සඳහා හොඳ ය, නමුත් අවසාන අරමුණු ඉටු කර ගැනීම සඳහා නිර්මාණය කර ඇති ව්‍යුහයන් සඳහා එය වැරදිය. මගේ වර්තමාන චින්තනය නම්, ඕනෑම පෞද්ගලික ක්ෂේත්‍රයක් ඇති ව්‍යුහයන් සාමාන්‍යයෙන් දක්වා ඇති විස්තරය සපුරාලිය යුතු නමුත් බොහෝ ව්‍යුහයන් ඔවුන්ගේ සමස්ත තත්වය පොදු ක්ෂේත්‍ර හරහා නිරාවරණය කළ යුතුය.
සුපර් කැට්

“3d ලක්ෂ්‍ය” වර්ගයක් සඳහා වන පිරිවිතරයන් මඟින් එහි මුළු තත්වයම කියවිය හැකි x, y, සහ z හරහා නිරාවරණය වන බව පෙන්නුම් කරයි නම් සහ doubleඑම ඛණ්ඩාංක සඳහා ඕනෑම අගයන් සංයෝජනයක් සමඟ නිදසුනක් නිර්මාණය කළ හැකි නම් , එවැනි පිරිවිතර එයට බල කරයි බහු-නූල් හැසිරීම් පිළිබඳ සමහර විස්තර හැර, නිරාවරණය වූ ක්ෂේත්‍ර ව්‍යුහයකට අර්ථාන්විතව හැසිරෙන්න (සමහර අවස්ථාවලදී වෙනස් කළ නොහැකි පන්තිය වඩා හොඳ වනු ඇති අතර, නිරාවරණය වූ ක්ෂේත්‍ර ව්‍යුහය අනෙක් අයට වඩා හොඳ වනු ඇත; ඊනියා “වෙනස් කළ නොහැකි” ව්‍යුහයක් වනු ඇත සෑම අවස්ථාවකම නරක වන්න).
සුපර් කැට්

8

මගේ රීතිය

1, සෑම විටම පන්තිය භාවිතා කරන්න;

2, කිසියම් කාර්ය සාධන ගැටළුවක් ඇත්නම්, @IAbstract සඳහන් කර ඇති නීතිරීති අනුව යම් පන්තියක් ව්‍යුහයට වෙනස් කිරීමට මම උත්සාහ කරමි, ඉන්පසු මෙම වෙනස්වීම් මඟින් කාර්ය සාධනය වැඩි දියුණු කළ හැකිදැයි පරීක්ෂා කරන්න.


මයික්‍රොසොෆ්ට් නොසලකා හරින සැලකිය යුතු භාවිත නඩුව නම්, යමෙකුට Fooනිශ්චිත වර්ගයක ස්වාධීන අගයන් (උදා: ලක්ෂ්‍යයක ඛණ්ඩාංක) සංයුක්ත කිරීමට අවශ්‍ය වන විට යමෙකුට කණ්ඩායමක් ලෙස ගමන් කිරීමට අවශ්‍ය වන අතර සමහර විට ස්වාධීනව වෙනස් වීමට අවශ්‍ය වේ. සරල නිරාවරණ-ක්ෂේත්‍ර ව්‍යුහයක් තරම්ම අරමුණු දෙකම ඒකාබද්ධ කරන පන්ති භාවිතා කිරීම සඳහා කිසිදු රටාවක් මා සොයාගෙන නැත (එය ස්වාධීන විචල්‍යයන්ගේ ස්ථාවර එකතුවක් වන අතර එය බිල්පතට හොඳින් ගැලපේ).
සුපර් කැට්

1
up සුපර්කැට්: මම හිතන්නේ ඒ සඳහා මයික්‍රොසොෆ්ට් සමාගමට දොස් පැවරීම සම්පූර්ණයෙන්ම සාධාරණ නැහැ. මෙහි ඇති සැබෑ ගැටළුව නම්, වස්තු-නැඹුරු භාෂාවක් ලෙස C # හුදෙක් වැඩි හැසිරීමකින් තොරව දත්ත පමණක් නිරාවරණය කරන සරල වාර්තා වර්ග කෙරෙහි අවධානය යොමු නොකිරීමයි. C # යනු බහු-පරමාදර්ශී භාෂාවක් නොවේ. උදා: C ++. යැයි මම කිව්වා ඉතින්, සමහරවිට C # ද පෙණුනු භාෂාවක් වන අතර, ඉතා ස්වල්ප පිරිසිදු OOP වැඩසටහනක් විශ්වාස කරනවා. (මම මෑතකදී public readonlyමගේ වර්ගවල ක්ෂේත්‍ර නිරාවරණය කිරීම ආරම්භ කර ඇත්තෙමි , මන්ද කියවීමට-පමණක් ගුණාංග නිර්මාණය කිරීම ප්‍රායෝගිකව කිසිදු ප්‍රයෝජනයක් නැති
වැඩකි

1
akstakx: එවැනි වර්ග කෙරෙහි "අවධානය යොමු කිරීම" අවශ්‍ය නොවේ; ඒවා මොනවාදැයි හඳුනා ගැනීම ප්‍රමාණවත් වේ. ව්‍යුහයන් සම්බන්ධයෙන් C # හි ඇති ලොකුම දුර්වලතාවය වන්නේ වෙනත් බොහෝ ක්ෂේත්‍රවල ඇති විශාලතම ගැටළුවයි: භාෂාව යම් යම් පරිවර්තනයන් සිදු වූ විට හෝ සුදුසු නොවන විට ඒවා දැක්වීමට ප්‍රමාණවත් පහසුකම් සපයන්නේ නැත, සහ එවැනි පහසුකම් නොමැතිකම අවාසනාවන්ත නිර්මාණ තීරණ වලට හේතු වේ. නිදසුනක් ලෙස, "විකෘති ව්‍යුහයන්ගෙන් 99% ක්ම නපුරු" සම්පාදකයා MyListOfPoint[3].Offset(2,3);බවට var temp=MyListOfPoint[3]; temp.Offset(2,3);පත්වීමෙන් පැන නගී , එය පරිණාමනය කරන විට ව්‍යාජ වේ ...
සුපර් කැට්

... Offsetක්‍රමයට. එවැනි ව්‍යාජ කේත වලක්වා ගැනීම සඳහා නිසි ක්‍රමය ව්‍යුහයන් අනවශ්‍ය ලෙස වෙනස් කළ නොහැකි අතර, ඒ වෙනුවට Offsetඉහත සඳහන් කළ පරිවර්තනය තහනම් කරන ගුණාංගයක් සමඟ ටැග් කිරීමට ඉඩ දීම . ඔවුන්ගේ ආයාචනය පැහැදිලිව පෙනෙන අවස්ථාවන්හිදී පමණක් අදාළ වන පරිදි ඒවා ටැග් කළ හැකි නම් ව්‍යංග සංඛ්‍යාත්මක පරිවර්තනයන් ද වඩා හොඳ විය හැකිය. Overloads සඳහා පවතී නම් foo(float,float)සහ foo(double,double), මම භාවිතා කිරීමට උත්සාහ කරන හිතුවෙ floatසහ doubleබොහෝ විට ගම්ය පරිවර්තනය අදාළ නොකළ යුතුය, එහෙත් ඒ වෙනුවට දෝෂයක් විය යුතුය.
සුපර් කැට්

doubleඅගයකට a ජුවම පැවරීම float, හෝ එය floatතර්කයක් ගත හැකි නමුත් එය කළ නොහැකි ක්‍රමයකට යොමු කිරීම double, සෑම විටම පාහේ ක්‍රමලේඛකයා අදහස් කළ දේ කරයි. ඊට වෙනස්ව, පැහැදිලි යතුරුලියනයකින් තොරව floatප්‍රකාශනය පැවරීම doubleබොහෝ විට වැරැද්දකි. ව්‍යංග double->floatපරිවර්තනයට ඉඩ දෙන එකම අවස්ථාව වන්නේ ගැටළු වලට හේතු වනු ඇත්තේ එය වඩා අඩු පරමාදර්ශී බරක් තෝරා ගැනීමයි. එය වළක්වා ගැනීම සඳහා නිවැරදි ක්‍රමය implcit double-> float තහනම් නොවිය යුතු බව මම ප්‍රකාශ කරමි, නමුත් පරිවර්තනයට ඉඩ නොදෙන ගුණාංග සහිත අධික බර පැටවීම.
සුපර් කැට්

8

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

පන්ති සහ ව්‍යුහයන් (සී # ක්‍රමලේඛන මාර්ගෝපදේශය)


සම්බන්ධිත නමුත් ස්වාධීන විචල්‍යයන් කිහිපයක් ඩක් ටේප් සමඟ සවි කිරීමට අවශ්‍ය අවස්ථාවන්හිදී ව්‍යුහයන් ද ඉතා හොඳ ය (උදා: ලක්ෂ්‍යයක ඛණ්ඩාංක). යමෙකු වස්තූන් මෙන් හැසිරෙන ව්‍යුහයන් නිෂ්පාදනය කිරීමට උත්සාහ කරන්නේ නම් එම්එස්ඩීඑන් මාර්ගෝපදේශ සාධාරණ ය, නමුත් සමස්ථයන් සැලසුම් කිරීමේදී ඊට වඩා බෙහෙවින් අඩු ය; ඒවායින් සමහරක් පසුකාලීන තත්වය තුළ හරියටම පාහේ වැරදිය . නිදසුනක් ලෙස, වර්ගයක් මගින් සංයුක්ත කර ඇති විචල්‍යයන්ගේ ස්වාධීනත්වයේ තරම, වෙනස් කළ නොහැකි පන්තියකට වඩා නිරාවරණ-ක්ෂේත්‍ර ව්‍යුහයක් භාවිතා කිරීමේ වාසිය වැඩි වේ.
සුපර් කැට්

8

මිථ්‍යාව # 1: ව්‍යුහයන් සැහැල්ලු පංති වේ

මෙම මිථ්‍යාව විවිධ ස්වරූපයෙන් පැමිණේ. සමහර අය විශ්වාස කරන්නේ වටිනාකම් වර්ග වලට ක්‍රම හෝ වෙනත් වැදගත් හැසිරීම් තිබිය නොහැකි හෝ නොතිබිය යුතු බවයි - ඒවා පොදු ක්ෂේත්‍ර හෝ සරල ගුණාංග සහිත සරල දත්ත හුවමාරු වර්ග ලෙස භාවිතා කළ යුතුය. ඩේටයිම් වර්ගය මේ සඳහා හොඳ ප්‍රති-ආදර්ශයකි: එය අංකයක් හෝ අක්ෂරයක් වැනි මූලික ඒකකයක් ලෙස සලකන විට එය අගය වර්ගයක් ලෙස අර්ථවත් වන අතර එය මත පදනම්ව ගණනය කිරීම් සිදු කිරීමට හැකිවීම අර්ථවත් කරයි. එහි වටිනාකම. අනෙක් දිශාවෙන් දේවල් දෙස බලන විට, දත්ත හුවමාරු වර්ග බොහෝ විට කෙසේ හෝ විමර්ශන වර්ග විය යුතුය - තීරණය පදනම් විය යුත්තේ අපේක්ෂිත අගය හෝ විමර්ශන වර්ගයේ අර්ථ නිරූපණය මත මිස වර්ගයේ සරල බව මත නොවේ. අනෙක් අය විශ්වාස කරන්නේ කාර්ය සාධනය අනුව විමර්ශන වර්ගවලට වඩා අගය වර්ග “සැහැල්ලු” බවයි. සත්යය නම්, සමහර අවස්ථාවල අගය වර්ග වඩා කාර්ය සාධනයයි - ඒවා කොටු කර ඇත්නම් මිස කසළ එකතු කිරීම අවශ්ය නොවේ, ඉහළින් වර්ග හඳුනාගැනීමේ හැකියාවක් නැත, සහ නිදසුන් කිරීම අවශ්ය නොවේ. නමුත් වෙනත් ආකාරවලින්, විමර්ශන වර්ග වඩාත් ක්‍රියාකාරී වේ - පරාමිති සම්මත කිරීම, විචල්‍යයන්ට අගයන් පැවරීම, ආපසු එන අගයන් සහ ඒ හා සමාන මෙහෙයුම් සඳහා අවශ්‍ය වන්නේ බයිට් 4 ක් හෝ 8 ක් පමණි. (ඔබ 32-බිට් හෝ 64-බිට් සීඑල්ආර් ධාවනය කරන්නේද යන්න මත පදනම්ව) ) සියලු දත්ත පිටපත් කරනවාට වඩා. අරේලිස්ට් කෙසේ හෝ “පිරිසිදු” අගය වර්ගයක් නම්, අරේලිස්ට් ප්‍රකාශනයක් එහි සියලු දත්ත පිටපත් කිරීමේ ක්‍රමයකට යොමු කිරීම ගැන සිතා බලන්න! සෑම අවස්ථාවකම පාහේ, කාර්ය සාධනය සැබවින්ම තීරණය වන්නේ මේ ආකාරයේ තීරණයකින් නොවේ. බාධක කිසි විටෙකත් ඒවා වනු ඇතැයි ඔබ සිතන තැනක් නොවන අතර කාර්ය සාධනය මත පදනම්ව සැලසුම් තීරණයක් ගැනීමට පෙර, ඔබ විවිධ විකල්ප මැනිය යුතුය. විශ්වාසයන් දෙකේ සංයෝජනය ද ක්‍රියාත්මක නොවන බව සඳහන් කිරීම වටී. වර්ගයකට ක්‍රම කීයක් තිබේද යන්න ගැටළුවක් නොවේ (එය පන්තියක් හෝ ව්‍යුහයක් වේවා) - උදාහරණයක් ලෙස ගත් මතකයට එය බලපාන්නේ නැත. (කේතය සඳහාම ලබාගත් මතකය අනුව පිරිවැයක් ඇත, නමුත් එය එක් එක් අවස්ථාවට වඩා එක් වරක් වැය වේ.)

මිථ්‍යාව # 2: ගොඩවල් මත ජීවත්වන යොමු සටහන්; අගය වර්ගයන් තොගයේ ජීවත් වේ

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

මිථ්‍යාව # 3: අරමුණු # C හි යොමු කිරීම මගින් අසාර්ථක වේ

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

void AppendHello(StringBuilder builder)
{
    builder.Append("hello");
}

මෙම ක්‍රමය හැඳින්වූ විට, පරාමිති අගය (StringBuilder වෙත යොමු කිරීම) අගය මගින් සම්මත වේ. ඔබ ක්‍රමවේදය තුළ තනන්නා විචල්‍යයේ අගය වෙනස් කළහොත් example නිදසුනක් ලෙස, බිල්ඩර් = ශුන්‍ය ප්‍රකාශය සමඟ - එම වෙනස මිථ්‍යාවට පටහැනිව, අමතන්නා විසින් නොපෙනේ. මිථ්‍යාවේ “යොමු දැක්වීමෙන්” බිටු සාවද්‍ය බව පමණක් නොව “වස්තූන් සම්මත” බිට් ද වීම සිත්ගන්නා කරුණකි. වස්තූන් කිසි විටෙකත් යොමු කිරීමෙන් හෝ වටිනාකමින් සම්මත නොවේ. විමර්ශන වර්ගයක් සම්බන්ධ වූ විට, විචල්‍යය යොමු කිරීම මගින් හෝ තර්කයේ අගය (යොමු කිරීම) අගය මගින් සම්මත වේ. වෙනත් ඕනෑම දෙයක් හැරුණු විට, මෙය ශුන්‍යය අගය-වටිනා තර්කයක් ලෙස භාවිතා කළ විට කුමක් සිදුවේද යන ප්‍රශ්නයට පිළිතුරු සපයයි. වෙනුවට, ශුන්‍ය යොමුව වෙනත් ඕනෑම සඳහනකට සමානය. මෙම ඉක්මන් පැහැදිලි කිරීම ඔබව ව්‍යාකූල කර ඇත්නම්, “C # හි පරාමිතිය පසු කිරීම” යන මගේ ලිපිය බැලීමට ඔබට අවශ්‍ය විය හැකිය (http://mng.bz/otVt ), එය වඩාත් විස්තරාත්මකව දක්වයි. මෙම මිථ්‍යාවන් අවට පමණක් නොවේ. බොක්සිං සහ අන්බොක්සිං පැමිණෙන්නේ ඔවුන්ගේ වැරදි වැටහීම නිසා, මම ඊළඟට එය ඉවත් කිරීමට උත්සාහ කරමි.

යොමුව: ජෝන් ස්කීට් විසින් ගැඹුර 3 වන සංස්කරණයේ C #


1
ඔබ නිවැරදි යැයි උපකල්පනය කිරීම ඉතා හොඳයි. යොමු කිරීමක් එකතු කිරීම ද ඉතා හොඳයි.
NoChance

5

මම හිතන්නේ හොඳ පළමු ඇස්තමේන්තුව "කවදාවත්" නොවේ.

මම හිතන්නේ හොඳ දෙවන දළ විශ්ලේෂණයක් "කවදාවත්" නොවේ.

ඔබ පරිපූර්ණත්වය සඳහා මංමුලා සහගත නම්, ඒවා සලකා බලන්න, නමුත් සෑම විටම මැන බලන්න.


25
මම එම පිළිතුරට එකඟ නොවෙමි. බොහෝ අවස්ථා වලදී ව්‍යුහයන්ට නීත්‍යානුකූල භාවිතයක් ඇත. මෙන්න උදාහරණයක් - දත්ත හරස් ක්‍රියාවලි පරමාණුක ආකාරයෙන් මාර්ෂල් කිරීම.
ෆ්‍රැන්සි පෙන්ොව්

25
ඔබ ඔබේ ලිපිය සංස්කරණය කර ඔබේ කරුණු විස්තාරණය කළ යුතුය - ඔබ ඔබේ මතය ලබා දී ඇත, නමුත් ඔබ මෙම මතය ගන්නේ මන්ද යන්න සමඟ ඔබ එය උපස්ථ කළ යුතුය.
එරික් ෆෝබ්ස්

4
ව්‍යුහයන් භාවිතා කිරීම සඳහා ඔවුන්ට ටොටින් චිප් කාඩ් පතට ( en.wikipedia.org/wiki/Totin%27_Chip ) සමාන යැයි මම සිතමි . බරපතල ලෙස.
ග්‍රෙග්

4
87.5K පුද්ගලයෙකු මෙවැනි පිළිතුරක් පළ කරන්නේ කෙසේද? ඔහු කුඩා කාලයේදීම එය කළාද?
රෝහිත් විපින් මැතිව්ස්

3
Oh රෝහිත් - එය වසර හයකට පෙර; අඩවි ප්‍රමිතීන් එකල බෙහෙවින් වෙනස් විය. මෙය තවමත් නරක පිළිතුරකි, නමුත් ඔබ හරි.
ආර්නෝල්ඩ්

5

මම වින්ඩෝස් සන්නිවේදන පදනම [WCF] නම් කරන ලද පයිප් සමඟ ගනුදෙනු කරමින් සිටියෙමි. දත්ත හුවමාරුව විමර්ශන වර්ගය වෙනුවට වටිනාකමින් යුතු බව සහතික කිරීම සඳහා ව්‍යුහයන් භාවිතා කිරීම අර්ථවත් බව මම දුටුවෙමි .


1
මෙය සියල්ලන්ගේ හොඳම ඉඟියයි, IMHO.
අයිවන්

4

C # struct යනු පන්තියකට සැහැල්ලු විකල්පයකි. එය පංතියකට සමාන දෙයක් කළ හැකි නමුත් පන්තියකට වඩා ව්‍යුහයක් භාවිතා කිරීම අඩු “මිල අධික” ය. මේ සඳහා හේතුව මඳක් තාක්‍ෂණික ය, නමුත් සාරාංශයක් ලෙස, පංතියක නව අවස්ථා ගොඩවල් මත තබා ඇති අතර, එහිදී අළුත් ක්ෂණික ව්‍යුහයන් තොගයේ තබා ඇත. තවද, ඔබ පන්ති සමඟ මෙන් ව්‍යුහයන් පිළිබඳ යොමු කිරීම් සමඟ කටයුතු නොකරන අතර ඒ වෙනුවට ඔබ සෘජුවම වැඩ කරන්නේ ව්‍යුහාත්මක උදාහරණය සමඟ ය. මෙයින් අදහස් වන්නේ ඔබ ශ්‍රිතයක් වෙත ව්‍යුහයක් සම්මත කළ විට එය යොමු කිරීමක් ලෙස නොව අගය අනුව බවයි. ක්‍රියාකාරී පරාමිතීන් පිළිබඳ පරිච්ඡේදයේ මේ ගැන වැඩි විස්තර ඇත.

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


3

කසළ එකතු කිරීමේ කාර්ය සාධනය වැඩි දියුණු කිරීම සඳහා ව්‍යුහය භාවිතා කළ හැකිය. ඔබ සාමාන්‍යයෙන් GC ක්‍රියාකාරිත්වය ගැන කරදර විය යුතු නැති අතර, එය ler ාතකයෙකු විය හැකි අවස්ථා තිබේ. අඩු ප්‍රමාද යෙදුම්වල විශාල හැඹිලි මෙන්. උදාහරණයක් සඳහා මෙම ලිපිය බලන්න:

http://00sharp.wordpress.com/2013/07/03/a-case-for-the-struct/


3

ව්‍යුහය හෝ අගය වර්ග පහත දැක්වෙන අවස්ථා වලදී භාවිතා කළ හැකිය -

  1. කසළ එකතු කිරීමෙන් වස්තුව එකතු කිරීම වැළැක්වීමට ඔබට අවශ්‍ය නම්.
  2. එය සරල වර්ගයක් නම් සහ කිසිදු සාමාජික ශ්‍රිතයක් එහි නිදර්ශන ක්ෂේත්‍ර වෙනස් නොකරයි
  3. වෙනත් වර්ග වලින් ව්‍යුත්පන්න කිරීමට හෝ වෙනත් වර්ග වලට ව්‍යුත්පන්න කිරීමට අවශ්‍යතාවයක් නොමැති නම්.

මෙම සබැඳියෙන් ඔබට වටිනාකම් වර්ග සහ වටිනාකම් වර්ග ගැන වැඩි විස්තර දැනගත හැකිය


3

කෙටියෙන්, struct භාවිතා කරන්නේ නම්:

1- ඔබේ වස්තු ගුණාංග / ක්ෂේත්‍ර වෙනස් කිරීම අවශ්‍ය නොවේ. මම අදහස් කළේ ඔබට අවශ්‍ය වන්නේ ඔවුන්ට ආරම්භක අගයක් ලබා දී ඒවා කියවන්න.

2- ඔබේ වස්තුවෙහි ඇති ගුණාංග සහ ක්ෂේත්‍ර අගය වර්ගය වන අතර ඒවා එතරම් විශාල නොවේ.

එය එසේ නම්, ඔබට වඩා හොඳ කාර්ය සාධනයක් සහ ප්‍රශස්ත මතක වෙන් කිරීමක් සඳහා ව්‍යුහයන්ගෙන් ප්‍රයෝජන ගත හැකිය.


2

මම කලාතුරකින් දේවල් සඳහා ව්‍යුහයක් භාවිතා කරමි. නමුත් ඒ මම පමණයි. එය රඳා පවතින්නේ මට වස්තුව අවලංගු කිරීමට අවශ්‍යද නැද්ද යන්න මතය.

වෙනත් පිළිතුරු වල සඳහන් පරිදි, මම සැබෑ ලෝක වස්තු සඳහා පන්ති භාවිතා කරමි. කුඩා දත්ත ප්‍රමාණයක් ගබඩා කිරීම සඳහා ව්‍යුහයන්ගේ මානසිකත්වය ද මා සතුව ඇත.


-11

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


2
ව්‍යුහයන් උරුම කර ගත නොහැක, msdn.microsoft.com/en-us/library/0taef578.aspx
HimBromBeere
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.