How to await ANYTHING in C#

  Рет қаралды 45,126

Nick Chapsas

Nick Chapsas

Жыл бұрын

Check out my courses: dometrain.com
Become a Patreon and get source code access: / nickchapsas
Hello everybody I'm Nick and in this video I will show you how you can turn any C# and .NET type into something that is awaitable but also explain why it is something you want to be very careful with doing.
Workshops
NDC Minnesota | 15 - 18 Nov | bit.ly/ndcminnesota2022workshop
NDC London | 23-27 January 2023 | bit.ly/ndclondon2023
Don't forget to comment, like and subscribe :)
Social Media:
Follow me on GitHub: bit.ly/ChapsasGitHub
Follow me on Twitter: bit.ly/ChapsasTwitter
Connect on LinkedIn: bit.ly/ChapsasLinkedIn
Keep coding merch: keepcoding.shop
#csharp #dotnet

Пікірлер: 148
@diegoronkkomaki6858
@diegoronkkomaki6858 Жыл бұрын
The "await 2;" example was a indeed a funny one. Would a developer even be able to figure out what that line is doing, if the extension method was in a separate dll?
@AldoInza
@AldoInza Жыл бұрын
Use the debug skipping methods from the last video just in case.
@diegoronkkomaki6858
@diegoronkkomaki6858 Жыл бұрын
@@fusedqyou what is there to navigate into, when you can only see the integer literal?
@WarrenGarabrandt
@WarrenGarabrandt Жыл бұрын
git pull rejected: what in the actual hell is this syntax?
@TheNeozas
@TheNeozas Жыл бұрын
As all extentions on basic types, actually. Some people love the extensions for Object itself to do Json operations, for example :(
@mysteriouslyhandmade
@mysteriouslyhandmade Жыл бұрын
@@AldoInza so evil. lol
@kenbrady119
@kenbrady119 Жыл бұрын
From TaskAwaiter documentation: "This type is intended for compiler use only." and "This API supports the product infrastructure and is not intended to be used directly from your code." await Task.Delay(2000) is just fine, unless you prefer 1) obfuscation; 2) relying on compiler internals. Nonetheless, it's good to learn more about how await works.
@hck1bloodday
@hck1bloodday Жыл бұрын
oh but you can use the extension method without the taskwaiter, from int to TimeSpan and it would look like: await Task.Delay(2.Seconds()) which to mee looks nice and readable
@TheMAZZTer
@TheMAZZTer Жыл бұрын
I don't think this interferes with that guideline (other ones I'm sure it does) since you need to define GetAwaiter on anything you want to await, and it must return a TaskAwaiter. I imagine that warning is just that you shouldn't be using that object for anything else than await. On the other hand, I'm not sure if there's ever a need to use anything other than Task for awaiting; one gets automatically constructed for you in most cases, and in others you have Task.FromResult or Task.CompletedTask. So I suppose that could be what it means. Bet you when Unity finally formally supports async/await they will abuse the hell out of GetAwaiter to carry over some of their weird design patterns.
@fedefex1
@fedefex1 Жыл бұрын
@@TheMAZZTer I don't think a TaskAwaiter is everything you can ask to an awaitable. Try for example to implement that: await new SwitchToThreadPool(); so that after the await you are always in a thread pool thread
@hck1bloodday
@hck1bloodday Жыл бұрын
@@yt-1337 in which way?
@ivantatarchuk697
@ivantatarchuk697 Жыл бұрын
Another example of C# duck typing :)
@Velociapcior
@Velociapcior Жыл бұрын
extension which returns awaiter for object class. And then you can await whole framework **insert Inception "we need to go deeper" meme**
@aughey
@aughey Жыл бұрын
My team members are going to find this and implement some crazy things. I'll hold you personally responsible ;-). Especially if I am the one implementing the ideas.
@nayanchoudhary4353
@nayanchoudhary4353 Жыл бұрын
This is the bomb! "await 2.Seconds()" 😀
@the-niker
@the-niker Жыл бұрын
Too many extensions like this would pollute the intellisense of standard types, it's a nightmare for any new dev on your team and most likely would go unused long-term. That said, it looks pretty cool :D
@marvinjno-baptiste726
@marvinjno-baptiste726 Жыл бұрын
Seriously interesting...the requirement for an awaiter has always been an issue for me and awaiting. I clearly did not understand enough but this has cleared things up no end. Thank you.
@julianocs87
@julianocs87 Жыл бұрын
Great content. I like how you show all the possibilites but also explains why or when you should or shouldn't use them.
@krccmsitp2884
@krccmsitp2884 Жыл бұрын
As with all paradigms, they can be used in a good or bad way. It is good to know and understand what you've shown here, whether and how to use it in practice must then be decided in each individual case.
@dariusz.9119
@dariusz.9119 Жыл бұрын
await 2; gave me a good giggle 😁😁. Seriously, imagine going into commercial banking project and seeing this all over the place
@hugohenriquelingiardi550
@hugohenriquelingiardi550 Жыл бұрын
That's new for me, impressive! When I want to add some async functionality in some objects or classes I like to use TaskCompletionSource, not for everything but where it makes sense. Great video Nick!
@nohmaan
@nohmaan Жыл бұрын
Thanks for the videos, see you at NDC Minnesota!
@TheMAZZTer
@TheMAZZTer Жыл бұрын
I've personally done this with Deconstruct on IEnumerable. I also did it on KeyValuePair to effectively backport that feature from a newer .NET to the one I was using. The danger with all of this is it's not easy for another developer to figure out wtf the code is doing unless they are specifically aware of these duck typed methods and extension classes. Almost as confusing as overloading operators or implicit casting can be. So be careful when using these tools, and don't be afraid to ask yourself "is this usage confusing" and add a comment for someone else who might come by and read the code later. That someone might be you!
@capsey_
@capsey_ Жыл бұрын
`await 2.Seconds();` here reminded me `2.sin();` from rust
@Galakyllz
@Galakyllz Жыл бұрын
Wow, yeah, this is great information, but I would not put this into a team project. Thanks for making these videos. I hope your time at the conference goes well.
@soverain
@soverain Жыл бұрын
Very interesting stuff indeed! Would love to see more.
@adbirdk
@adbirdk Жыл бұрын
This was actually really fun. I'd love to see about what silly stuff you can do if you go all the way down the rabbit hole..
@Davide__________
@Davide__________ Жыл бұрын
i raise with await "2 seconds"; implemented with a semantic analyzer that of course needs to run in less than the awaiting time
@der.Schtefan
@der.Schtefan Жыл бұрын
C# programmers on a movie set: "Ok guys, await 5!"
@casper5314
@casper5314 Жыл бұрын
😂😂😂😂😂😂😂😂
@cubeson4168
@cubeson4168 Жыл бұрын
can't wait to write await "two"; in my code
@mrwensveen
@mrwensveen Жыл бұрын
I've been awaiting this video! I probably shouldn't have.
@ayudakov
@ayudakov Жыл бұрын
Thank you!
@benjaminschug5572
@benjaminschug5572 Жыл бұрын
I'm using custom awaiters in Unity. Unity has its own concurrency solution called Coroutines, from before they supported async/await in C#. Custom awaiters allow you to await a Coroutine from a Task, which makes for much more readable code.
@fedefex1
@fedefex1 Жыл бұрын
You can also create custom awaitable and awaiter. For example one that do not restore synchronization context. The following is impossible with a taskAwaiter but it's possible with a custom awaiter: await new SwitchToRandonThread(); So that after the await you are guaranteed to run in a random new thread
@codex4048
@codex4048 Жыл бұрын
I love that it's possible, but with great power comes great responsibility. And this is something that you don't want to do in 99% of the cases, but for the niche case you do want it it's really great
@SilasPeters
@SilasPeters Жыл бұрын
This really opened up the extensions world to me
@bjmmedeiros13
@bjmmedeiros13 Жыл бұрын
Great video as always, Nick! You got me curious: how would you go about creating a DSL? Would you consider making a video on the topic of domain-specific languages?
@bwwbali7372
@bwwbali7372 Жыл бұрын
or you can do that also
@tsietsiramakatsa7429
@tsietsiramakatsa7429 Жыл бұрын
I couldn't help but laugh seeing an awaiter extension on an integer. Yeah would only use in my own code. I'm actually doing a talk on async coding to my team tomorrow, this is going to be a nice thing to show the awaiter pattern.
@AlFasGD
@AlFasGD Жыл бұрын
Awaiting on a TimeSpan directly semantically makes sense; the verbal expression of awaiting some time is intuitive and natural. Anything other than a TimeSpan is not as easy to accept as being randomly awaitable.
@CRBarchager
@CRBarchager Жыл бұрын
await 2.Seconds; is really interesting and I could see that one being used as a short hand for Task.Delay(2000), but it really needs to be documented in the code so new developers aren't getting a headache banging on the table figuring this out :D
@TheMAZZTer
@TheMAZZTer Жыл бұрын
I wouldn't really like that, I assume the point of keeping all that stuff in TimeSpan is to keep the primitive types members minimal to things common to that type. Not all numbers are time values etc. However there was a feature that was coming to C# at some point where you could subtype strings. So you could say have a "first name" type of string, and declare APIs that specifically wanted a specific subtype. So this would allow the compiler to catch more errors from passing in the wrong variable to a method if you mix two up. I think that could work for number types too. And you could apply this to extension methods to only accept certain subtypes, so you could only have GetAwaiter show up for a seconds subtype of double. Would allow for what you want without polluting intellisense over time. (I was going to say you could have .Seconds only for seconds subtypes but I realized that was redundant at that point).
@Yupmoh
@Yupmoh Жыл бұрын
This is cool af man!
@SlackwareNVM
@SlackwareNVM Жыл бұрын
I've known of this for a while. I've never found a suitable use case, maybe never will, but I absolutely love it. EDIT: Same with being able to use the linq sql query syntax so long as you implement SelectMany().
@Kolorotur
@Kolorotur Жыл бұрын
One use case I face quite often is a need to wait until cancellation is signalled via a CancellationToken, so I wrote myself a custom awaiter - it fits perfectly in this scenario, does almost no allocations and I don't have to write some clunky workarounds, like firing up an infinite Task.Delay and catching the TaskCanceledException. Instead I can just write await cancellationToken
@neociber24
@neociber24 Жыл бұрын
This is one obscure feature I never knew about, in Rust we had something similar but typed
@xavier.xiques
@xavier.xiques Жыл бұрын
I think I'm not going to use it, but anyway it's very interesting to know what can be done. Thanks Nick.
@briankesecker
@briankesecker Жыл бұрын
I almost always favor verbosity and clarity in code, so that the maintenance is easy. However, if I saw 'await 2s;' in code, the behavior would be clear to me. Thanks for sharing this awesome feature Nick!
@mrshurukan
@mrshurukan Жыл бұрын
That's why I think "await 2.Seconds()" is really nice, because it literally spells what it does. It awaits for 2 second to pass Now, with that being said, I think this could still be improved by writing it as "await 2.SecondDelay()", which is now a lot clearer as for what it does and it still reads like plain English
@simoncampbell-smith6745
@simoncampbell-smith6745 Жыл бұрын
I agree clarity is everything. That code is beautiful above but might be tricky for an average Joe to work out at first glance.
@jtucker87
@jtucker87 Жыл бұрын
@@mrshurukan I think that muddies it more. Because '2.SecondDelay' is actually just a TimeSpan and keeps me from using it anywhere else in code where it would also be useful. Like a timeout parameter.
@DuelingTreeMike
@DuelingTreeMike Жыл бұрын
await 2; for the win. 😂😂😂 that had me rolling!!! Thanks make it all the great videos
@cocoscacao6102
@cocoscacao6102 Жыл бұрын
Fun video. Where did you found the info that the compiler is looking for GetAwaiter method?
@QwDragon
@QwDragon Жыл бұрын
Great explanation! And about feature itself, delays in code are a very rare thing, so it would be strange to use smth like this. But anyway, I have a solution that is made for some kind of code copiing and generation that has extension methods on strings and IEnumerable of strings to all king of things like indentation, joining anr replacing. When there is an app that in 90% of code uses some thing, it's much more important to make it's usage fluent even if implementation becomes kind of obscure.
@DanielAWhite27
@DanielAWhite27 Жыл бұрын
I was expecting an extension method for System.Object in the video
@nickchapsas
@nickchapsas Жыл бұрын
That’s too cursed even for me
@crifox16
@crifox16 Жыл бұрын
@@nickchapsas too cursed for you right now... one can only imagine what the future holds :v
@Ofeth
@Ofeth Жыл бұрын
I am ready to write the best spaghetti code and this video was great!
@williamliu8985
@williamliu8985 Жыл бұрын
duck typing and extension methond are both black magic!
@skyake59
@skyake59 Жыл бұрын
How about a GetAwaiter(this T obj) to await everything?
@shahfaisal3923
@shahfaisal3923 Жыл бұрын
I wish to be PRO like YOU. Best of luck from Afghanistan.
@TheNeozas
@TheNeozas Жыл бұрын
The solution from the second part of the video smells like custom operators 😁😁😁It can make support for new team quite interesting and old team - definitely famose and discussable Actualy System.Reactive uses this a lot, as I remember, so if you lazy enough - you can just await your observables
@cubbucca
@cubbucca Жыл бұрын
await 2; now i want to make every value type have an await extention that is just random delays.
@user-uu6xz6lk6o
@user-uu6xz6lk6o Жыл бұрын
await 'e';
@klocugh12
@klocugh12 Жыл бұрын
await 2.Seconds - love it! I'm stealing it for my own code and might even use it in production if not too out of the way. Too bad there are no macros in c# to make it even crazier - straight up "await 2 seconds;" await 2 - no thanks.
@hightower-yt
@hightower-yt Жыл бұрын
very cool! Now is use ... await "some time"; ... in my code. "some time" is a randnom value between 1 and 5 seconds.
@DeserdiVerimas
@DeserdiVerimas Жыл бұрын
you've extended string and are checking for that value, and then get a random number? thats horrifying! i love it
@QwDragon
@QwDragon Жыл бұрын
@@DeserdiVerimas I need more: await "some long time" with 1 to 2 minutes interval and await "couple of days" xD
@da3dsoul
@da3dsoul Жыл бұрын
Extension methods on numbers!? I didn't know you could...not sure I like it, but it's definitely neat....
@joost00719
@joost00719 Жыл бұрын
I used this exact thing to await a Cancellation Token in a background task which starts a timer. After the cancellation token is called, flow will continue and dispose the timer.
@adambickford8720
@adambickford8720 Жыл бұрын
It's a context thing. If you have a solution where arbitrary delays are super common, it might be worth a little magic to be able to express that tersely ala 'await int'. Something can be super value even if it doesn't generalize well.
@TWFsecurity
@TWFsecurity Жыл бұрын
Why you don't make a video on [Extension] Class and how we can utilize it to the max
@artemisDev
@artemisDev Жыл бұрын
Definitely doing 2.seconds() for personal projects. Just 2 is too ambiguous unless it's some big code golf thing where the tradeoff makes sense.
@hck1bloodday
@hck1bloodday Жыл бұрын
most people would make it a named constant or a variable called somethign like secondsToWait, but this 2.Seconds() is a lot more readable, and depending in your UseCase, using 2.Hours() 2.Years() 2.Minutes() could be useful too
@hudsentech8663
@hudsentech8663 Жыл бұрын
tanx ❤
@Dacusx
@Dacusx Жыл бұрын
"await 2.Seconds();" looks like nice 'fluent' syntax. ;)
@ClawGr
@ClawGr Жыл бұрын
It is cool that you can do it, and didn't know the only thing it mattered was just the GetAwaiter, Buut its more clear to do await Task.Delay(2000) and everyone knows what it means. Feels like it might hide something important. For example what if u have to use ConfigureAwait
@nickchapsas
@nickchapsas Жыл бұрын
You should have no reason to use ConfigureAwait since .NET Core
@benoitrousseau4137
@benoitrousseau4137 Жыл бұрын
The await 2.seconds looks like ruby, a scripting language I quite enjoy using. I agree that it looks quite alien in C# though, I don't think I'd use it either.
@amrosamy8232
@amrosamy8232 Жыл бұрын
What about the high frequency timer? The timers in the level of microseconds and nanoseconds
@oguzhan0Kahyaoglu
@oguzhan0Kahyaoglu Жыл бұрын
Probably I would fire the one who is "await 2;" :D
@antonsimkin
@antonsimkin Жыл бұрын
i heard there is a way to create abstract class object. could you explain how? i can guess it involves using clr, metadata and reflection. sertanly the question is purely academical and has no practical use.
@michielmeer1990
@michielmeer1990 Жыл бұрын
Rails does this a lot. It's common to type something like '2.days.ago' or '1.hour' there. Granted, Ruby makes it very easy to do. Nice to see that it's possible to build this in C# too.
@ronsijm
@ronsijm Жыл бұрын
Hmm, you did a similar thing in another video, where you just added `GetEnumerator()` (without any interface) and magically the compiler picks it up. Now you're doing the same with `GetAwaiter()` - implementing it, and without any interface it gets accepted... What's the underlying concept that allows this? Because usually it's extension methods on interfaces allowing you do to stuff once you've implemented the interface...?
@Freakhealer
@Freakhealer Жыл бұрын
await 2, definitly love to know that is possible, but i cant imagine myself using such syntax, seems obscure, even the await 2.ToSeconds() looks odd 😅
@ernestotejeda6114
@ernestotejeda6114 Жыл бұрын
What about await (2 * 100); ? :)
@yuGesreveR
@yuGesreveR Жыл бұрын
Yeah, duck typing + extensions can do crazy stuff in C# code (but nevertheless sometimes useful stuff). However, even this cannot help with awaiting possible-null Tasks, that is very annoying for me personally. I hope that someday we will see await? operator, because I hate writing the code like: await (task ?? Task.CompletedTask)
@vorontsovru270895
@vorontsovru270895 Жыл бұрын
"await 2" is something I wouldn't risk showing to anyone, except at interviews. Although even this option is still questionable, to put it mildly.
@runnerup15
@runnerup15 Жыл бұрын
Lmao await 2 is so cursed
@somebody3
@somebody3 Жыл бұрын
Definitely "it is possbl" :-)
@nanvlad
@nanvlad Жыл бұрын
You just showed a wrapper around any class using TaskAwaiter class. To dig deeper we can create a custom class with GetResult() method which is returned by GetAwaiter() of another class or extension method. I tried to make all .net classes awaitable by adding such extension methods and it worked pretty good, but I couldn't make my code compile because it's not allowed to use async method with such approach. For example, I can await obj.Method() which returns string, but I can't mark my method as async without Task/ValueTask (public async string Method() fails on compilation)
@loottimo
@loottimo Жыл бұрын
For that you need your own AsyncMethodBuilder
@mahesh_rcb
@mahesh_rcb Жыл бұрын
Can I await await ; just curious 😅😅
@paulkoopmans4620
@paulkoopmans4620 Жыл бұрын
I personally would only consider the custom Delay class as the only valid option. It is very clean and easy to understand. Any extension methods on base types like int, string, etc., including TimeSpan is too far for me. I would reason that the representation for a TimeSpan is just a length or segment of time. It does not imply that a TimeSpan is only for a delay purpose. And yeah.. on int... that is just evil.
@remorcist2499
@remorcist2499 Жыл бұрын
Are there any other negative factors about this implementation or just that its not that legible? Great video btw
@nickchapsas
@nickchapsas Жыл бұрын
The only negative factor is that it's gonna cause a lot of confusion to people who don't know how the hell this is possible
@user-uu6xz6lk6o
@user-uu6xz6lk6o Жыл бұрын
TaskAwaiter type is intended to be used only by a compiler (from docs)
@nickchapsas
@nickchapsas Жыл бұрын
@@user-uu6xz6lk6o There are many things intended to be used only by the compiler but we use them daily. If someone was supposed to be 100% compiler only, then trust me, the compiler team could have made the method only compiled visible.
@isnull_or_empty
@isnull_or_empty Жыл бұрын
C# is kinda wild these days. Almost overwhelmingly so.
@Wizatek
@Wizatek Жыл бұрын
I never really understood the await, doesnt the program also wait until a function is executed without telling it to await it?
@nickchapsas
@nickchapsas Жыл бұрын
No it doesn't. That thread is released at that point and given to some other work in that program and will come back when the wait is finished.
@DmitryKandiner
@DmitryKandiner Жыл бұрын
It would be nice to have something like ** await Delay.For(2).Seconds(); **
@ws_stelzi79
@ws_stelzi79 Жыл бұрын
Hey this is a nice showcase of how you actually can produce super dark black magic with C#! 😇😶‍🌫
@user-fe5nv2ex3x
@user-fe5nv2ex3x 7 ай бұрын
New footgun just dropped yo!
@ronelm2000
@ronelm2000 Жыл бұрын
....I'll just use the typical Async. If I need to extend a class I'll just make a new Task method instead
@jonathansaindon788
@jonathansaindon788 Жыл бұрын
The await 2.seconds is very readable to me.
@djenning90
@djenning90 Жыл бұрын
You say, “hello I’m Nick…” but the closed captions say, “Hello, I’m naked in this video” 😂😂😂
@asteinerd
@asteinerd Жыл бұрын
This is cool, up to a point. It also makes a strong assumption that a developer is following SOLID Principals, ensuring each class only has a single responsibility to manage. I can't say I would ever use it, because it puts a SINGLE task for the entire class, versus the more common case of needing multiple methods to be `async`. I'm sure everyone could find at least one good use for it in their existing code-base.
@henryhahn1938
@henryhahn1938 Жыл бұрын
Great idea, I will bookmark it. Btw: You could speak a bit more slowly in your videos. I sometimes check if I have set playback to 1,5x when starting one of your vids 😁
@stefanvestergaard
@stefanvestergaard Жыл бұрын
Halloween special :D
@calebdany5085
@calebdany5085 Жыл бұрын
What do you mean by ducking? Please explain
@QwDragon
@QwDragon Жыл бұрын
Duck typing. If it has a method compiler can call, it calls it regardless any interface implementations and without cast to any interface.
@MrPMCJr
@MrPMCJr Жыл бұрын
It comes from the expression "if it walks like a duck and quacks like a duck, it's a duck"
@calebdany5085
@calebdany5085 Жыл бұрын
@@QwDragon i understood thank you
@R.Daneel
@R.Daneel Жыл бұрын
Your code should be written for other people to understand first. Other considerations are secondary. If your code would illicit the response, "what is going on?" from a coworker familiar with the requirements, it's time for a refactor.
@matthewsheeran
@matthewsheeran Жыл бұрын
Technically there is nothing wrong with it: you can extend prototypes including globally in JavaScript and base Objects in say Smalltalk the original OOP language, even overload operators in C++, so this is really old news (and Smalltalk is very very old). But like you say you only do it if there is a real need and where you are building something DSL-like i.e. an embedded scripting language for example. What are Workflows (inc. WWF) for example but just a "visual" DSL language extension! (Only WWF is shit because the underlying "language" isn't code but XML.)
@AldoInza
@AldoInza Жыл бұрын
If you see something novel once in a codebase it's an oddity and a mistake to leave in. if you see something novel a dozen times, it's just part of the code style.
@browny99
@browny99 Жыл бұрын
I would throw hands at a dev if they used await 2, honestly... However, i will be borrowing that as a little joke for my portfolio projects
@kinangh98
@kinangh98 Жыл бұрын
I swear to god if i can click the Subscribe button again I would do it 😂💙.
@benjaminschug5572
@benjaminschug5572 Жыл бұрын
Autogenerated subtitles: "hello everybody I'm naked in this video" 🤨
@_Aarius_
@_Aarius_ Жыл бұрын
ah yes, cursed c#. my favourite
@dmitrykim3096
@dmitrykim3096 9 ай бұрын
Sometimes I hate extensions, such a dangerous tool and its not explicit
@MicroLosi
@MicroLosi Жыл бұрын
When it takes long time to understand what a line of code does - it is bad approach. So "await 2;" is funny trick. Nothing more. Even "foreach(var i in 0..9)" is fine. you can understand the line. But not awaiting of 2 ))
@QwDragon
@QwDragon Жыл бұрын
It always depends on situation. What's better: - 100 lines of code where you spend 6 seconds per line (10 minutes per all code) - 10 lines of code where you spend 1 minute per line (10 minutes in total too) This is a controversial example and you can prefer any. Most common opinion is 100 lines, my personal is 10. But what if I add a bit more context: similar code is appearing like 1000 times in the codebase. So now if in all the places you have 100 of lines, you have to spend the same time on them, you have to scroll a cople of screens every time even if you want to skip this piece of code already knowing what it does. But if it's 10 lines, you can easily skip it and you can easely identify it as one of this pieces. So in such case the second way is much more beneficial.
@VerificationInProgress
@VerificationInProgress Жыл бұрын
1:35 and then i have a mess
@efrenb5
@efrenb5 Жыл бұрын
Not gonna lie, the "await 2.Seconds();" looks VERY purty. It would confuse a lot of people though, specially people learning.
@MadeByGPS
@MadeByGPS Жыл бұрын
sixth
@TheAceInfinity
@TheAceInfinity Жыл бұрын
I've got a few months until April Fools at least.
@nove1398
@nove1398 Жыл бұрын
Actually, I don't hate you for this, but it looks very dangerous lol. The young guys would go wild
@luuc
@luuc Жыл бұрын
You have cursed us with this knowledge
@loop8946
@loop8946 Жыл бұрын
await 2; lmao talk about job security ^_^
@TheDiggidee
@TheDiggidee Жыл бұрын
What the hell have you just created you monster!?!?!?!
@nickchapsas
@nickchapsas Жыл бұрын
I will not be taking questions at this time
What are record types in C# and how they ACTUALLY work
15:36
Nick Chapsas
Рет қаралды 116 М.
8 await async mistakes that you SHOULD avoid in .NET
21:13
Nick Chapsas
Рет қаралды 307 М.
Чай будешь? #чайбудешь
00:14
ПАРОДИИ НА ИЗВЕСТНЫЕ ТРЕКИ
Рет қаралды 2,1 МЛН
СҰЛТАН СҮЛЕЙМАНДАР | bayGUYS
24:46
bayGUYS
Рет қаралды 828 М.
1❤️
00:20
すしらーめん《りく》
Рет қаралды 33 МЛН
Why is C# Evolving This Way?
15:02
Zoran Horvat
Рет қаралды 20 М.
Don't throw exceptions in C#. Do this instead
18:13
Nick Chapsas
Рет қаралды 248 М.
Why Developers Hate "Clean Code"?
14:39
Nick Chapsas
Рет қаралды 41 М.
RECORD TYPES | Exploring C# and DOTNET | Rahul Nath
15:32
Rahul Nath
Рет қаралды 2,3 М.
how Google writes gorgeous C++
7:40
Low Level Learning
Рет қаралды 771 М.
Stop using LINQ to order your primitive collections in C#
14:57
Nick Chapsas
Рет қаралды 96 М.
Await Async Tasks Are Getting Awesome in .NET 9!
9:24
Nick Chapsas
Рет қаралды 86 М.
Why all your classes should be sealed by default in C#
11:43
Nick Chapsas
Рет қаралды 91 М.
Чай будешь? #чайбудешь
00:14
ПАРОДИИ НА ИЗВЕСТНЫЕ ТРЕКИ
Рет қаралды 2,1 МЛН