Hello everybody. As some people have already pointed out, after 13:50, when I'm returning a ReadOnlySpan, the ToString() on line 21 should be removed. I didn't notice because of the implicit operator. If you leave the ToString() in then you still allocate the string you return. - Keep coding
@lipatovsa73 жыл бұрын
Great video. But where could I check source code?
@nickchapsas3 жыл бұрын
@@lipatovsa7 The source code is available to my Patreons
@PeterManger3 жыл бұрын
Thought you were just testing if we paid attention!
@roflex23 жыл бұрын
@@nickchapsas What would be the benefit/differences in using method(in string text) method(ref string text) ?
@nickchapsas3 жыл бұрын
@@roflex2 strings are immutable in C#. Even if you pass down explicitly by reference your can't change the value of the string. You just point to a new string reference type
@GeraldOSteen3 жыл бұрын
I'm a systems developer and primarily work with low-level languages like ASM, C, C++, etc., so I don't have a lot of experience on the intricate details of optimizations for managed languages. Explanations like these are invaluable and I find them immeasurably useful so I thank you very much for this.
@KayOScode2 жыл бұрын
Yeah typically managed languages have to add complex features to get the same speeds we get using lower level languages. Its a big trade off in my opinion. In those languages you usually either have to swallow performance penalties or readability penalties. In languages like c++, using a pointer isnt going to confuse anyone. So really I prefer those languages, but it is cool to learn the intricacies of these languages. In particular because I use it for a my job
@minciNashu2 жыл бұрын
C++ also introduced similar concepts as standard, and before that there were 3rd party libraries providing some kind of span. See std::string_view and std::span
@KayOScode2 жыл бұрын
@@minciNashu arent those features kind of just bloat though. We have void* and thats all we really need
@mikicerise62502 жыл бұрын
My first thought was, I mean, great, but why do I get the impression that C# has a lot of tricks for solving problems caused by C# in the first place? ;) Why not just have a span method on the string that returns a readonly reference to a section of the string?
@josephmathes2 ай бұрын
@@mikicerise6250Did you have a second thought?
@chrisd9613 жыл бұрын
I'm so impressed by these explanations. Honestly, the best thing to happen for a junior dev, is to find your channel. Great explanations, very helpful videos with in-depth knowledge and analysis. Thank you, please keep doing them!!
@evolvedant3 жыл бұрын
When I first watched Microsoft themselves explain Span, I was lost and confused. They have a knack for making something sound way more convoluted and complex than needed when they explain new concepts. This video made it all click instantly. Thank you very much, I can't wait to start using Span in my own work.
@Faygris2 жыл бұрын
The same is true for their documentation
@mrx100012 жыл бұрын
ye microsoft love overcomplicating every single one of their examples.....they need to hire people to teach them to keep things simple. Especially for their documentation.
@sasukesarutobi38623 жыл бұрын
Span is a really under-rated feature, not just for performance, but also my favourite pun in C# - TimeSpan
@RichardNobel3 жыл бұрын
Spantastic pun 😉
@RichardNobel3 жыл бұрын
If you have a dog... it's probably a Spaniel ? 🐕
@jeffwilson82463 жыл бұрын
Lately the news has been so dull I've tuned into Cspan
@tuck17263 жыл бұрын
@@jeffwilson8246 This whole thread makes as much sense as watching C while only wearing a . I don't get the OP. I understand span and TimeSpan, but I don't see the pun. I am the dummy cause 40+ people saw it. Guess I need to get out of my static internal scope of thought.
@Manlyman7893 жыл бұрын
I love these types of videos that explain the standard classes in the framework that help you write more efficent code. These are the types of things I don't stumble upon when researching how to solve a problem. I would love to see more videos like these!
@binjozoken60553 жыл бұрын
To me, these are the best technical videos on the net, even though about 95 percent of them are over my head. This video, however, was worthy of getting a bowl of popcorn, sitting back and just watching. Thanks a bunch, Nick.
@Pouya..2 жыл бұрын
I'm a senior developer with 10+ years of experience and I learn so much from your videos thanks in advance
@Songfugel4 ай бұрын
If anyone else is watching this post C# 13 the bits mentioned around 12:10 are no longer accurate afaik, since the support for those things were added in in C# 13 ps. love the video, even though it is getting old, it was still very educational
@ristopaasivirta97702 жыл бұрын
Thank you for this video. As Unity 2021 LTS now supports spans this gave a really good introduction and explanation on how to use them. Also the ref struct is valuable information since I have some very short lived structs for triangles and other mesh-related objects that only live for the duration of the method.
@DepressionAlgorithm3 жыл бұрын
Didn't learn anything new in this, but I'm impressed by your presentation. I would have more quickly learned how Span works if this was the first video I saw about it.
@JoeEnos3 жыл бұрын
As usual, you explain the nuts and bolts, the theory, and the benefits, all better than the documentation and anything else I’ve found.
@jackkendall64203 жыл бұрын
Great video. This is a topic I've been half-aware of for a while, but seeing it in context helps a lot.
@RichardNobel3 жыл бұрын
Great explanation, Nick, yet again! Thank you for taking the time, in your very informative videos, to show us what's happening "behind the scenes". On the heap, stack, etc. 🙏🏻
@AndreMauricio43 жыл бұрын
hey Nick, I have been watching your videos for a while. Just want to thank you so much for the learnings I got from them. You cannot imagine how helpful you are to people like me. I am using these learnings in a software solution I am developing myself already for a year. Again, thanks!!! Andre from Portugal
@kodikodi9948 Жыл бұрын
this is the first explanation of Span that made sense to me. thank you!!
@minciNashu2 жыл бұрын
When you talk about allocation, it's important to stress that span doesn't really copy the source memory on the stack. The span object itself - containing probably a starting pointer and a max size - is created on the stack.
@Maxi-xw1jb Жыл бұрын
Very true👆He should explaine it, otherwise it's misleading
@marcomarek77342 жыл бұрын
4:18 benchy was such a cute name 😍😂 didn't see that coming
@Cruz0e2 жыл бұрын
if I understand this well, when you use the span, like: Readonly dateAsSpan = _dateAsText; you make a new variable called "dateAsSpan" but it's not allocating new memory for the "value" itself (in the heap), but instead just basically stores a reference, similarly when in c (normal C, not ++ or sharp) if I had a function like this void double_it(int *j) { j *=2 } using "int *j" instead of "int j" (* means that you pass by memory address reference instead of value)
@AB-fb1ve3 жыл бұрын
Span is a powerful structure but has some limitation, what about Memory and what is the difference between them
@Deathhead683 жыл бұрын
Had missed the memo on this one. Thanks, this was really informative!
@Sgro813 жыл бұрын
Nothing new under the sun but very well explained. It's useful to have this kind of videos around, proper knowledge should be distributed like this.
@marksmod2 жыл бұрын
Isn't the ReadonlySpan allocating at least a copy of the string on the heap? For example, consider: string s = "123"; ReadOnlySpan span = s; Console.WriteLine(int.Parse(span.Slice(0,2))); s = "321"; Console.WriteLine(int.Parse(span.Slice(0,2))); produces: 12 12 Oh, since strings are immutable in this language, the second time we assign to »s« we actually perform a second heap allocation, and »span« can happily use the address to which »s« pointed to when »span« was defined. And some smart-pointer-like stuff.
@KeesSchollaart3 жыл бұрын
Curious to learn how it deals with byte arrays, compared to working with strings like you demo'd.
@snuffsix95983 жыл бұрын
Your video's are awesome. I very much appreciate the technical in-depth explanations of them. Thanks a ton!
@pedrocunha43222 жыл бұрын
I really appreciate your content Nick, helped me a lot improve the way i code :)
@oshastitko9 ай бұрын
Very cool explanation! Thank you!
@scabendlin2 жыл бұрын
wohoaaaa!!! now i understand a bit more the use span and garbage collectors....thanks nick!!
@arlvinmoyo92902 жыл бұрын
Amazing delivery. Thank you!
@RichardNobel3 жыл бұрын
Should we refer to the _Span_ Slice method's start _index_ as... *"Spandex"* ? 😜 When a (male) programmer is very good at using Span... is he "SpanKing" ? 👑 (Or even Span heh). 🤴🏻
@ivailomanolov69083 жыл бұрын
wtf
@rainezombi34312 жыл бұрын
Your short brought me here. Good stuff!
@inxaneofficial77569 ай бұрын
Good video, very insightful !
@andreaskarz3 жыл бұрын
Wow, I never see before but I will us it in the next projects -- thank you.
@Sad-Lemon2 жыл бұрын
Very nice explanation. Will surely be helpful in my work. Thanks!
@misomalu3 жыл бұрын
Excellent video and presentation.
@davemasters2 жыл бұрын
Brilliantly explained, as per usual.
@tehsimo2 жыл бұрын
That memory view in rider is awesome
@xinzhouping3 жыл бұрын
you should make a follow up video on ref structs if you haven't already.
@m0ment2193 жыл бұрын
This is... I can't believe how many times this could've helped me...
@harag93 жыл бұрын
Great vid Nick, and there's me still working in c#7, .NET 4.8 & WinForms... I'm so far behind these days, but good to see new features in c#. I just wish the company I worked for didn't work on 15-20 year old projects...
@aminejadid27023 жыл бұрын
don't worry, it's the same for me. Working with .Net framework 4.6.1 ! But i never stop learning new technologies. It is the only way
@harag93 жыл бұрын
@@aminejadid2702 Same here, but I'm now losing interest doing it in my spare time, so unless I do it at work I lose the new skill.
@RealisableSoftware3 жыл бұрын
Add the System.Memory Nuget package. It's not everything that you get with core, but you get some benefit.
@aminejadid27023 жыл бұрын
@@harag9 You can always find a better job.
@horowitzhill64803 жыл бұрын
.net 4.0 for me at work 🤣
@user-py9cy1sy9u3 жыл бұрын
Its nice to see that D is benefiting C#
@igorthelight3 жыл бұрын
6:15 - You could access String as an array too! But if you would try to change even just one char like that: string myString = "Hello!"; myString [0] = 'h'; // This will not be compiled! It still would allocate a whole new string. StringBuilder do not behave like that tho so you could do that: var sb = new StringBuilder("Hello!"); sb[0] = 'h';
@Dennis199013 жыл бұрын
The indexer of a string in C# is get only. What you wrote is invalid code.
@igorthelight3 жыл бұрын
@@Dennis19901 Thanks! I pointed out that this line can't be compiled.
@hirenpatel22363 жыл бұрын
Nicely explained!
@kateryna-a12 жыл бұрын
You are amazing! Thanks for your explanations
@rifatislamrakesh2 жыл бұрын
Marvelous ! To the point. Respect !
@tobiasj8019 Жыл бұрын
Very nice and helpfully 🎉
@CodingGustavo3 жыл бұрын
Does int.Parse accept a Span? or theres a implicit conversion from Span back to string?
@nickchapsas3 жыл бұрын
There is an overload with Span yeah
@PontusWittenmark3 жыл бұрын
Great explanation, Nick 👍
@easycodeunity3d142 жыл бұрын
Thank you very much
@milanmladenovic3 жыл бұрын
Hi Nick, great video as usual :)
@stuartbooth82323 жыл бұрын
Great vid easy to follow thankyou
@coffee22able3 жыл бұрын
Great Video, thanks for the board explanation, it was awesome!
@yonatankarni88672 жыл бұрын
In comparison to C- span sound like a pair of pointers, and slice moves one of them. I hope I got the idea of this feature thanks!
@im1in260m Жыл бұрын
Thank you Nick. Your videos are easy to understand, neat and to the point. I looked on your web site at the courses and wanted to know if the Dependency injection was based on a third party app. I was unable to locate a way to contact you there.
@rossthemusicandguitarteacher3 жыл бұрын
This is great.
@Cassiopeja223 жыл бұрын
Excellent explanation, Nick! Thank you very much. :)
@my_temporary_name3 жыл бұрын
Great presentation, thank you!
@MarioRamosMontesinos2 жыл бұрын
Nice content!
@HomeSlize2 жыл бұрын
good stuff! thanks for sharing.
@amirdar2 жыл бұрын
Great video as always! in 2:26 how do you get to that debugger window with the memory tab ?
@elitetechacademy3 ай бұрын
Thank you
@jonowilliams263 жыл бұрын
Quality content as always !
@tzurdo12 жыл бұрын
Another great video Nick! A small question - is there a way to split Span into array\list of Spans? Or actually, what is the best way to do it, without iterating by myself over the Span?
@gbelkin43 жыл бұрын
Brilliant as usally, Nick :-)
@bovineox11112 жыл бұрын
Great video. I believe application only stops (completely) for GC when using workstation GC as opposed to server GC - you should compare the differences as they are quite striking and too long to go into here.
@TheCMajor9th3 жыл бұрын
great example m8 ty for the presentation
@JtendraShahani2 жыл бұрын
Hi. Thank you for the tutorials. I have learned a lot. I wanted to know how do you get the results inline. Thank you.
@SealedKiller3 жыл бұрын
So it's like a StringView, providing a view into the string pretty much.
@igorthelight3 жыл бұрын
True For those who are not aware - It's std::string_view (after you #include ) in C++ 17
@PaulSinnema Жыл бұрын
Huh, I do understand that returning the Span is advantageous but in your example you return 'yearAsText.ToString()' althought the return type is 'ReadOnlySpan'. What happened there? Some implicit conversion?
@gerb141928 күн бұрын
@Nick Chapsas What is the "Memory" debug window ? My memory window looks completely different. But yours looks very convenient, it allows you to conveniently view the current state of memory. How to connect such a window?
@Aaron310562 жыл бұрын
At 10:40, wouldnt it be an offset of 2 instead of 3? Im guessing that its a 0 based offset, so the first value in the string would be index 0 and the third would be 2, so if we want to start reading the month which starts at index 2 the offset would then have to be 2 right? (+2 offset and 2 length).
@travelfirangi62623 жыл бұрын
The best👌👌
@digitalpacman3 жыл бұрын
You should have maybe ran the test with a changing date every time. Strings in c# are instantiated once per instance and re-used. So "foo" in variable a and "foo" in variable b are both the same "foo" in memory. This likely will show a more realistic real world use case.
@bomite3 жыл бұрын
Nice, thanks for that!!!
@tianjinghan12 жыл бұрын
That is a great video, thanks, Nick. May I ask what IDE you are using?
@Radictor442 жыл бұрын
Very good video - has helped to clear up my understanding of Span :)
@xinli74775 ай бұрын
May I know which editor you are using? Thank you!
@mehdihadeli3 жыл бұрын
Hi, Thanks for your great video, Please record a view about diagnostics and tracing in .NET 5.
@EdKolis11 ай бұрын
In your last example you changed the return type but forgot to remove the ToString call from the method, negating the performance benefit. But thanks for explaining Span (and ref struct) in an understandable way; neither of those ever made sense to me until now!
@chiragdarji15712 жыл бұрын
Phenomenal!!!
@DynotoeTube3 жыл бұрын
So I wonder if there is a similar use of SPAN for a more common task of parsing CSV comma delimited strings?
@nickchapsas3 жыл бұрын
Yeah that's a great usecase
@SuperSpeed523 жыл бұрын
This is excellent for string manipulations
@1Eagler2 жыл бұрын
The stack Size is 1MB. Will it get full?
@eperez_yt3 жыл бұрын
Nice! I learned a new C# feature. Span look like pointers, so I'd have liked to know what would have happened if dateAsText had changed, and make sure if span really works like pointers. (: BTW i appreciate your video.
@rajm19763 жыл бұрын
In order to make use of the Span 'value' you still need to convert it ToString(), which as you say loses the value in Span, unless the resulting string is a concatination of a bunch of Span.Slice functions. So you could take the fact that Span is basically an Array and then join them together to produce the final result.
@nickchapsas3 жыл бұрын
As you can see in the pinned comment the ToString() in the method that returns a ReadOnlySpan was a mistake. You don't need it and if you don't use it you don't allocate until the final ToString()
@10199able3 жыл бұрын
So this is how you use memory tab in Rider!
@shoooozzzz Жыл бұрын
I **think** there is a little bug at the end of the video. Line 21 you are calling and returning `ToString()` As I just learned in your video, this would allocate memory on the heap requiring GC at some point. Again, this is all stuff I learned from YOU. So thank you
@shoooozzzz Жыл бұрын
Aaaaaaaaaaaaaaaaaaaaaaand I just saw the pinned comment 🤦🏻♂ Oh well. Guess this shows I'm paying attention and learning stuff
@mabakay3 жыл бұрын
If int.Parse did not need to input string but span why Console.WriteLine need it?
@neriacohen54902 жыл бұрын
Amazing
@easycodeunity3d143 жыл бұрын
Awesome!
@VasoPerasLikodric3 жыл бұрын
I guess that Parse method have span override. But what is happening if we need to use method which will except string. I guess it will have implicit conversion there.
@nickchapsas3 жыл бұрын
If the method needs a string then the return string will be allocated but you can prevent any potential allocation during the mid-way processing in the method, depending on the workload. Also yeah, int.Parse has a span overload, including many other things that used to accept string.
@mehmetedex3 жыл бұрын
this is brillant
@Dawhun3 жыл бұрын
Hello, great video as usual :) Do the .ToString() really needed in the YearAsText() method return ? (end part of the video)
@nickchapsas3 жыл бұрын
It did because at that point it is a ReadOnlySpan not a string and the Console.WriteLine method doesn't have an overload for it.
@TylerEich3 жыл бұрын
@@nickchapsas I was wondering about YearAsText, line 21. Would the `ToString()` there still allocate on the heap and then implicitly converts the string to the ReadOnlySpan? I would’ve expected `return yearAsText` without the `ToString()`
@metaltyphoon3 жыл бұрын
@@TylerEich No you don’t need to do ToString(). What you would be returning is a readonly ref struct to the caller and in there you can do the ToString()
@nickchapsas3 жыл бұрын
@@TylerEich Sorry, Yeah not that you pointed out the line I understand what you mean. No that's a mistake. I added a pinned comment to explain that. I missed it because of ReadOnlySpan's implicit operator.
@ivailomanolov69083 жыл бұрын
Good video
@Maxi-xw1jb Жыл бұрын
Could someone advise, why he is talking about the stack? It seems Span or ReadOnlySpan doesn't allocate in stack? You need to use stackalloc to place something in stack first
@grainfrizz3 жыл бұрын
Very nice
@Ayomikun3 жыл бұрын
Great video as always. Is this only ever useful for strings? Thanks
@nickchapsas3 жыл бұрын
A span resembles an array so it can work as a byte array, int array and so on
@TheSpacecraftX3 жыл бұрын
What's with using all the vars? Explicit types are there to help you. I would hate to come onto a project to maintain it and find everything is declared with var.
@nickchapsas3 жыл бұрын
If you deem readability based on the explicit types then you have way bigger issues with your codebase’s cleanliness. Use better method and variable names
@nickchapsas3 жыл бұрын
@Michael Brown There is no right or wrong in such a matter. It's by nature subjective. If there was a right way then Microsoft would have never added var to force you to use an explicit type. var is a feature that came later in C# so if you were to make a right or wrong distinction then the addition would favor the usage of var. It's not something I agree with though. You can prefer it, but it is absolutely not "the right way".
@OvRaf Жыл бұрын
perfect
@MajeureX2 жыл бұрын
With respect to writing a Span to the console, I presume you can use Console.Write(char) while maintaining its benefits? Indeed, perhaps there's a built in Console.WriteLine(Span) method? (I've not checked)
@nickchapsas2 жыл бұрын
There is but that wasn’t the point of the exercise. I assume that the user needs a concrete string back so I don’t break the code contract. Even the span overload does a ToString internally and allocates the string so it’s not magic
@MajeureX2 жыл бұрын
@@nickchapsas Interesting. Would it be more efficient for the WriteLine method to not allocate a string and just repeatedly call Write(char)?