The New Way of Parsing ANY Type in .NET

  Рет қаралды 70,403

Nick Chapsas

Nick Chapsas

Күн бұрын

Пікірлер: 116
@michielvanhimbeeck6206
@michielvanhimbeeck6206 Жыл бұрын
I love how random your numbers are
@MarkCastle
@MarkCastle Жыл бұрын
Not watched it yet…. 69 by any chance? 😂
@dmytrk
@dmytrk Жыл бұрын
​@@MarkCastleand then splits it with comma "6,9"😂
@Netmonster01
@Netmonster01 Жыл бұрын
And 4,20
@marsgal42
@marsgal42 Жыл бұрын
The only numbers that matter are 13 and 42. 😛
@jonathanbout
@jonathanbout Жыл бұрын
The like count of this comment is one of them
@carldaniel6510
@carldaniel6510 Жыл бұрын
All of the new "generic math" interfaces are awesome - long overdue. But please - DON'T implement TryParse as a call to Parse inside a try-catch. One of the key benefits of TryParse is that it does not throw - even internally. Implement Point2d.TryParse as two calls to int.TryParse and return true only if both succeed - no throw/catch inside.
@Sindrijo
@Sindrijo Жыл бұрын
Agree, only implement TryParse with other TryParse. I usually also implement the Parse with the TryParse version of the same type.
@nickpolyderopoulos3491
@nickpolyderopoulos3491 Жыл бұрын
I am pretty sure Nick did not do Try Parse as you propose for simplicity reasons. It is not a best practices video.
@amirhosseinahmadi3706
@amirhosseinahmadi3706 Жыл бұрын
"One of the key benefits of TryParse is that it does not throw - even internally" Could you explain what how that's a benefit? Genuine question. Wouldn't it be functionally the same?
@sszzt
@sszzt Жыл бұрын
​@@amirhosseinahmadi3706 It is just for performance reasons. Returning false is as fast as you can get. Throwing an exception requires much more processing and memory allocations. Of course you have to weigh up whether it's worth optimising your method for your particular use case. But stick to what @Sindrijo has said and 99% of the time it will be the right decision.
@dennycrane2938
@dennycrane2938 Жыл бұрын
I was actually going to comment the same. I do it the other way around. I do the validations during the parse implementation and just short-circuit if anything is wrong and return false. Then Parse just calls that and throws if it fails.
@woocaschnowak
@woocaschnowak Жыл бұрын
When MS said they will add static interface members, I thought, they lost they mind. But now, that they provided such use cases, I'm changing my opinion :-)
@quranthecompanion4528
@quranthecompanion4528 Жыл бұрын
we used to use Convert.ChangeType() for primitive data types. now we are changing the implementation to IParsable. its pretty neat.
@zoran123456
@zoran123456 Жыл бұрын
Understood everything up to 2:00. After that my brain went coo-coo!
@mariocamspam72
@mariocamspam72 Жыл бұрын
10:11 We're circling right back to pre-2000s C, haha
@cn-ml
@cn-ml Жыл бұрын
I really like the new Span splitting method, makes me feel in control of my memory. Also i totally love the new abstract interfaces, especially the IParsable, but I probably used INumber a lot more already.
@drndn
@drndn Жыл бұрын
I appreciate how you use a similar naming scheme to me, semantic-type-as-physical-type, eg FooAsText, FooAsInt etc.
@gneto.r
@gneto.r Жыл бұрын
Okay maybe I need to rewatch this later after a cup of coffee or two... looks like something useful to fully understand.
@toetertijd
@toetertijd Жыл бұрын
Hey Nick, I saw you yesterday at Techorama. Thanks for the great talk!
@nickchapsas
@nickchapsas Жыл бұрын
Hey! ❤
@SvdSinner
@SvdSinner Жыл бұрын
This was a great blend of useful right now, interesting and showing future functionality. Kudos!
@josephmoreno9733
@josephmoreno9733 Жыл бұрын
Static abstract methods port interfaces to types beyond the instance of those types. And that is really impressive. With that, the need for the use of reflection is reduced as much as possible.
@diadetediotedio6918
@diadetediotedio6918 Жыл бұрын
I very much like this feature, I would rather prefer the "shapes" approach but this is really very very very userful
@ntohl
@ntohl Жыл бұрын
Nice. In the ReadOnlySpan TryParse example. Shouldn't it return false instead of throwing ArgumentOutOfRangeException?
@nickchapsas
@nickchapsas Жыл бұрын
Yes you are right. I copied and pasted it from the Parse method so I totally forgot. Thanks for bringing this up
@dvldev
@dvldev Жыл бұрын
Great! I am watching your video since last month. I have completly changed the way of how I write code. Thank you very much Nick.
@TheAaandyyy
@TheAaandyyy Жыл бұрын
Great video. One thing that I was missing was to introduce the [NotNullWhen(true)], but maybe that is the separate topic itself
@alexanderkvenvolden4067
@alexanderkvenvolden4067 Жыл бұрын
I love these new interfaces and the ability to have static interface methods, and use them IF the code base I'm working on is using the supported runtime.
@AEF23C20
@AEF23C20 Жыл бұрын
two points used from some buffer [read i/o etc], and this buffer easy to imaging as array, and then change type of this array, and array type - desired type of structure array
@Naton
@Naton Жыл бұрын
i use 'is' syntax and return an Option
@T___Brown
@T___Brown Жыл бұрын
Awesome ty. This is waaaaay overdue. Doing this with generics is painful and not really possible
@OXARA
@OXARA Жыл бұрын
Good practice for csv line parsing
@GekoPoiss
@GekoPoiss Жыл бұрын
I'd recommend using a parser combinator library instead. It's IMO by far the easiest and most intuitive way to parse any object, especially considering parsers are monadic, which means you can use LINQ to easily compose parsers.
@hanspetervollhorst1
@hanspetervollhorst1 Жыл бұрын
The span part is imo way more interesting than the interface and abstract static stuff
@gunnarliljas8459
@gunnarliljas8459 Жыл бұрын
Nice. Wouldn't call that extension "Parse" though, since the string isn't parsing, it's being parsed.
@nickchapsas
@nickchapsas Жыл бұрын
ParseTo would be a better one
@parlor3115
@parlor3115 Жыл бұрын
@@nickchapsas Or ParseMe
@user-tk2jy8xr8b
@user-tk2jy8xr8b Жыл бұрын
Beparsed (similarly to "begone")
@diadetediotedio6918
@diadetediotedio6918 Жыл бұрын
"Parse" makes sense for me, it's like -> parse as
@SecondFinale
@SecondFinale Жыл бұрын
Favorite thumbnail
@craigmunday3707
@craigmunday3707 6 ай бұрын
Very useful, thanks.
@timseguine2
@timseguine2 Жыл бұрын
Not sure If I am going to use this technique, but I did learn about static abstract members now, which I didn't know about before.
@DaliborHomola
@DaliborHomola Жыл бұрын
Does somebody know if Complete Nick Chapsas Course Bundle will get all future courses? Please ☺ I'm thinking of buying it...
@efrenb5
@efrenb5 Жыл бұрын
Does System.Text.Json automatically use the IParseable interface? I'd love to get rid of som of the JsonConverters I've had to build.
@waynehamberg9248
@waynehamberg9248 Жыл бұрын
Hey Nick. What software are you using to do your screen presentation with your picture as part of the production?
@oralitical
@oralitical 9 ай бұрын
I didn't see a reply, but it looks like the type of thing that can be done in OBS Studio.
@TheMCPepo
@TheMCPepo Жыл бұрын
Hi Nick! I'm having kind of a hard time understanding where would you use in real life delegates and events, as we as covariance and contravariance. Do you have anything on your videos on this? Great video as always!
@bartekm3878
@bartekm3878 Жыл бұрын
Heck yeah! The puns are back! ❤
@theonlywallrus
@theonlywallrus Жыл бұрын
just curious, what are you beginning to type when you are setting a default parameter? You start typing `format = by`, but then you backspace and type null. You did it twice haha
@arodrig10
@arodrig10 Жыл бұрын
Nice "random" number you chose 😳🤣
@Yogs01180
@Yogs01180 Жыл бұрын
This can be cool ! Thanks ! ❤❤
@T___Brown
@T___Brown Жыл бұрын
Question: is there something built in that can do fixed width? Currently i have to do a lot of specific span reads but if there was a range like you had that i could split based upon multiple indexes then that might be better
@IMarvinTPA
@IMarvinTPA Жыл бұрын
I really wish there were a GetParse(inputString, optional DefaultValue ) where failures return the default value.
@tekozlofiu
@tekozlofiu Жыл бұрын
I'm probably missing something, but what prevents you to create an extension method just like that?
@IMarvinTPA
@IMarvinTPA Жыл бұрын
@@tekozlofiu I actually already have, but I cannot share them.
@Ristogod
@Ristogod Жыл бұрын
How does the IFormatProvider play into your custom parse logic?
@phizc
@phizc Жыл бұрын
In the case of ints it wouldn't, but for doubles, some locals use period and some use comma as the decimal separator. Not to mention all the different date/time formats.
@F1nalspace
@F1nalspace Жыл бұрын
Awesome! This is actually pretty useful but comes far too late, because i already implemented something similar in our production code bases - implemented in hundres of classes/structs. But when we switch to .NET 7 (we are currently at NET 6), we may drop to this method instead. Wait, what is the '!' operator for s!.Split(',');? WIll this throw an exception when s is null?
@theMagos
@theMagos Жыл бұрын
You're telling the compiler: "s is never null, trust me, so stop giving me those null reference warnings..."
@deathpax
@deathpax Жыл бұрын
Is there anything that would be similarly performant for binary parsing?
@othmanekinane2769
@othmanekinane2769 Жыл бұрын
In 09:38, why not just do this ? int commaPos = s.IndexOf(','); int first = int.Parse(s.Slice(0, commaPos)); int second = int.Parse(s.Slice(commaPos + 1));
@kylekeenan3485
@kylekeenan3485 Жыл бұрын
Just a random number Nick 😉
@phizc
@phizc Жыл бұрын
I knew about this, but I didn't know the out parameter of the TryParse methods came after the IFormatProvider parameter. That's pretty dumb IMO, since then you can't have a default null vlue, and the user needs to pass null.. int.TryParse( "20", null, out var value ) vs Int.TryParse( "20", out var value )
@theloststarbounder
@theloststarbounder Жыл бұрын
Nice
@ONESTTEFTEO
@ONESTTEFTEO Жыл бұрын
When Nick says Random number it means always 69
@TampaCEO
@TampaCEO Жыл бұрын
You really should overload the method to allow the caller to pass a string, rather than requiring your calling methods to add the .AsSpan() every time. It greatly simplifies your code and does not requie an .AsSpan() function to be called throughout your application.
@Matthias_S85
@Matthias_S85 Жыл бұрын
Of course the number input used as an example is 69.
@ondrejjakub
@ondrejjakub Жыл бұрын
nice
@MassimoRough
@MassimoRough Жыл бұрын
Why record, not a strict? What are the advantages and when to use which?
@ciach0_
@ciach0_ Жыл бұрын
records are immutable
@theMagos
@theMagos Жыл бұрын
Record is reference type, like class.
@phizc
@phizc Жыл бұрын
He could have used record struct too.. It's just an example for the parser, so he probably didn't bother. Brevity.
@EdKolis
@EdKolis Жыл бұрын
I wonder why it's not spelled IParseable like ICloneable?
@EdKolis
@EdKolis Жыл бұрын
6:04 hehe ass pan
@mynameisshadywhat
@mynameisshadywhat Жыл бұрын
Just parsing the time
@zabustifu
@zabustifu Жыл бұрын
11:52: is it actually a good idea to throw an exception here? I'd just expect false to be returned here, and the result to be set to the default value. On the caller side, having to wrap a TryParse call within a try / catch sounds like it defeats the point of using TryParse in the first place.
@nickchapsas
@nickchapsas Жыл бұрын
I mentioned this in another reply but no you shouldn’t throw an exception. I did the stupid think of copying from the Parse method but you should return false there
@johnnm3207
@johnnm3207 Жыл бұрын
Benchmarks?
@DM-rc8sp
@DM-rc8sp Жыл бұрын
@mateuszk4419
@mateuszk4419 Жыл бұрын
"random number"
@tmcheah
@tmcheah Жыл бұрын
"Random number" Casually type in "69" 😂😂
@Eric19850704
@Eric19850704 Жыл бұрын
Thanks!
@MudzNZ
@MudzNZ Жыл бұрын
Noice number
@kyrylovagabond9172
@kyrylovagabond9172 Жыл бұрын
"Just random number" 😅
@nacuflavius9457
@nacuflavius9457 Жыл бұрын
why number 69? it's not a random number at all...hmm
@valera924
@valera924 Жыл бұрын
Totally random number, there is no any meaning in it :D
@phizc
@phizc Жыл бұрын
@@valera924 yup. Like (4,20), or 80085 that he also randomly chooses. I mean, it is random, but there's fewer options than a 4 sided die. 😆
@iGexogen
@iGexogen Жыл бұрын
About your example - why not just reuse Parse method from TryParse? And in general - is there such use case where logic in Parse and TryParse should be different? Any reason for ms developers to put it on me to implement both methods rather than implement only Parse?
@nickchapsas
@nickchapsas Жыл бұрын
There is a difference actually and I didn't properly show this. TryParse should now throw an exception. Instead it should return either true or false based on whether it could parse the input, so me returning argument exception is wrong there. I should just be returning false. It's just a common .NET pattern.
@iGexogen
@iGexogen Жыл бұрын
@@nickchapsas Here's general implementation of TryParse try { result = Parse(s, provider); return true; } catch { result = default; return false; } I think it's just boilerplate and it is place in single extension method for whole codebase, and only Parse method have to be implemented. Maybe you know use case where it makes any sense to implement both?
@user-tk2jy8xr8b
@user-tk2jy8xr8b Жыл бұрын
@@iGexogen better do it the opposite way: if TryParse returns false - throw
@diadetediotedio6918
@diadetediotedio6918 Жыл бұрын
@@iGexogen He already said the use case, not throwing exceptions. From where did you take this implementation you provided as a 'general implementation'? Because throwing exceptions has a huge cost, it probably is not implemented this way.
@AftercastGames
@AftercastGames Жыл бұрын
Meh. Kinda cool, but ultimately not terribly useful, because types rarely only have one string representation. If you want to create a different type for each representation, I guess this would work, but it just seems that writing a static parse function would be quicker and easier to understand. But we’ll see. Maybe I’m just getting old, but adding new language features every month or two seems a bit chaotic, I think. You can’t even start and finish a project before your code is already obsolete. 🙄
@swordblaster2596
@swordblaster2596 Жыл бұрын
Pretty marginal stuff IMO
@63pufferfish
@63pufferfish Ай бұрын
A type should not implement its own serialization.
@rdmon746
@rdmon746 Жыл бұрын
int.Paws? int.Pause? 😅
@cliffwakefield
@cliffwakefield Жыл бұрын
.NET 8 preview 5, really?
@TC-xk5rm
@TC-xk5rm Ай бұрын
Lmao 1 yr later .net9 is in use.
@Vosoo-e9r
@Vosoo-e9r Ай бұрын
Kinda weird stuff
@a-s733
@a-s733 Жыл бұрын
seems not realy necessary...
@tywunon
@tywunon Ай бұрын
We are still using Framework 4.8 😥 We are slowly moving to .net8, though
@liquidcode1704
@liquidcode1704 Жыл бұрын
bro you lost me 50 million "if we go into that"s ago
3 .NET "Best Practices" I Changed My Mind About
10:16
Nick Chapsas
Рет қаралды 104 М.
The fastest way to iterate a List in C# is NOT what you think
13:42
Nick Chapsas
Рет қаралды 158 М.
Mom had to stand up for the whole family!❤️😍😁
00:39
Human vs Jet Engine
00:19
MrBeast
Рет қаралды 178 МЛН
Человек паук уже не тот
00:32
Miracle
Рет қаралды 3,1 МЛН
Functional Parsing - Computerphile
22:46
Computerphile
Рет қаралды 137 М.
Settling the Biggest Await Async Debate in .NET
14:47
Nick Chapsas
Рет қаралды 146 М.
I Cannot Believe TypeScript Recommends You Do This!
7:45
Web Dev Simplified
Рет қаралды 175 М.
The New Option and Result Types of C#
15:05
Nick Chapsas
Рет қаралды 76 М.
What is Span in C# and why you should be using it
15:15
Nick Chapsas
Рет қаралды 258 М.
"Stop Using Async Await in .NET to Save Threads" | Code Cop #018
14:05
Fix Your Controllers By Refactoring To Minimal APIs
14:56
Milan Jovanović
Рет қаралды 43 М.
Await Async Tasks Are Getting Awesome in .NET 9!
9:24
Nick Chapsas
Рет қаралды 99 М.
Don't Use Polly in .NET Directly. Use this instead!
14:58
Nick Chapsas
Рет қаралды 68 М.
The Right Way to Check for Null in C#
9:35
Nick Chapsas
Рет қаралды 98 М.
Mom had to stand up for the whole family!❤️😍😁
00:39