[HN Gopher] C# 9 top-level programs and target-typed expressions ___________________________________________________________________ C# 9 top-level programs and target-typed expressions Author : benaadams Score : 63 points Date : 2021-03-30 20:37 UTC (2 hours ago) (HTM) web link (developers.redhat.com) (TXT) w3m dump (developers.redhat.com) | danielovichdk wrote: | I have been programming with c# since 2000 i think. But I do not | like where the languages is going. | | It is becoming way to loose in a sense and it seems that it wants | more than it should. | | If you want to do functional programming, pick a fp language. | | If you want to do dynamic typed programming pick a dp language. | | Sure you can mix some things in, but c# is becoming way to | scattered imo. And it's not pretty i think. | thrower123 wrote: | I think I'm going to get diabetes from all the syntax sugar... | | On the more substantive changes, it feels a little like the | language designers have been looting F#. | | Combined with how fast Dotnet Core is moving and how many | breaking changes there are there, it does feel like things are | getting very fragmented. | | Stasis isn't good either; just witness the decade or so of | stagnation after Java 1.6 as the Sun -> Oracle transition | happened. But you can go too far in the other direction. | emodendroket wrote: | I don't think they're just randomly throwing stuff at the | wall. These are all things they've been talking about for | years. | spaetzleesser wrote: | I think for a lot of devs having a multiparadigm language is | the only way to explore new things. For the stuff I am working | on it's not really feasible to add new languages but you can | add FP concepts slowly because C# supports it. That would also | explain the popularity of C++ because it allows gradual | transition. | sumnole wrote: | Personally, I enjoy C# becoming a multi-paradigms language like | Common Lisp. Multiple inheritance and a good macro system would | help close the gap. I don't need safety guards in my language, | I'm looking for the right options when I need them. | emodendroket wrote: | People have been saying this all the way back to when Linq came | out, and who could imagine C# without Linq today? | outside1234 wrote: | Who would have believed a decade ago that there would be a RedHat | developer blog entry on C# today? | | If someone had told you that then you would have thought the | world would have collapsed in the meantime. | zwieback wrote: | Exactly my first thought. I remember my first steps with C# and | it felt very "MS version of Java" and I didn't expect how much | a) I would like it and b) how successfully it would spread to | other areas | whoisthemachine wrote: | To me, the benefit of "Target-typed new expressions" is more with | bringing consistency to class-scope member declarations and | method-scope member declarations, so these two can look the same, | and a programmer only has to read one way of declaring new | members in C#: public class MyClass { | private readonly MyDependency _myDependency = new(); | public void MyMethodThatDoesWork() { MyVariable | variable = new(); } } | | As opposed to the (now old, IMO) var syntax/Java-like syntax | mixture: public class MyClass { private | readonly MyDependency _myDependency = new MyDependency(); | public void MyMethodThatDoesWork() { var variable = | new MyVariable(); } } | | Edited for HN formatting. | keithnz wrote: | I can't see var going anywhere, many times you aren't directly | creating a new object, but getting a generated object from | something ( like linq) which tends to have more complicated | type signatures. | whoisthemachine wrote: | Oh true, there are still use cases where it's valuable. `out | var ` also comes to mind. | Cshelton wrote: | I hate hate hate var. | | Sure, in your own IDE, and reading the code you just wrote, | no problem. But when doing code reviews and jumping all over, | I want to see the type right there. Nothing more frustrating | than reviewing a PR with var's all over. This isn't even up | for debate anymore... No more var! | | It is frustrating to still see var as the recommended way by | Microsoft... You can even put in a rule to format the | document and add explicit types as well on save. So | complicated type signatures for linq aren't a problem! | wvenable wrote: | Can't disagree more. var improves readability so much that | I can't imagine reviewing code anymore with unnecessary | type declarations everywhere. | nycdotnet wrote: | Agreed that `var` isn't going anywhere, but this feature's | best use case is with complex generics/enumerables and things | like anonymous tuple types. For example: // | old: var x = new List<KeyValuePair<string, int>> | { new KeyValuePair<string, int>("a", 1), new | KeyValuePair<string, int>("b", 2) }; // new | var x = new List<KeyValuePair<string, int>> { | new("a", 1), new("b", 2) }; | wk_end wrote: | Wow, when I (only a C# dabbler) read about this feature in | the article I thought it sounded incredibly silly, but this | really sells it. Was there really no better way to create | tuples before? | gnud wrote: | You could create tuples with `Tuple.Create("a", 1)` since | at least .NET 4, if not 3. | | Since C# 7 you can also create tuples using just `("a", | 1)`. But tuples are not KeyValuePairs. So the new "new" | syntax will be very helpful in a lot of cases. | [deleted] | wvenable wrote: | C# (as of 7.0) has pretty nice tuple syntax that supports | all things you expect (deconstruction, etc): | | https://docs.microsoft.com/en-us/dotnet/csharp/language- | refe... | | But the situation here is that the type KeyValuePair is | older than that and isn't a tuple. | goto11 wrote: | The article states that the benefit of target-typed new- | expressions is that "the type declarations are nicely aligned" | compared the use of "var". | | I think a better justification is that fields and properties does | not support type inference, so this can avoid some redundant type | expressions for initializes, just like "var" can avoid redundant | type expressions for local variables. | | Of course it would be more elegant if fields/properties supported | type inference like "var", but that is a can of worms since you | can have recursive dependencies. | belinder wrote: | Unfortunately the new tricks can't be used when the codebase is | still stuck on .net framework :( | shireboy wrote: | There are ways, but definitely can be hard to get unstuck from | framework. This came across my newsfeed this am: | https://www.telerik.com/blogs/jump-starting-migration-dotnet... | and also, the other day, dotnet rocks podcast had a guy on | talking about an upgrade tool. I think it was this one: | https://visualrecode.com/ He was also discussing the "Strangler | Pattern": https://akfpartners.com/growth-blog/strangler- | pattern-dos-an... | bob1029 wrote: | There are many paths out of hell. Check out the windows | compatibility pack for all things active directory, WCF & | System.Drawing: | | https://docs.microsoft.com/en-us/dotnet/core/porting/windows... | | Winforms is probably a no-go on migration, but you should | definitely check out Blazor if you want to develop any new | business apps. We have constructed some incredibly complex | business dashboards using this framework and cant imagine how | some of this would even be possible if we had to move back to a | front-end client framework and invent a bunch of JSON APIs. | | Also, the new Blazor Desktop stuff is _extremely_ exciting: | | https://medium.com/young-coder/blazor-desktop-the-electron-f... | | > The first difference is that the WebWindow container doesn't | use WebAssembly at all. Yes, you can run more or less the same | Blazor application in WebWindow as you would in a web page. But | when you use a web page, it's executed by a lightweight .NET | runtime that's powered by WebAssembly. When you use it in | WebWindow, it will use the cross-platform .NET runtime | directly. | | There is a lot of really amazing stuff coming down the roadmap, | so I can easily advocate for enduring some degree of pain to | get on this wagon. | thrower123 wrote: | I'm pretty sure WinForms is being migrated. I've built dotnet | 5 WinForms apps, anyway. At least on Windows - I wouldn't bet | on a Linux Gtk/Qt port any time soon. | | WPF is probably dead though. | my123 wrote: | WPF is not dead, it got open-sourced and was ported to .NET | Core 3.1 onwards. | nycdotnet wrote: | We use C# 9 in our WebForms monolith and it works fine. Just | add `<LangVersion>latest</LangVersion>` to your .csproj file. | (This assumes you're using recent Visual Studio version and use | a recent version of MSBuild as well) | lwansbrough wrote: | Allegedly there's an upgrade path from .NET 4.8 to .NET 5. | keithnz wrote: | if you have built anything on web forms, then you really have | no way forward other than rewriting all that. That alone will | keep many an enterprise locked on .NET Framework for quite | some time. | belinder wrote: | In our case not web forms but WCF | WorldMaker wrote: | You may want to keep an eye on CoreWCF: | https://github.com/CoreWCF/CoreWCF | | Though as a heavy WCF user in the past, I'd suggest your | best bet is simply to throw out all your binding configs, | and build your own REST API or similar backend (gRPC | support in .NET 5+ is something often also recommended if | you want something more RPC-like and need/want a more | binary-serializer like approach, though in 2021 I'd just | use JSON and something REST-ish myself). The nice thing | about the Interface-driven "contract" approach should be | that implementing your own is just a matter of | implementing all your contract interfaces and injecting | the physical implementations yourself. | | I realize that can be easier said than done as things | accidentally got coupled to very specific styles of | bindings over the years and not everyone followed best | practices and used the Async contracts so you have to | tear out a bunch of synchronous faking code and wire back | in Task<T>/ValueTask<T>. But generally, overall, the | process was implement the interfaces and remove the | "magic" in the process and I often found you end up with | something better anyway because it is simpler and prone | to less "magic" failures. | UweSchmidt wrote: | Could you expand a little on that? How exactly does an | REST API backed desktop/forms application look like in | 2021, and how is the decoupling accomplished? | Analemma_ wrote: | I second the other commenter suggesting you should try to | rip off the WCF bandaid and go to a RESTful API as soon | as you can. It sounds scary but after the one-time pain | of migration we've had way fewer "magic, black box" | errors that require insane investigations and hacks. | goto11 wrote: | The upgrade path is massive rewrites, something most business | are wary of. For good reasons. | | MS really made a grave mistake by coupling the evolution of | the C# language to the .NET version. This means all projects | on the .NET framework is now also stuck with an obsolete | language version for no good reason. | | It is becoming a a lot less fun to be a C# developer because | you more often will have to work with obsolete tools. | nikanj wrote: | Your programming language either dies young, or it lives | long enough to become the very legacy crud it sought to | replace. | wvenable wrote: | > MS really made a grave mistake by coupling the evolution | of the C# language to the .NET version. | | For the most part that isn't true. You can use later C# | compilers with older frameworks. Some features do, | unavoidably, require framework support. | | But that being said, the changes in C# aren't often that | radical that I feel particularly constrained by older | versions. | nycdotnet wrote: | At work we've been slowly pulling code out of our WebForms | monolith. That's still on .NET Framework, and will be | forever until we're done killing it, but we can use recent | VS and MSBuild with it and we use C# 9 as well. Business | code generally works copy and paste in .NET Core, so | there's a really good path to migrate to newer stuff, | especially with .Net Standard 2.0 being a thing. | | gRPC is really fast and we have the WebForms monolith call | into .NET Core services now so we can improve the back-end | without dealing with so much ASPX crap. | aliswe wrote: | Not really | WorldMaker wrote: | Not by default, no. These two specific tricks should work on | .NET Framework (some of the other tricks in C# after 7 or 8 | require functionality that .NET Framework doesn't have, | though). You can ask VS to use the more recent C# compiler with | the LangVersion tag in the .csproj: | https://docs.microsoft.com/en-us/dotnet/csharp/language-refe... | | Obviously, it's not suggested doing that nor is entirely well | supported, but it is at least allowed. | | Though if you are looking to use top-level programs you | probably are working in greenfields anyway that should just be | .NET 5+. It's not really a feature that makes a lot of sense | for existing codebases as it is more a teaching tool/"quick and | dirty command line app/script" tool. | ryandrake wrote: | Wow, a full-screen cookie pop-up with a "X" dismiss button in the | upper right corner that just causes the full-screen pop-up to re- | display. Can it get more obnoxious? | | This is the second one on the HN front page today [1]. HN tries | to avoid paywalled articles, maybe we should also discourage | articles that start out by deliberately hiding the content. | | 1: https://news.ycombinator.com/item?id=26639722 | binarynate wrote: | I think that C# is underrated. Although TypeScript is my default | language choice for most programming, C# / .NET is my choice for | cases where: | | - high performance is important - or interop with native | libraries is required (because C#'s DllImport attribute makes | that super simple) | | Another benefit is that C# is syntactically similar to TypeScript | (they were both designed by Anders Hejlsberg after all), so | switching between the two languages feels easy. Java and Go are | both similar to C# in terms of performance, but interfacing with | native code isn't as simple with those languages, and they're | also not as similar to TypeScript as C# is (especially Go, which | is quite different). | dataflow wrote: | A bit of a tangent but is it possible yet to compile C# to | native code _easily_ (like calling a normal compiler on the | command-line)? Last time I checked I needed to jump through a | bunch of hoops through Visual Studio, and create some XML or | other nonsense. I don 't get why they've made it so hard | compared to just compiling managed code. | DownGoat wrote: | It is super easy with dotnet core. The new CLI is pretty | simple, you use it as a package manager and compiler. Visual | Studio also uses the CLI to run and debug dotnet core | projects. https://docs.microsoft.com/en-us/dotnet/core/tools/ | MikeTheGreat wrote: | Is it possible to create a single, stand-alone, self- | contained .exe? (I'm fine with only building for a single | platform - Mac/Win/Linux) | | Needing to run my programs (which show up as .dll's) using | dotnet just feels weird (and it doesn't match my intuition | for 'how programs are run' in Windows cmd/etc). | | I'd be fine with an .exe that's not self contained but at | least I run it like a 'normal' exe. :) | pjc50 wrote: | You have to set up "dotnet publish" for the project that | makes the executable. | | It then makes a stub loader "your program.exe" which | looks and behaves normally. You can then make it "self | contained", which bundles the assemblies for you and | transparently unpacks them. | | You can have different publish profiles for the different | targets. | smcl wrote: | Yes that is possible, you can produce an .exe which | contains your application's assemblies but relies on the | appropriate .NET runtime being present on the user's | computer. You can _also_ build a .exe which has the .NET | runtime bundled, but it can be quite big. I made a simple | program that wrote "Hello World" to the console [1] and | it was between 46-78MB: https://blog.mclemon.org/no-this- | is-what-peak-hello-world-lo... | pjc50 wrote: | Yeah, it's not really a "real" native binary. | | You can get it down to 8kb by jettisoning all comforts: | https://medium.com/@MStrehovsky/building-a-self- | contained-ga... but that's not exactly practical. | oblio wrote: | > Is it possible to create a single, stand-alone, self- | contained .exe? | | Yes. | bob33212 wrote: | They were created by the same | person.https://en.m.wikipedia.org/wiki/Anders_Hejlsberg All the | hate C# gets is because of balmer and gates, not for technical | reasons | zwieback wrote: | C# is my goto for Windows, for sure. Is the native interop good | in Linux as well? I've never even considered anything like | that, would probably gravitate to C++ since that's what I'm | familiar with but would seriously consider Go or Java in non- | Windows situations. | josteink wrote: | How do you think they built the Linux-version of the .NET | standard library? ;) | meibo wrote: | C# on Linux, as of the past 2 or 3 years, has been | consistently improving with great tooling, good interop, is | open source(MIT) and has the ability to package "native" | versions of your app that contain the runtime at negligible | space costs for distribution or deployment. | | Give .NET 5 on Linux a try, you'll be surprised! | | For me, the work this team has been doing is the example of | the positive "change" Microsoft has brought to the open | source space. A stellar language with great infrastructure. | pjc50 wrote: | The native interop is the same. That is, if your DLL and .so | have the same function signatures, you can use the same | interop code unmodified between Linux and Windows. This is | really convenient. | | (But watch out for bitness) | scott00 wrote: | Interop on Linux works well. | emodendroket wrote: | I'm not working with C# anymore but I'm really liking the | features they keep adding. ___________________________________________________________________ (page generated 2021-03-30 23:00 UTC)