I’ve got a dictionary in which i’m storing instantiated structs.
Server.cs
// Create an empty list of shards
public static Dictionary<Guid, Shard> shards = new Dictionary<Guid, Shard>();
// Shard struct
public struct Shard
{
public Guid ShardId;
public int PlayerCount;
public int MaxPlayers;
public Dictionary<int, Client> Clients;
// Shard constructor
public Shard(Guid _shardId, int _playerCount, int _maxPlayers, Dictionary<int, Client> _clients)
{
ShardId = _shardId;
PlayerCount = _playerCount;
MaxPlayers = _maxPlayers;
Clients = _clients;
}
}
In my ServerHandle.cs I’m trying to change the PlayerCount value:
if (Server.shards.Count == 0)
{
Console.WriteLine("No shard in the dictionary so far, creating shard.");
Server.Shard shard = new Server.Shard(new Guid(), 0, 2, new Dictionary<int, Client>());
Console.WriteLine("Created shard, adding it to the dictionary.");
Server.shards.Add(shard.ShardId, shard);
}
foreach (Server.Shard shard in Server.shards.Values)
{
shard.Clients.Add(Server.clients[_fromClient].id, Server.clients[_fromClient]);
shard.PlayerCount++; <--- This doesn't work
Console.WriteLine($"Added Client to the shard. Clients in shard: {shard.Clients.Count}");
Console.WriteLine($"Shard PlayerCount: {shard.PlayerCount}");
break;
}
But I just learned that integers in a foreach loop are immutable in C#.I’ve tried various things like adding a function in my Server.cs class to increment the PlayerCount, but nothing seems to work. I’m struggling for over 3 hours now only for an int + 1.
What am i doing wrong, and how can i solve it?
edit: Markdown
Let’s correct something you said:
But I just learned that integers in a foreach loop are immutable in C#
This isn’t true. But you’re barking up the right tree and there’s a reason C# is stopping you.
What’s really happening here is structs are value objects, and you didn’t realize what that meant. If you assign a struct to a variable, a copy is made and the variable holds the value. You can test this out easily:
Check on these two objects and you’ll find s2’s player count is 11 but s1’s is 10. Maybe that didn’t surprise you. Let’s make it interesting.
That loop is basically what a foreach
loop does. You’ll see it print 11 for each player count. But then the foreach
loop prints 10 for each. Why?
This line makes a COPY of the shard:
That means s
is not the same object. You can change it, but since it’s not assigned back into the array the change is lost. THIS is why the foreach
won’t let you change the value: it’s a mistake and you have no way to fix it within the loop.
I could fix the code snippet above:
That gets everything in sync, because now we put the copies back in the array. It’s hard to remember this. That’s why, in general, we tell people do not use a struct unless you have very specific reasons. Your Shard
struct breaks almost every rule we ask people to follow when choosing a ._3bX7W3J0lU78fp7cayvNxx{max-width:208px;text-align:center} ._1PeZajQI0Wm8P3B45yshR{fill:var(–newCommunityTheme-actionIcon)}._1PeZajQI0Wm8P3B45yshR._3axV0unm-cpsxoKWYwKh2x{fill:#ea0027} ._1x9diBHPBP-hL1JiwUwJ5J{font-size:14px;font-weight:500;line-height:18px;color:#ff585b;padding-left:3px;padding-right:24px}._2B0OHMLKb9TXNdd9g5Ere-,._1xKxnscCn2PjBiXhorZef4{height:16px;padding-right:4px;vertical-align:top}._1LLqoNXrOsaIkMtOuTBmO5{height:20px;padding-right:8px;vertical-align:bottom}.QB2Yrr8uihZVRhvwrKuMS{height:18px;padding-right:8px;vertical-align:top}._3w_KK8BUvCMkCPWZVsZQn0{font-size:14px;font-weight:500;line-height:18px;color:var(–newCommunityTheme-actionIcon)}._3w_KK8BUvCMkCPWZVsZQn0 ._1LLqoNXrOsaIkMtOuTBmO5,._3w_KK8BUvCMkCPWZVsZQn0 ._2B0OHMLKb9TXNdd9g5Ere-,._3w_KK8BUvCMkCPWZVsZQn0 ._1xKxnscCn2PjBiXhorZef4,._3w_KK8BUvCMkCPWZVsZQn0 .QB2Yrr8uihZVRhvwrKuMS{fill:var(–newCommunityTheme-actionIcon)} ._33axOHPa8DzNnTmwzen-wO{font-size:14px;font-weight:700;letter-spacing:.5px;line-height:32px;text-transform:uppercase;display:block;padding:0 16px;width:100%} .FIYolDqalszTnjjNfThfT{max-width:256px;white-space:normal;text-align:center} ._9ZuQyDXhFth1qKJF4KNm8{padding:12px 12px 40px}._2iNJX36LR2tMHx_unzEkVM,._1JmnMJclrTwTPpAip5U_Hm{font-size:16px;font-weight:500;line-height:20px;color:var(–newCommunityTheme-bodyText);margin-bottom:40px;padding-top:4px}._306gA2lxjCHX44ssikUp3O{margin-bottom:32px}._1Omf6afKRpv3RKNCWjIyJ4{font-size:18px;font-weight:500;line-height:22px;border-bottom:2px solid var(–newCommunityTheme-line);color:var(–newCommunityTheme-bodyText);margin-bottom:8px;padding-bottom:8px}._2Ss7VGMX-UPKt9NhFRtgTz{margin-bottom:24px}._3vWu4F9B4X4Yc-Gm86-FMP{border-bottom:1px solid var(–newCommunityTheme-line);margin-bottom:8px;padding-bottom:2px}._3vWu4F9B4X4Yc-Gm86-FMP:last-of-type{border-bottom-width:0}._2qAEe8HGjtHsuKsHqNCa9u{font-size:14px;font-weight:500;line-height:18px;color:var(–newCommunityTheme-bodyText);padding-bottom:8px;padding-top:8px}.c5RWd-O3CYE-XSLdTyjtI{padding:8px 0}._3whORKuQps-WQpSceAyHuF{font-size:12px;font-weight:400;line-height:16px;color:var(–newCommunityTheme-actionIcon);margin-bottom:8px}._1Qk-ka6_CJz1fU3OUfeznu{margin-bottom:8px}._3ds8Wk2l32hr3hLddQshhG{font-weight:500}._1h0r6vtgOzgWtu-GNBO6Yb,._3ds8Wk2l32hr3hLddQshhG{font-size:12px;line-height:16px;color:var(–newCommunityTheme-actionIcon)}._1h0r6vtgOzgWtu-GNBO6Yb{font-weight:400}.horIoLCod23xkzt7MmTpC{font-size:12px;font-weight:400;line-height:16px;color:#ea0027}._33Iw1wpNZ-uhC05tWsB9xi{margin-top:24px}._2M7LQbQxH40ingJ9h9RslL{font-size:12px;font-weight:400;line-height:16px;color:var(–newCommunityTheme-actionIcon);margin-bottom:8px} .s5ap8yh1b4ZfwxvHizW3f{color:var(–newCommunityTheme-metaText);padding-top:5px}.s5ap8yh1b4ZfwxvHizW3f._19JhaP1slDQqu2XgT3vVS0{color:#ea0027} ._1EPynDYoibfs7nDggdH7Gq{margin-bottom:8px;position:relative}._1EPynDYoibfs7nDggdH7Gq._3-0c12FCnHoLz34dQVveax{max-height:63px;overflow:hidden}._1zPvgKHteTOub9dKkvrOl4{font-family:Noto Sans,Arial,sans-serif;font-size:14px;line-height:21px;font-weight:400;word-wrap:break-word}._1dp4_svQVkkuV143AIEKsf{-ms-flex-align:baseline;align-items:baseline;background-color:var(–newCommunityTheme-body);bottom:-2px;display:-ms-flexbox;display:flex;-ms-flex-flow:row nowrap;flex-flow:row nowrap;padding-left:2px;position:absolute;right:-8px}._5VBcBVybCfosCzMJlXzC3{font-family:Noto Sans,Arial,sans-serif;font-size:14px;font-weight:400;line-height:21px;color:var(–newCommunityTheme-bodyText)}._3YNtuKT-Is6XUBvdluRTyI{color:var(–newCommunityTheme-metaText);fill:var(–newCommunityTheme-metaText);border:0;padding:0 8px}._3YNtuKT-Is6XUBvdluRTyI:active,._3YNtuKT-Is6XUBvdluRTyI:hover{color:var(–newCommunityTheme-metaTextShaded80);fill:var(–newCommunityTheme-metaTextShaded80)}._3YNtuKT-Is6XUBvdluRTyI:disabled,._3YNtuKT-Is6XUBvdluRTyI[data-disabled],._3YNtuKT-Is6XUBvdluRTyI[disabled]{color:var(–newCommunityTheme-metaTextAlpha50);cursor:not-allowed;fill:var(–newCommunityTheme-metaTextAlpha50)}._2ZTVnRPqdyKo1dA7Q7i4EL{transition:all .1s linear 0s}.k51Bu_pyEfHQF6AAhaKfS{transition:none}._2qi_L6gKnhyJ0ZxPmwbDFK{transition:all .1s linear 0s;display:block;background-color:var(–newCommunityTheme-field);border-radius:4px;padding:8px;margin-bottom:12px;margin-top:8px;border:1px solid var(–newCommunityTheme-canvas);cursor:pointer}._2qi_L6gKnhyJ0ZxPmwbDFK:focus{outline:none}._2qi_L6gKnhyJ0ZxPmwbDFK:hover{border:1px solid var(–newCommunityTheme-button)}._2qi_L6gKnhyJ0ZxPmwbDFK._3GG6tRGPPJiejLqt2AZfh4{transition:none;border:1px solid var(–newCommunityTheme-button)}.IzSmZckfdQu5YP9qCsdWO{cursor:pointer;transition:all .1s linear 0s}.IzSmZckfdQu5YP9qCsdWO ._1EPynDYoibfs7nDggdH7Gq{border:1px solid transparent;border-radius:4px;transition:all .1s linear 0s}.IzSmZckfdQu5YP9qCsdWO:hover ._1EPynDYoibfs7nDggdH7Gq{border:1px solid var(–newCommunityTheme-button);padding:4px}._1YvJWALkJ8iKZxUU53TeNO{font-size:12px;font-weight:700;line-height:16px;color:var(–newCommunityTheme-button)}._3adDzm8E3q64yWtEcs5XU7{display:-ms-flexbox;display:flex}._3adDzm8E3q64yWtEcs5XU7 ._3jyKpErOrdUDMh0RFq5V6f{-ms-flex:100%;flex:100%}._3adDzm8E3q64yWtEcs5XU7 .dqhlvajEe-qyxij0jNsi0{color:var(–newCommunityTheme-button)}._3adDzm8E3q64yWtEcs5XU7 ._12nHw-MGuz_r1dQx5YPM2v,._3adDzm8E3q64yWtEcs5XU7 .dqhlvajEe-qyxij0jNsi0{font-size:12px;font-weight:700;line-height:16px;cursor:pointer;-ms-flex-item-align:end;align-self:flex-end;-webkit-user-select:none;-ms-user-select:none;user-select:none}._3adDzm8E3q64yWtEcs5XU7 ._12nHw-MGuz_r1dQx5YPM2v{color:var(–newCommunityTheme-button);margin-right:8px;color:var(–newCommunityTheme-errorText)}._3zTJ9t4vNwm1NrIaZ35NS6{font-family:Noto Sans,Arial,sans-serif;font-size:14px;line-height:21px;font-weight:400;word-wrap:break-word;width:100%;padding:0;border:none;background-color:transparent;resize:none;outline:none;cursor:pointer;color:var(–newRedditTheme-bodyText)}._2JIiUcAdp9rIhjEbIjcuQ-{resize:none;cursor:auto}._2I2LpaEhGCzQ9inJMwliNO{display:inline-block}._2I2LpaEhGCzQ9inJMwliNO,._42Nh7O6pFcqnA6OZd3bOK{margin-left:4px;vertical-align:middle}._42Nh7O6pFcqnA6OZd3bOK{fill:var(–newCommunityTheme-button);height:16px;width:16px;margin-bottom:2px} ._2cHgYGbfV9EZMSThqLt2tx{margin-bottom:16px;border-radius:4px}._3Q7WCNdCi77r0_CKPoDSFY{width:75%;height:24px}._2wgLWvNKnhoJX3DUVT_3F-,._3Q7WCNdCi77r0_CKPoDSFY{background:var(–newCommunityTheme-field);background-size:200%;margin-bottom:16px;border-radius:4px}._2wgLWvNKnhoJX3DUVT_3F-{width:100%;height:46px} .Rd5g7JmL4Fdk-aZi1-U_V{transition:all .1s linear 0s}._2TMXtA984ePtHXMkOpHNQm{font-size:16px;font-weight:500;line-height:20px;margin-bottom:4px}.CneW1mCG4WJXxJbZl5tzH{border-top:1px solid var(–newRedditTheme-line);margin-top:16px;padding-top:16px}._11ARF4IQO4h3HeKPpPg0xb{transition:all .1s linear 0s;display:none;fill:var(–newCommunityTheme-button);height:16px;width:16px;vertical-align:middle;margin-bottom:2px;margin-left:4px;cursor:pointer}._1I3N-uBrbZH-ywcmCnwv_B:hover ._11ARF4IQO4h3HeKPpPg0xb{display:inline-block}._33CSUrVoafEXJUDX3qOQtf{height:12px;width:12px;margin-bottom:2px;margin-right:4px;vertical-align:middle;fill:var(–newRedditTheme-metaText)}._2IvhQwkgv_7K0Q3R0695Cs{border-radius:4px;border:1px solid var(–newCommunityTheme-line)}._2IvhQwkgv_7K0Q3R0695Cs:focus{outline:none}._1I3N-uBrbZH-ywcmCnwv_B{transition:all .1s linear 0s;border-radius:4px;border:1px solid var(–newCommunityTheme-line)}._1I3N-uBrbZH-ywcmCnwv_B:focus{outline:none}._1I3N-uBrbZH-ywcmCnwv_B.IeceazVNz_gGZfKXub0ak,._1I3N-uBrbZH-ywcmCnwv_B:hover{border:1px solid var(–newCommunityTheme-button)}._35hmSCjPO8OEezK36eUXpk._35hmSCjPO8OEezK36eUXpk._35hmSCjPO8OEezK36eUXpk{margin-top:25px;left:-9px}._3aEIeAgUy9VfJyRPljMNJP._3aEIeAgUy9VfJyRPljMNJP._3aEIeAgUy9VfJyRPljMNJP,._3aEIeAgUy9VfJyRPljMNJP._3aEIeAgUy9VfJyRPljMNJP._3aEIeAgUy9VfJyRPljMNJP:focus-within,._3aEIeAgUy9VfJyRPljMNJP._3aEIeAgUy9VfJyRPljMNJP._3aEIeAgUy9VfJyRPljMNJP:hover{transition:all .1s linear 0s;border:none;padding:8px 8px 0}._25yWxLGH4C6j26OKFx8kD5{display:inline}._1i46tE0yFLStZBdRfHnYIa{-ms-flex-align:center;align-items:center;margin-top:4px;margin-bottom:8px}._2YsVWIEj0doZMxreeY6iDG,._1i46tE0yFLStZBdRfHnYIa{font-size:12px;font-weight:400;line-height:16px;color:var(–newCommunityTheme-metaText);display:-ms-flexbox;display:flex}._2YsVWIEj0doZMxreeY6iDG{padding:4px 6px}._1hFCAcL4_gkyWN0KM96zgg{color:var(–newCommunityTheme-button);margin-right:8px;margin-left:auto;color:var(–newCommunityTheme-errorText)}._1hFCAcL4_gkyWN0KM96zgg,._1dF0IdghIrnqkJiUxfswxd{font-size:12px;font-weight:700;line-height:16px;cursor:pointer;-ms-flex-item-align:end;align-self:flex-end;-webkit-user-select:none;-ms-user-select:none;user-select:none}._1dF0IdghIrnqkJiUxfswxd{color:var(–newCommunityTheme-button)}._3VGrhUu842I3acqBMCoSAq{font-weight:700;color:#ff4500;text-transform:uppercase;margin-right:4px}._3VGrhUu842I3acqBMCoSAq,.edyFgPHILhf5OLH2vk-tk{font-size:12px;line-height:16px}.edyFgPHILhf5OLH2vk-tk{font-weight:400;-ms-flex-preferred-size:100%;flex-basis:100%;margin-bottom:4px;color:var(–newCommunityTheme-metaText)}._19lMIGqzfTPVY3ssqTiZSX._19lMIGqzfTPVY3ssqTiZSX._19lMIGqzfTPVY3ssqTiZSX{margin-top:6px}._19lMIGqzfTPVY3ssqTiZSX._19lMIGqzfTPVY3ssqTiZSX._19lMIGqzfTPVY3ssqTiZSX._3MAHaXXXXi9Xrmc_oMPTdP{margin-top:4px} .ehsOqYO6dxn_Pf9Dzwu37{margin-top:0;overflow:visible}._2pFdCpgBihIaYh9DSMWBIu{height:24px}._2pFdCpgBihIaYh9DSMWBIu.uMPgOFYlCc5uvpa2Lbteu{border-radius:2px}._2pFdCpgBihIaYh9DSMWBIu.uMPgOFYlCc5uvpa2Lbteu:focus,._2pFdCpgBihIaYh9DSMWBIu.uMPgOFYlCc5uvpa2Lbteu:hover{background-color:var(–newRedditTheme-navIconFaded10);outline:none}._38GxRFSqSC-Z2VLi5Xzkjy{color:var(–newCommunityTheme-actionIcon)}._2DO72U0b_6CUw3msKGrnnT{border-top:none;color:var(–newCommunityTheme-metaText);cursor:pointer;padding:8px 16px 8px 8px;text-transform:none}._2DO72U0b_6CUw3msKGrnnT:hover{background-color:#0079d3;border:none;color:var(–newCommunityTheme-body);fill:var(–newCommunityTheme-body)} ._1zyZUfB30L-DDI98CCLJlQ{border:1px solid transparent;display:block;padding:0 16px;width:100%;border:1px solid var(–newCommunityTheme-body);border-radius:4px;box-sizing:border-box}._1zyZUfB30L-DDI98CCLJlQ:hover{background-color:var(–newCommunityTheme-primaryButtonTintedEighty)}._1zyZUfB30L-DDI98CCLJlQ._2FebEA49ReODemDlwzYHSR,._1zyZUfB30L-DDI98CCLJlQ:active,._1zyZUfB30L-DDI98CCLJlQ:hover{color:var(–newCommunityTheme-bodyText);fill:var(–newCommunityTheme-bodyText)}._1zyZUfB30L-DDI98CCLJlQ._2FebEA49ReODemDlwzYHSR,._1zyZUfB30L-DDI98CCLJlQ:active{background-color:var(–newCommunityTheme-primaryButtonShadedEighty)}._1zyZUfB30L-DDI98CCLJlQ:disabled,._1zyZUfB30L-DDI98CCLJlQ[data-disabled],._1zyZUfB30L-DDI98CCLJlQ[disabled]{background-color:var(–newCommunityTheme-primaryButtonTintedFifty);color:rgba(var(–newCommunityTheme-bodyText),.5);fill:rgba(var(–newCommunityTheme-bodyText),.5);cursor:not-allowed}._1zyZUfB30L-DDI98CCLJlQ:active,._1zyZUfB30L-DDI98CCLJlQ:disabled,._1zyZUfB30L-DDI98CCLJlQ:hover,._1zyZUfB30L-DDI98CCLJlQ[data-disabled],._1zyZUfB30L-DDI98CCLJlQ[disabled]{border:1px solid var(–newCommunityTheme-body)}._1O2i-ToERP3a0i4GSL0QwU,._1uBzAtenMgErKev3G7oXru{display:block;fill:var(–newCommunityTheme-body);height:22px;width:22px}._1O2i-ToERP3a0i4GSL0QwU._2ilDLNSvkCHD3Cs9duy9Q_,._1uBzAtenMgErKev3G7oXru._2ilDLNSvkCHD3Cs9duy9Q_{height:14px;width:14px}._2kBlhw4LJXNnk73IJcwWsT,._1kRJoT0CagEmHsFjl2VT4R{height:24px;padding:0;width:24px}._2kBlhw4LJXNnk73IJcwWsT._2ilDLNSvkCHD3Cs9duy9Q_,._1kRJoT0CagEmHsFjl2VT4R._2ilDLNSvkCHD3Cs9duy9Q_{height:14px;width:14px}._3VgTjAJVNNV7jzlnwY-OFY{font-size:14px;line-height:32px;padding:0 16px}._3VgTjAJVNNV7jzlnwY-OFY,._3VgTjAJVNNV7jzlnwY-OFY._2ilDLNSvkCHD3Cs9duy9Q_{font-weight:700;letter-spacing:.5px;text-transform:uppercase}._3VgTjAJVNNV7jzlnwY-OFY._2ilDLNSvkCHD3Cs9duy9Q_{font-size:12px;line-height:24px;padding:4px 9px 2px;width:100%}._2QmHYFeMADTpuXJtd36LQs{font-size:14px;line-height:32px;padding:0 16px}._2QmHYFeMADTpuXJtd36LQs,._2QmHYFeMADTpuXJtd36LQs._2ilDLNSvkCHD3Cs9duy9Q_{font-weight:700;letter-spacing:.5px;text-transform:uppercase}._2QmHYFeMADTpuXJtd36LQs._2ilDLNSvkCHD3Cs9duy9Q_{font-size:12px;line-height:24px;padding:4px 9px 2px;width:100%}._2QmHYFeMADTpuXJtd36LQs:hover ._31L3r0EWsU0weoMZvEJcUA{display:none}._2QmHYFeMADTpuXJtd36LQs ._31L3r0EWsU0weoMZvEJcUA,._2QmHYFeMADTpuXJtd36LQs:hover ._11Zy7Yp4S1ZArNqhUQ0jZW{display:block}._2QmHYFeMADTpuXJtd36LQs ._11Zy7Yp4S1ZArNqhUQ0jZW{display:none}._2CLbCoThTVSANDpeJGlI6a{width:100%}._2CLbCoThTVSANDpeJGlI6a:hover ._31L3r0EWsU0weoMZvEJcUA{display:none}._2CLbCoThTVSANDpeJGlI6a ._31L3r0EWsU0weoMZvEJcUA,._2CLbCoThTVSANDpeJGlI6a:hover ._11Zy7Yp4S1ZArNqhUQ0jZW{display:block}._2CLbCoThTVSANDpeJGlI6a ._11Zy7Yp4S1ZArNqhUQ0jZW{display:none} ._3Im6OD67aKo33nql4FpSp_{border:1px solid var(–newCommunityTheme-widgetColors-sidebarWidgetBorderColor);border-radius:5px 5px 4px 4px;overflow:visible;word-wrap:break-word;background-color:var(–newCommunityTheme-body);padding:12px}.lnK0-OzG7nLFydTWuXGcY{font-size:10px;font-weight:700;letter-spacing:.5px;line-height:12px;text-transform:uppercase;padding-bottom:4px;color:var(–newCommunityTheme-navIcon)} ._12xlue8dQ1odPw1J81FIGQ{display:inline-block;vertical-align:middle} ._3-SW6hQX6gXK9G4FM74obr{display:inline-block;vertical-align:text-bottom;width:16px;height:16px;font-size:16px;line-height:16px} ._37coyt0h8ryIQubA7RHmUc{margin-top:12px;padding-top:12px}._2XJvPvYIEYtcS4ORsDXwa3{border-radius:100%;box-sizing:border-box;-ms-flex:none;flex:none;margin-right:8px}._2Vkdik1Q8k0lBEhhA_lRKE{height:54px;width:54px}.eGjjbHtkgFc-SYka3LM3M,._2Vkdik1Q8k0lBEhhA_lRKE{border-radius:100%;box-sizing:border-box;-ms-flex:none;flex:none;margin-right:8px;background-position:50%;background-repeat:no-repeat;background-size:100%}.eGjjbHtkgFc-SYka3LM3M{height:36px;width:36px}.j9k2MUR13FjoBBeLo1C1m{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-top:13px;margin-bottom:2px}._3Evl5aOozId3QVjs7iry2c{font-size:12px;font-weight:400;line-height:16px;margin-right:4px;margin-left:4px}._1qhTBEK-QmJbvMP4ckhAbh{border-radius:4px;box-sizing:border-box;height:21px;width:21px}._1qhTBEK-QmJbvMP4ckhAbh:nth-child(2),._1qhTBEK-QmJbvMP4ckhAbh:nth-child(3){margin-left:-9px}._3nzVPnRRnrls4DOXO_I0fn{margin:auto 0 auto auto;padding-top:10px;vertical-align:middle}._3nzVPnRRnrls4DOXO_I0fn ._1LAmcxBaaqShJsi8RNT-Vp i{color:unset}._2bWoGvMqVhMWwhp4Pgt4LP{margin:16px 0;font-size:12px;font-weight:400;line-height:16px}.tWeTbHFf02PguTEonwJD0{font-size:16px;margin-right:4px}._2AbGMsrZJPHrLm9e-oyW1E{width:180px;text-align:center}._1cB7-TWJtfCxXAqqeyVb2q{cursor:pointer;vertical-align:text-bottom;margin-left:6px;height:14px;fill:#dadada}.hpxKmfWP2ZiwdKaWpefMn{background-color:var(–newCommunityTheme-active);background-size:cover;background-image:var(–newCommunityTheme-banner-backgroundImage);background-position-y:center;background-position-x:center;background-repeat:no-repeat;border-radius:3px 3px 0 0;height:34px;margin:-12px -12px 10px}._20Kb6TX_CdnePoT8iEsls6{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:8px}._20Kb6TX_CdnePoT8iEsls6>*{display:inline-block;vertical-align:middle}.t9oUK2WY0d28lhLAh3N5q{margin-top:-23px}._2KqgQ5WzoQRJqjjoznu22o{display:inline-block;-ms-flex-negative:0;flex-shrink:0;position:relative}._2D7eYuDY6cYGtybECmsxvE{-ms-flex:1 1 auto;flex:1 1 auto;overflow:hidden;text-overflow:ellipsis}._2D7eYuDY6cYGtybECmsxvE:hover{text-decoration:underline}._19bCWnxeTjqzBElWZfIlJb{font-size:16px;font-weight:500;line-height:20px;display:inline-block}._2TC7AdkcuxFIFKRO_VWis8{margin-left:10px;margin-top:30px}._2TC7AdkcuxFIFKRO_VWis8._35WVFxUni5zeFkPk7O4iiB{margin-top:35px}._7kAMkb9SAVF8xJ3L53gcW{display:-ms-flexbox;display:flex;margin-bottom:8px}._7kAMkb9SAVF8xJ3L53gcW>*{-ms-flex:auto;flex:auto}._1LAmcxBaaqShJsi8RNT-Vp{padding:0 2px 0 4px;vertical-align:middle}._3_HlHJ56dAfStT19Jgl1bF,.nEdqRRzLEN43xauwtgTmj{padding-right:4px}._3_HlHJ56dAfStT19Jgl1bF{padding-left:16px}._2QZ7T4uAFMs_N83BZcN-Em{font-family:Noto Sans,Arial,sans-serif;font-size:14px;font-weight:400;line-height:18px;display:-ms-flexbox;display:flex;-ms-flex-flow:row nowrap;flex-flow:row nowrap}._19sQCxYe2NApNbYNX5P5-L{cursor:default;height:16px;margin-right:8px;width:16px}._3XFx6CfPlg-4Usgxm0gK8R{font-size:16px;font-weight:500;line-height:20px}._34InTQ51PAhJivuc_InKjJ{color:var(–newCommunityTheme-actionIcon)}._29_mu5qI8E1fq6Uq5koje8{font-size:12px;font-weight:500;line-height:16px;display:inline-block;word-break:break-word}._2BY2-wxSbNFYqAy98jWyTC{margin-top:10px}._3sGbDVmLJd_8OV8Kfl7dVv{font-family:Noto Sans,Arial,sans-serif;font-size:14px;font-weight:400;line-height:21px;margin-top:8px;word-wrap:break-word}._1qiHDKK74j6hUNxM0p9ZIp{margin-top:12px}.isNotInButtons2020 ._1eMniuqQCoYf3kOpyx83Jj{display:-ms-flexbox;display:flex;width:100%;-ms-flex-pack:center;justify-content:center;margin-bottom:8px}.isNotInButtons2020 ._326PJFFRv8chYfOlaEYmGt{display:-ms-flexbox;display:flex}.isNotInButtons2020 .Jy6FIGP1NvWbVjQZN7FHA,.isNotInButtons2020 ._326PJFFRv8chYfOlaEYmGt{width:100%;font-size:14px;font-weight:700;letter-spacing:.5px;line-height:32px;text-transform:uppercase;-ms-flex-pack:center;justify-content:center;padding:0 16px}.isNotInButtons2020 .Jy6FIGP1NvWbVjQZN7FHA{display:block;margin-top:11px}.isNotInButtons2020 ._1cDoUuVvel5B1n5wa3K507{display:block;padding:0 16px;width:100%;font-size:14px;font-weight:700;letter-spacing:.5px;line-height:32px;text-transform:uppercase;-ms-flex-pack:center;justify-content:center;margin-top:11px;text-transform:unset}.isInButtons2020 .Jy6FIGP1NvWbVjQZN7FHA,.isInButtons2020 ._326PJFFRv8chYfOlaEYmGt,.isInButtons2020 ._1eMniuqQCoYf3kOpyx83Jj,.isInButtons2020 ._1cDoUuVvel5B1n5wa3K507{-ms-flex-pack:center;justify-content:center;margin-top:12px;width:100%}._2_w8DCFR-DCxgxlP1SGNq5{margin-right:4px;vertical-align:middle}._1aS-wQ7rpbcxKT0d5kjrbh{border-radius:4px;display:inline-block;padding:4px}._2cn386lOe1A_DTmBUA-qSM{border-top:1px solid var(–newCommunityTheme-widgetColors-lineColor);margin-top:10px}._2Zdkj7cQEO3zSGHGK2XnZv{display:inline-block}.wzFxUZxKK8HkWiEhs0tyE{font-size:12px;font-weight:700;line-height:16px;color:var(–newCommunityTheme-button);cursor:pointer;text-align:left;margin-top:2px}._3R24jLERJTaoRbM_vYd9v0._3R24jLERJTaoRbM_vYd9v0._3R24jLERJTaoRbM_vYd9v0{display:none}._38lwnrIpIyqxDfAF1iwhcV{background-color:var(–newRedditTheme-line);border:none;height:1px;margin:16px 0}.yobE-ux_T1smVDcFMMKFv{font-size:16px;font-weight:500;line-height:20px}._2DVpJZAGplELzFy4mB0epQ{margin-top:8px}._2DVpJZAGplELzFy4mB0epQ .x1f6lYW8eQcUFu0VIPZzb{color:inherit}._2DVpJZAGplELzFy4mB0epQ svg.LTiNLdCS1ZPRx9wBlY2rD{fill:inherit;padding-right:8px}._2DVpJZAGplELzFy4mB0epQ ._18e78ihYD3tNypPhtYISq3{font-family:Noto Sans,Arial,sans-serif;font-size:14px;font-weight:400;line-height:18px;color:inherit} .LalRrQILNjt65y-p-QlWH{fill:var(–newRedditTheme-actionIcon);height:18px;width:18px}.LalRrQILNjt65y-p-QlWH rect{stroke:var(–newRedditTheme-metaText)}._3J2-xIxxxP9ISzeLWCOUVc{height:18px}.FyLpt0kIWG1bTDWZ8HIL1{margin-top:4px}._2ntJEAiwKXBGvxrJiqxx_2,._1SqBC7PQ5dMOdF0MhPIkA8{height:24px;vertical-align:middle;width:24px}._1SqBC7PQ5dMOdF0MhPIkA8{-ms-flex-align:center;align-items:center;display:-ms-inline-flexbox;display:inline-flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center} ._2a172ppKObqWfRHr8eWBKV{-ms-flex-negative:0;flex-shrink:0;margin-right:8px}._39-woRduNuowN7G4JTW4I8{border-top:1px solid var(–newCommunityTheme-widgetColors-lineColor);margin-top:12px;padding-top:12px}._3AOoBdXa2QKVKqIEmG7Vkb{font-size:12px;font-weight:400;line-height:16px;-ms-flex-align:center;align-items:center;background-color:var(–newCommunityTheme-body);border-radius:4px;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;margin-top:12px}.vzEDg-tM8ZDpEfJnbaJuU{color:var(–newCommunityTheme-button);fill:var(–newCommunityTheme-button);height:14px;width:14px}.r51dfG6q3N-4exmkjHQg_{font-size:10px;font-weight:700;letter-spacing:.5px;line-height:12px;text-transform:uppercase;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}._2ygXHcy_x6RG74BMk0UKkN{margin-left:8px}._2BnLYNBALzjH6p_ollJ-RF{display:-ms-flexbox;display:flex;margin-left:auto}._1-25VxiIsZFVU88qFh-T8p{padding:0}._3BmRwhm18nr4GmDhkoSgtb{color:var(–newCommunityTheme-bodyText);-ms-flex:0 0 auto;flex:0 0 auto;line-height:16px} ._3Qx5bBCG_O8wVZee9J-KyJ{border-top:1px solid var(–newRedditTheme-line);margin-top:16px;padding-top:16px}._3Qx5bBCG_O8wVZee9J-KyJ ._2NbKFI9n3wPM76pgfAPEsN{margin:0;padding:0}._3Qx5bBCG_O8wVZee9J-KyJ ._2NbKFI9n3wPM76pgfAPEsN ._2btz68cXFBI3RWcfSNwbmJ{font-family:Noto Sans,Arial,sans-serif;font-size:14px;font-weight:400;line-height:21px;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;margin:8px 0}._3Qx5bBCG_O8wVZee9J-KyJ ._2NbKFI9n3wPM76pgfAPEsN ._2btz68cXFBI3RWcfSNwbmJ.QgBK4ECuqpeR2umRjYcP2{opacity:.4}._3Qx5bBCG_O8wVZee9J-KyJ ._2NbKFI9n3wPM76pgfAPEsN ._2btz68cXFBI3RWcfSNwbmJ label{font-size:12px;font-weight:500;line-height:16px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}._3Qx5bBCG_O8wVZee9J-KyJ ._2NbKFI9n3wPM76pgfAPEsN ._2btz68cXFBI3RWcfSNwbmJ label svg{fill:currentColor;height:20px;margin-right:4px;width:20px}._3Qx5bBCG_O8wVZee9J-KyJ ._4OtOUaGIjjp2cNJMUxme_{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:0;width:100%}._3Qx5bBCG_O8wVZee9J-KyJ ._4OtOUaGIjjp2cNJMUxme_ svg{display:inline-block;height:12px;width:12px}.isInButtons2020 ._4OtOUaGIjjp2cNJMUxme_{padding:0 12px}.isInButtons2020 ._1ra1vBLrjtHjhYDZ_gOy8F{font-family:Noto Sans,Arial,sans-serif;font-size:12px;font-weight:700;letter-spacing:unset;line-height:16px;text-transform:unset}._1ra1vBLrjtHjhYDZ_gOy8F{–textColor:var(–newCommunityTheme-widgetColors-sidebarWidgetTextColor);–textColorHover:var(–newCommunityTheme-widgetColors-sidebarWidgetTextColorShaded80);font-size:10px;font-weight:700;letter-spacing:.5px;line-height:12px;text-transform:uppercase;color:var(–textColor);fill:var(–textColor);opacity:1}._1ra1vBLrjtHjhYDZ_gOy8F._2UlgIO1LIFVpT30ItAtPfb{–textColor:var(–newRedditTheme-widgetColors-sidebarWidgetTextColor);–textColorHover:var(–newRedditTheme-widgetColors-sidebarWidgetTextColorShaded80)}._1ra1vBLrjtHjhYDZ_gOy8F:active,._1ra1vBLrjtHjhYDZ_gOy8F:hover{color:var(–textColorHover);fill:var(–textColorHover)}._1ra1vBLrjtHjhYDZ_gOy8F:disabled,._1ra1vBLrjtHjhYDZ_gOy8F[data-disabled],._1ra1vBLrjtHjhYDZ_gOy8F[disabled]{opacity:.5;cursor:not-allowed} .c_dVyWK3BXRxSN3ULLJ_t{border-radius:4px 4px 0 0;height:34px;left:0;position:absolute;right:0;top:0}._1OQL3FCA9BfgI57ghHHgV3{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;margin-top:32px}._1OQL3FCA9BfgI57ghHHgV3 ._33jgwegeMTJ-FJaaHMeOjV{border-radius:9001px;height:32px;width:32px}._1OQL3FCA9BfgI57ghHHgV3 ._1wQQNkVR4qNpQCzA19X4B6{height:16px;margin-left:8px;width:200px}._39IvqNe6cqNVXcMFxFWFxx{display:-ms-flexbox;display:flex;margin:12px 0}._39IvqNe6cqNVXcMFxFWFxx ._29TSdL_ZMpyzfQ_bfdcBSc{-ms-flex:1;flex:1}._39IvqNe6cqNVXcMFxFWFxx .JEV9fXVlt_7DgH-zLepBH{height:18px;width:50px}._39IvqNe6cqNVXcMFxFWFxx ._3YCOmnWpGeRBW_Psd5WMPR{height:12px;margin-top:4px;width:60px}._2iO5zt81CSiYhWRF9WylyN{height:18px;margin-bottom:4px}._2iO5zt81CSiYhWRF9WylyN._2E9u5XvlGwlpnzki78vasG{width:230px}._2iO5zt81CSiYhWRF9WylyN.fDElwzn43eJToKzSCkejE{width:100%}._2iO5zt81CSiYhWRF9WylyN._2kNB7LAYYqYdyS85f8pqfi{width:250px}._2iO5zt81CSiYhWRF9WylyN._1XmngqAPKZO_1lDBwcQrR7{width:120px}._3XbVvl-zJDbcDeEdSgxV4_{border-radius:4px;height:32px;margin-top:16px;width:100%}._2hgXdc8jVQaXYAXvnqEyED{animation:_3XkHjK4wMgxtjzC1TvoXrb 1.5s ease infinite;background:linear-gradient(90deg,var(–newCommunityTheme-field),var(–newCommunityTheme-inactive),var(–newCommunityTheme-field));background-size:200%}._1KWSZXqSM_BLhBzkPyJFGR{background-color:var(–newCommunityTheme-widgetColors-sidebarWidgetBackgroundColor);border-radius:4px;padding:12px;position:relative;width:auto} /*# sourceMappingURL=https://www.redditstatic.com/desktop2x/chunkCSS/IdCard.8fe90067a922ef36d4b6.css.map*/struct
, so it’d be easier and more beneficial for you to use a class.
Thank you very much for taking your time and explaining! I’ll try to implement that tomorrow, it’s already pretty late over here.
The simple solution is to make Shard a class, not a struct. Structs should generally only be used when you know why you need one. Otherwise, you should default to class.
The problem you are having is that Shard, being a struct, is a value type. When you get the shard in the foreach loop, you get a copy of the value of the shard in the dictionary. Updating Clients
works, because Clients
is a copy of a reference. Both references, the copy and the original, point to the same Dictonary
object. Updating PlayerCount
does not work, because you are assigning a new value on the copy, and then throwing it away. If you tried to assign a new object to Clients
it would break in the same way. shard.Clients = new Dictionary<int, Client>()
would not be reflected in shards
.
If you absolutely have to keep Shard a struct, you should be able to fix the compile error by using a new local variable. However, you would need to also put the new value back in the dictonary:
the variables in the foreach loop would still be immutable if Shard is a class, or am i wrong?
edit: thanks for your answer, I learned alot!
The below is your code (unimportant bits removed)
And this is the equivalent of what you’re doing and why it doesn’t work
This is why u/ILMTitan recommended making Shard
a class rather than a struct. If it were a class, then the code would work like so:
So the end result is, the increment statement as you wrote it, works fine. It does not however, do what you want it to do. Your version does not affect “Server.shards.Values”… and the “class” version does. This is one aspect of why people talk about immutability so much.
There is a sort-of second way you can perform the action you want to do. This way will also allow you to keep your item as a struct… but you can’t keep it in a Dictionary because you’re back to storing value types again.
Two things of note:
Don’t use new Guid()
because that’s how you get a GUID with a value of {00000000-0000-0000-0000-000000000000}. Use Guid.NewGuid()
to get an actual GUID.
https://docs.microsoft.com/en-us/dotnet/api/system.guid.newguid?view=net-5.0
I don’t really recommend rearranging everything you have just to use an array. Rethink what you’re trying to do. A struct has a purpose. Like DateTime
is a struct and works well for what it does. You generally do not want to “alter” the properties of a struct. Instead you create a new version of the struct with new values. When you have a DateTime and add one day to it using .AddDays(1)
, you’re not altering the date you have, you’re getting returned a whole new DateTime
value with the updated day.
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/value-types
FYI: https://www.reddit.com/wiki/markdown#wiki_code_blocks_and_inline_code
What do you mean by it “doesn’t work”?
As far as I can tell it’s only going to increment PlayerCount once on the first shard.
I can’t even compile. From my google searches it seems like variables in a foreach loop are immutable. They are read-only. And I can’t use a for loop because my dictionary works with Guid instead of int.
C# devs
null reference exceptions