3 ms·
> it's an issue of virtual vs. non-virtual, not static vs. non-static. That's what you started talking about, but that's not what I'm talking about. > "callin
by recursive 4y ago
> it's an issue of virtual vs. non-virtual, not static vs. non-static.
That's what you started talking about, but that's not what I'm talking about.
> "calling static methods on instances of classes"
That's from an ancestor, somewhere upthread. Here it is as a c# expression.
"abc".Format("size: {0}", 7)
Sensibly, c# doesn't allow this, but some languages do. I don't recall which, but I've definitely seen this.
Maybe I'm not understanding a word or something, but the description of the problem is definitely about "static".
- _Nat_ 4y agoIn C#, basically all methods are `static` by-default. Just, if a programmer doesn't explicitly mark a method as `static`, then the compiler implicitly inserts an extra argument into the call-signature for `this`. For example: public class A { // If a programmer writes this: public void DoSomething(int x) { /* ... */ } // ...then C# sees this: public static void DoSomething(A this, int x) { if (this == null) { throw new NullArgumentException(); } /* ... */ } } So if a programmer then writes `a.DoSomething(7);`, C# basically automatically converts that into `A.DoSomething(a, 7);` for them. It's basically syntactic-sugar. C# even lets programmers write methods that can be called on an instance OR as `static`: [extension methods](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/extension-methods https://docs.microsoft.com/en-us/dotnet/csharp/programming-g... ). Then there's a difference between C# and Java: in C#, non-static methods can be `virtual` if marked as such, whereas in Java, all non-static methods are automatically `virtual`. --- Anyway, my point about the perspective from [this comment](https://news.ycombinator.com/item?id=31383483 https://news.ycombinator.com/item?id=31383483 ), > If you’re writing code calling static methods on instances of classes, you deserve to have that code broken. , was that that's basically what C# does by-default, ignoring syntactic-sugar. Because, in C#, methods aren't `virtual` by-default, so when C#-programmers call a default method on an instance, they're calling it non-virtually, much like a Java-`static` method -- it may look a little different in C# due to the syntactic-sugar, but it's basically the same thing. To demonstrate that same-ness, I took the Java code that used `static` from [this comment](https://news.ycombinator.com/item?id=31379783 https://news.ycombinator.com/item?id=31379783 ), then showed the same without `static` in C# in [this comment](https://news.ycombinator.com/item?id=31385859 https://news.ycombinator.com/item?id=31385859 ). Of course, I don't mean that they look exactly the same, due to the syntactic-sugar. Just that they're conceptually the same in terms of logical-structuring and behaviorally the same in terms of what they actually do (e.g., how they printed the same responses in those examples).