Readonly vs static readonly clarification2019 Community Moderator ElectionHow to properly access c++/CLI...
What is the generally accepted pronunciation of “topoi”?
What is better: yes / no radio, or simple checkbox?
Why does cron require MTA for logging?
How exactly does an Ethernet collision happen in the cable, since nodes use different circuits for Tx and Rx?
After `ssh` without `-X` to a machine, is it possible to change `$DISPLAY` to make it work like `ssh -X`?
Ballot RPC message
Why do phishing e-mails use faked e-mail addresses instead of the real one?
Is it possible that a question has only two answers?
How do electrons receive energy when a body is heated?
Street obstacles in New Zealand
Does "Until when" sound natural for native speakers?
How does Ehrenfest's theorem apply to the quantum harmonic oscillator?
Why do we say ‘pairwise disjoint’, rather than ‘disjoint’?
Would an aboleth's Phantasmal Force lair action be affected by Counterspell, Dispel Magic, and/or Slow?
From an axiomatic set theoric approach why can we take uncountable unions?
How do spaceships determine each other's mass in space?
Can I negotiate a patent idea for a raise, under French law?
ER diagram relationship node size adjustment
Shifting between bemols and diesis in the key signature
Observe in vs observe about vs observe of
What's the 'present simple' form of the word "нашла́" in 3rd person singular female?
How do we create new idioms and use them in a novel?
Why couldn't the separatists legally leave the Republic?
Outlet with 3 sets of wires
Readonly vs static readonly clarification
2019 Community Moderator ElectionHow to properly access c++/CLI initonly TimeSpan field?What is the difference between const and readonly?Static readonly vs constWhy does Microsoft advise against readonly fields with mutable values?const, readonly and mutable value typesStruct containing reference typesConverting to int from string in public staticFilename pattern not working in OpenFileDialogStatic Readonly Fields and PerformanceMimicing constants using static readonly vs static getterStatic referenced in another .cs file
I've run into an interesting situation I am trying to understand. I have a readonly struct field in my class. This means that when I reference it, it references a copy and not the actual one, so when I call a change method, it will be working with a copy, and the original will remain unchanged.
That is not what I am observing. I only see the expected behavior with a static field. I expected the behavior for both types.
private struct junk
{
public int i;
public void change()
{
i += 1;
}
}
private readonly junk jk;
private static readonly junk jk2;
public Form1()
{
InitializeComponent();
jk.change();
//jk.i is now 1, why? Shouldn't it be changing a copy and not the original jk?
jk2.change();
//jk2.i is 0
}
c#
New contributor
Endel_ is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
add a comment |
I've run into an interesting situation I am trying to understand. I have a readonly struct field in my class. This means that when I reference it, it references a copy and not the actual one, so when I call a change method, it will be working with a copy, and the original will remain unchanged.
That is not what I am observing. I only see the expected behavior with a static field. I expected the behavior for both types.
private struct junk
{
public int i;
public void change()
{
i += 1;
}
}
private readonly junk jk;
private static readonly junk jk2;
public Form1()
{
InitializeComponent();
jk.change();
//jk.i is now 1, why? Shouldn't it be changing a copy and not the original jk?
jk2.change();
//jk2.i is 0
}
c#
New contributor
Endel_ is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
3
Mutable value types - just say no.
– Damien_The_Unbeliever
4 hours ago
1
please get rid of the irrelevant call toInitializeComponent()and insert code that prints the values ofjk.iandjk2.iand show us what it prints. We do not care to read what you think the values are, we want to see what the values are.
– Mike Nakis
4 hours ago
1
(And we also want to see what makes you think the values are what you claim they are.)
– Mike Nakis
4 hours ago
1
A warning would have been nice, but the C# compiler does not have the plumbing that can ensure that change() has an observable side-effect. A counter-example is the C++/CLI compiler, it always assumes and that doesn't make programmers happy either. Addstatic Form1()to see that it is allowed to mutate the jk2 value.
– Hans Passant
4 hours ago
add a comment |
I've run into an interesting situation I am trying to understand. I have a readonly struct field in my class. This means that when I reference it, it references a copy and not the actual one, so when I call a change method, it will be working with a copy, and the original will remain unchanged.
That is not what I am observing. I only see the expected behavior with a static field. I expected the behavior for both types.
private struct junk
{
public int i;
public void change()
{
i += 1;
}
}
private readonly junk jk;
private static readonly junk jk2;
public Form1()
{
InitializeComponent();
jk.change();
//jk.i is now 1, why? Shouldn't it be changing a copy and not the original jk?
jk2.change();
//jk2.i is 0
}
c#
New contributor
Endel_ is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
I've run into an interesting situation I am trying to understand. I have a readonly struct field in my class. This means that when I reference it, it references a copy and not the actual one, so when I call a change method, it will be working with a copy, and the original will remain unchanged.
That is not what I am observing. I only see the expected behavior with a static field. I expected the behavior for both types.
private struct junk
{
public int i;
public void change()
{
i += 1;
}
}
private readonly junk jk;
private static readonly junk jk2;
public Form1()
{
InitializeComponent();
jk.change();
//jk.i is now 1, why? Shouldn't it be changing a copy and not the original jk?
jk2.change();
//jk2.i is 0
}
c#
c#
New contributor
Endel_ is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
New contributor
Endel_ is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
New contributor
Endel_ is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
asked 4 hours ago
Endel_Endel_
361
361
New contributor
Endel_ is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
New contributor
Endel_ is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
Endel_ is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
3
Mutable value types - just say no.
– Damien_The_Unbeliever
4 hours ago
1
please get rid of the irrelevant call toInitializeComponent()and insert code that prints the values ofjk.iandjk2.iand show us what it prints. We do not care to read what you think the values are, we want to see what the values are.
– Mike Nakis
4 hours ago
1
(And we also want to see what makes you think the values are what you claim they are.)
– Mike Nakis
4 hours ago
1
A warning would have been nice, but the C# compiler does not have the plumbing that can ensure that change() has an observable side-effect. A counter-example is the C++/CLI compiler, it always assumes and that doesn't make programmers happy either. Addstatic Form1()to see that it is allowed to mutate the jk2 value.
– Hans Passant
4 hours ago
add a comment |
3
Mutable value types - just say no.
– Damien_The_Unbeliever
4 hours ago
1
please get rid of the irrelevant call toInitializeComponent()and insert code that prints the values ofjk.iandjk2.iand show us what it prints. We do not care to read what you think the values are, we want to see what the values are.
– Mike Nakis
4 hours ago
1
(And we also want to see what makes you think the values are what you claim they are.)
– Mike Nakis
4 hours ago
1
A warning would have been nice, but the C# compiler does not have the plumbing that can ensure that change() has an observable side-effect. A counter-example is the C++/CLI compiler, it always assumes and that doesn't make programmers happy either. Addstatic Form1()to see that it is allowed to mutate the jk2 value.
– Hans Passant
4 hours ago
3
3
Mutable value types - just say no.
– Damien_The_Unbeliever
4 hours ago
Mutable value types - just say no.
– Damien_The_Unbeliever
4 hours ago
1
1
please get rid of the irrelevant call to
InitializeComponent() and insert code that prints the values of jk.i and jk2.i and show us what it prints. We do not care to read what you think the values are, we want to see what the values are.– Mike Nakis
4 hours ago
please get rid of the irrelevant call to
InitializeComponent() and insert code that prints the values of jk.i and jk2.i and show us what it prints. We do not care to read what you think the values are, we want to see what the values are.– Mike Nakis
4 hours ago
1
1
(And we also want to see what makes you think the values are what you claim they are.)
– Mike Nakis
4 hours ago
(And we also want to see what makes you think the values are what you claim they are.)
– Mike Nakis
4 hours ago
1
1
A warning would have been nice, but the C# compiler does not have the plumbing that can ensure that change() has an observable side-effect. A counter-example is the C++/CLI compiler, it always assumes and that doesn't make programmers happy either. Add
static Form1() to see that it is allowed to mutate the jk2 value.– Hans Passant
4 hours ago
A warning would have been nice, but the C# compiler does not have the plumbing that can ensure that change() has an observable side-effect. A counter-example is the C++/CLI compiler, it always assumes and that doesn't make programmers happy either. Add
static Form1() to see that it is allowed to mutate the jk2 value.– Hans Passant
4 hours ago
add a comment |
1 Answer
1
active
oldest
votes
I have a readonly struct field in my class. This means that when I reference it, it references a copy and not the actual one, so when I call a change method, it will be working with a copy, and the original will remain unchanged.
That's not at all what the readonly modifier does. The readonly modifier prevents you from assigning a new value to jk anywhere but in a constructor. Then, the static modifier allows you to reuse that value independently of the instance of Form1 you are working with.
That said, neither readonly nor static is making the weird behavior you are describing because that exact behavior cannot be reproduced with the code you've posted.
Look at a simpler example in a Console application (which you can try here):
public class Program
{
private readonly junk jk;
private static readonly junk jk2;
public static void Main()
{
var program = new Program();
program.jk.change();
Console.WriteLine(program.jk.i); // prints 0
jk2.change();
Console.WriteLine(jk2.i); // prints 0
}
}
public struct junk
{
public int i;
public void change()
{
i += 1;
}
}
Then, as @Damien_The_Unbeliever commented, try to avoid mutable structs as much as you can.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Endel_ is a new contributor. Be nice, and check out our Code of Conduct.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55090417%2freadonly-vs-static-readonly-clarification%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
I have a readonly struct field in my class. This means that when I reference it, it references a copy and not the actual one, so when I call a change method, it will be working with a copy, and the original will remain unchanged.
That's not at all what the readonly modifier does. The readonly modifier prevents you from assigning a new value to jk anywhere but in a constructor. Then, the static modifier allows you to reuse that value independently of the instance of Form1 you are working with.
That said, neither readonly nor static is making the weird behavior you are describing because that exact behavior cannot be reproduced with the code you've posted.
Look at a simpler example in a Console application (which you can try here):
public class Program
{
private readonly junk jk;
private static readonly junk jk2;
public static void Main()
{
var program = new Program();
program.jk.change();
Console.WriteLine(program.jk.i); // prints 0
jk2.change();
Console.WriteLine(jk2.i); // prints 0
}
}
public struct junk
{
public int i;
public void change()
{
i += 1;
}
}
Then, as @Damien_The_Unbeliever commented, try to avoid mutable structs as much as you can.
add a comment |
I have a readonly struct field in my class. This means that when I reference it, it references a copy and not the actual one, so when I call a change method, it will be working with a copy, and the original will remain unchanged.
That's not at all what the readonly modifier does. The readonly modifier prevents you from assigning a new value to jk anywhere but in a constructor. Then, the static modifier allows you to reuse that value independently of the instance of Form1 you are working with.
That said, neither readonly nor static is making the weird behavior you are describing because that exact behavior cannot be reproduced with the code you've posted.
Look at a simpler example in a Console application (which you can try here):
public class Program
{
private readonly junk jk;
private static readonly junk jk2;
public static void Main()
{
var program = new Program();
program.jk.change();
Console.WriteLine(program.jk.i); // prints 0
jk2.change();
Console.WriteLine(jk2.i); // prints 0
}
}
public struct junk
{
public int i;
public void change()
{
i += 1;
}
}
Then, as @Damien_The_Unbeliever commented, try to avoid mutable structs as much as you can.
add a comment |
I have a readonly struct field in my class. This means that when I reference it, it references a copy and not the actual one, so when I call a change method, it will be working with a copy, and the original will remain unchanged.
That's not at all what the readonly modifier does. The readonly modifier prevents you from assigning a new value to jk anywhere but in a constructor. Then, the static modifier allows you to reuse that value independently of the instance of Form1 you are working with.
That said, neither readonly nor static is making the weird behavior you are describing because that exact behavior cannot be reproduced with the code you've posted.
Look at a simpler example in a Console application (which you can try here):
public class Program
{
private readonly junk jk;
private static readonly junk jk2;
public static void Main()
{
var program = new Program();
program.jk.change();
Console.WriteLine(program.jk.i); // prints 0
jk2.change();
Console.WriteLine(jk2.i); // prints 0
}
}
public struct junk
{
public int i;
public void change()
{
i += 1;
}
}
Then, as @Damien_The_Unbeliever commented, try to avoid mutable structs as much as you can.
I have a readonly struct field in my class. This means that when I reference it, it references a copy and not the actual one, so when I call a change method, it will be working with a copy, and the original will remain unchanged.
That's not at all what the readonly modifier does. The readonly modifier prevents you from assigning a new value to jk anywhere but in a constructor. Then, the static modifier allows you to reuse that value independently of the instance of Form1 you are working with.
That said, neither readonly nor static is making the weird behavior you are describing because that exact behavior cannot be reproduced with the code you've posted.
Look at a simpler example in a Console application (which you can try here):
public class Program
{
private readonly junk jk;
private static readonly junk jk2;
public static void Main()
{
var program = new Program();
program.jk.change();
Console.WriteLine(program.jk.i); // prints 0
jk2.change();
Console.WriteLine(jk2.i); // prints 0
}
}
public struct junk
{
public int i;
public void change()
{
i += 1;
}
}
Then, as @Damien_The_Unbeliever commented, try to avoid mutable structs as much as you can.
answered 4 hours ago
Camilo TerevintoCamilo Terevinto
19k63767
19k63767
add a comment |
add a comment |
Endel_ is a new contributor. Be nice, and check out our Code of Conduct.
Endel_ is a new contributor. Be nice, and check out our Code of Conduct.
Endel_ is a new contributor. Be nice, and check out our Code of Conduct.
Endel_ is a new contributor. Be nice, and check out our Code of Conduct.
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55090417%2freadonly-vs-static-readonly-clarification%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
3
Mutable value types - just say no.
– Damien_The_Unbeliever
4 hours ago
1
please get rid of the irrelevant call to
InitializeComponent()and insert code that prints the values ofjk.iandjk2.iand show us what it prints. We do not care to read what you think the values are, we want to see what the values are.– Mike Nakis
4 hours ago
1
(And we also want to see what makes you think the values are what you claim they are.)
– Mike Nakis
4 hours ago
1
A warning would have been nice, but the C# compiler does not have the plumbing that can ensure that change() has an observable side-effect. A counter-example is the C++/CLI compiler, it always assumes and that doesn't make programmers happy either. Add
static Form1()to see that it is allowed to mutate the jk2 value.– Hans Passant
4 hours ago