You are such a great teacher. Many blessings to you. Simplicity is born out of a deeper understanding. Your tutorials are brilliant, like a breath of fresh air.
Glad you're still with us. Sounds like a crazy experience, that tsunami... Hopefully one day I will learn French or find a translated copy of your book. Interesting to see you coding!
You're my fav C# instructor. Period! I don't know what moment or who sparked the idea in your head that you decided to share your knowledge with the world, I'm just grateful that you did :-)
You're hands down the best teacher I've ever seen. Nothing is left unexplained, everything is always very clear and simple to understand. Thank you so much for inspiring other programmers through your awesome videos!
Tim, great course. I like the way you explain "why" we would use Generics in real-world scenarios as opposed to just giving us "high-level" examples. Note that this teaching method sets you apart from other teachers. Also, you showed us an example where originally we don't use generics and then where (and why) we would use Generics (code reuse and decoupling logic implementation from actual data types).
0:00 - Intro 1:33 - Creating a List of T 4:03 - Why not to use ArrayList and why generics are useful 11:10 - Demo app walk through pt1 22:56 - The problem: repetition 28:55 - Solving the repetition with generics; Demo application walk through pt2 47:50 - When to use generics 50:41 - Passing in more than one type generic
what I iike about your tutorials like this one, is you don't over complicate things and I believe you always consider the level of skill of your watchers, explaining how and why things are done in a certain way. thanks Tim.
The professor who doesn't assume understanding of some specific part of the explanation makes my understanding much better. Thank you a lot Tim Corey, for providing such a good content and yet free. Thanks from Brazil.
Nice video as always Tim. Just a note on 35:20 for anyone interested in reflection: You can still grab the properties of a class, using reflection, without creating an instance of that class. This will compile and perform the same task: *var cols = typeof(T).GetProperties();* The instance was still needed in Tim's example though, since he's returning instances of that class in the Load method.
I had no problems whatsoever understanding why it was done this way and how generics work, and I forsee it saving me a lot of work in the future. Thanks a lot Tim....
Fantastic video Tim. What shortcut did you use at 23:46 to rename p to log in just that method? I tried web searching for it and cant find that same menu option you have with "Rename 'p' to 'log'".
Adicted to IAmTimCorey channel. Learning makes easy when we find the right person who can answer our questions without asking them. You are a Great teacher and your efforts are really amazing. Thank you so much Sir. Love from India
Everyone on here has benefitted from Tim in one way or another. Please subscribe to this man's Patreon, even if it's just the $1, that's nothing compared to the value he provides us for FREE! Support this guy!!!
I have no idea how anyone could possibly give this video a thumbs down. Thanks Tim! You are awesome. I'll be heading over to Patreon real soon. Appreciate all you do to make our lives easier and wealthier!
Agree. One of the best teachers that I've found so far. Really clear, in-depth, not going on too fast (like some others just rushing on), so it's easy to follow and grasp. Brilliant! Thanx a lot. :)
thanks a lot for this excellent and wonderful tutorial about generics. I made some changes on reflection parts and I would share with you guys: public static List LoadFromTextFile(string filePath) where T : class, new() { var lines = System.IO.File.ReadAllLines(filePath).ToList(); List outputList = new List();
var properties = typeof(T).GetProperties();
if (lines.Count < 2) throw new IndexOutOfRangeException("The file was either empty or missing."); // Splits the header into one column header per entry var headerColumns = lines[0].Split(','); lines.RemoveAt(0); foreach (var row in lines) { T entry = new T(); var rowValues = row.Split(','); foreach (var column in headerColumns.Select((columnName, columnIndex) => new { columnName, columnIndex })) { var propertyRef = properties.SingleOrDefault(property => property.Name == column.columnName); if (propertyRef != null) { object typedValue = Convert.ChangeType(rowValues[column.columnIndex], propertyRef.PropertyType); propertyRef.SetValue(entry, typedValue); } } outputList.Add(entry); } return outputList; } public static void SaveToTextFile(List lstData, string filePath) where T : class { List lines = new List(); if (!(lstData?.Count > 0)) throw new ArgumentNullException("data", "You must populate the data parameter with at least one value."); var properties = typeof(T).GetProperties(); lines.Add(string.Join(",", properties.Select(c => c.Name))); foreach (var row in lstData) { var rowValues = properties.Select(c => c.GetValue(row)).ToList(); lines.Add(string.Join(",", rowValues)); } System.IO.File.WriteAllLines(filePath, lines); }
Man been watching and liking all your vids. They are solid. As a person finishing up a year's worth of c# classes, I still find your way of teaching really easy to understand, and the tips and way in which you deliver information is extremely helpful. Many thanks buddy!
Very helpful video. Generics explain in a practical way. Good teaching methodology. Not overcomplicated way of sharing your knowledge. Keep it simple Tim!
Great video helped a bunch. Wish my teacher would take the time to explain like this instead of using PowerPoint presentations from 10 years ago, while talking for 2 hours yet explaining nothing. xD
Thanks for the feedback. Tim believes in giving context for what he is teaching and that takes time. His goal is not entertainment or just to dump code on you but true education. Very happy you appreciate that!
wish you could go around the world to teach the teachers how to teach... wow, I feel super happy to have came across your channel. "ke a leboga, thata"(Thank you very much(all the way from RSA))
36:00 For Example If I don't have to write T entry =new T(); in other any methods then I don't need to specify new() key word in method signature right.
We are using T because we don't know the specific type. Pretend for a minute that T was PersonModel. See how that would look? Now remember that we are creating a generic method where we don't know what the type being passed in will be. We name that type T.
Thank you for your videos, there are amazing. You help me so much to learn, and your sound and spelling is so clear to make it easy to understand for people that english isnt their native language.
Well, thank you Tim for the great content you provide for free to us, the C# developers community. I have an old habit I took when learning C language, a long time ago when I was a student. I always put my checking code at the beginning of my methods, before any declaration or usage of variables and objects. So that I get rid of incorrect or incomplete values before going further, for instance by raising an exception or returning an error code. I don't know if it's a good practice, but I'm sure data is correct after that checking step.
Hi Tim, I don't know if this is important, but in my csv-file every line is put into one Excel-cel instead of 3 as it is in your csv-files. Perhaps this is an ignorant question but do you know why this happens?
CSV stands for 'Comma-Separated Values', so do you have a comma between the items you want in separate cells? Just a place to start your investigation.
I was busy watching your other Videos, but today was the Time, yay. I've been using a separate class like processor for every model like you said :) where i was doing queries with Dapper and Today was the day when I put them all in one place. I was allways feeling that I'm repeating my self, and I really was! Thank you very much Tim
You are so good sir, you explain it clearly. Even the topic is pretty advance for me, I can imagine things by your words. Thanks for making this video:)
Excellent video, Generics have always been a bit confusing to me and it helps me best when there is a practical demo like in this video. So thanks for that
I have always struggled to understand generics and how to use collections and this video just broke it down for me in the simplest way. You are awesome at how you approach topics and i jsut subscribed to you channel so i can learn more
Thanks! That's actually a pretty common time for me to be recording. I only get a few hours a day where I can record right now (from about 10pm to 2am). I am actually working on some soundproofing and other things so that I can record earlier in the day without degrading the sound quality. Once I get that in place, I can record starting at about 9pm. Once I quit my day job (that is based upon the amount of income I bring in from videos), I can record all day long. That will GREATLY increase the amount of content I can put out. That is also when I'll start being able to put out a video per week in other languages that complement C# like SQL, HTML, CSS, JavaScript, etc. My first priority will be C# but once I have more time, I can support developers more fully in the other areas as well.
Tim ,If that's the route you wanna go, I honestly think you need to put out a lot of your content on Udemy and other sites and make them paid courses. Your explanation is just fantastic and you deserve to get paid for it!
Well, I will be doing more paid courses in the near future (and long-term). I have a few at IAmTimCorey.com but I'll be adding a few more soon. I've looked at Udemy but they really take a lot from teachers (50% plus they set pricing so your $40 course might be sold for $10 without your say). I really don't want to go down that road. I'll stick with my own platform where I can charge a reasonable amount and get about 95% of the asking price. I appreciate the kind words.
IAmTimCorey ah true! See I don't know what their cut is, but yes that's a lot. But you're a real good teacher and would do great doing this full time! Will take some time to get there for sure. Good luck ! :)
Hey Tim! I am a very big fan of your videos! Thank you for helping me learn C#! I was wondering if you plan to make a follow-up on generics and speak about how we can use generics and dependency inversion together as principles to make dynamic interfaces that we can reuse? I think it is a very interesting and challenging topic that most people would appreciate.
I do have an add-on course to my C# Application from Start to Finish course where I replace the WinForm UI with WPF (using Caliburn Micro and MVVM) if you want to check that out: iamtimcorey.com/courses/tournament-tracker-wpf-user-interface/
@ 50:14, line 11, couldn't you instead have "public static List LoadFromTextFile(string filePath, Type T) where T : class, new()"? if what I wrote is valid, what is the difference, if any, compared to your line 11?
You still need to declare the in the name. You wouldn't need to pass in the type when calling the method explicitly because the added parameter specified the type but then you are creating an extra parameter (extra overhead) for no extra benefit.
Notes that i took: Generics are helpful to for example not create mutliple methods doing the same thing. Imagine having an array of type int, an array of type double and array of type string. If you'd want to print out the contents of these arrays, you would normally have to create three methods with three different parameters to display them. One with an int parameter etc. Instead, you can create a Generic Method. A Generic Method is created by putting " " at the end of the Method name. Then the parameter. Instead of putting a data type as a parameter, you can instead put "T" as a parameter and then call it three times with the different arrays. So instead of having 3 different Methods to call these three different arrays with different data types, you can create one generic method which accepts all data types. You can call your generic whatever you want, it doesnt have to be "T". ------------------------------------------------------ The T in generics specifies which type we are talking about.
In the load LoadTextFromFile function The that you pass in is a string, but then you say "Where T : class, new()". Wouldn't that "Where" statement require you to pass in something like a Person instance or LogEntry instance rather than a string?
Simple and usefull example from you. Elegantly touching Generics. Good video! Wanna show my support and hope that others will follow my example! Brilliant work Tim!
time 13:15 the PopulateLists() takes up two argument, how can the stuff we added to that new argument people and logs in the function affect the actual variables people, logs in the Main(). is the function calling passing the value or adress of the value??
Tim, you say don't use reflection, but I don't see another option when I am using T to send different list of classes to component. I have a blazor component where I sending over a generic list of data to populate a table. The type is T so all I know is its a class(the class can be different). I pass the column names so I am using this to get each object col value . @foreach (var item in Items) //Items is a list of the class item is one row/class. @foreach (var cname in headerColumnNames)//list of columns name passed var displayValue = (item.GetType().GetProperty(cname.ColumnName).GetValue(item, null)); I am only reading values not setting anything. The application is working fine, but if there is a better option I would like to implement it. Thanks Rich
There is a case to use reflection. Just don't use reflection when there is almost any other option. In this case, I'm curious about the eventual use-case. However, it sounds like this might be a case for reflection. Just note that it will increase the response time on the client. Another option to consider might be to serialize your object to JSON to see if you get any performance benefits doing so (not sure you will because of how you would deserialize it but it is an idea to try).
The funny thing is, as for performance, its super fast. That is why I questioned using it. I don't see any speed issue. I am querying the DB and rendering the grid using reflection and its fast, (love Blazor server side). The only other option would be create a component for each grid and not make it a generic component. I would have to have 7 copies of the same component with the only difference being I am defining the model type in each component, instead of reusing it with T. It would increase the size of the project, but it would eliminate the reflection. Your thoughts? Thank you again for all your help! UPDATE: To test it, I made a copy of the component and removed all the reflection code. I replaced all the reflection code with ( var displayValue = item.mclient_notes) . That's as simple as it gets. I pulled 6400 rows from db to be rendered in a table using the component. Both versions reflection and no reflection gave me the same results in speed. My thought is because I am providing the getproperty "name" for the column and its not looking up the name, its not slowing down. I also read that dot.net core is caching the reflection when it has a repeated value so it doesn't have to look it up again. For now I just going to leave it in.
Nice work! Yeah, it sounds like the caching of the reflection is working since in the .NET Framework you would notice at least a little slowdown with that many records. I'm going to have to add that to my suggestion list for possible video topics. Thanks for testing it out and letting me know the results.
When we decided to make any feature to our application, I assuming it would be almost impossible to realize we would need generics to avoid DRY before we defined our feature?
We don't use generics to avoid DRY. We use them because we want to be DRY. As for knowing ahead of time, there are lots of times when you will know ahead of time that generics would be useful. However, you do need to understand what your feature is doing before you can start writing code for it.
What if you want to set the class to the generic method dynamically if you have a string of the name of the class... something like Type t = Type.getType("aClass"); SomeMethode(valueA,valueB); Haven't been able to get something like this to work.
You would need to use reflection, which is expensive. You can do it and there are reasons to do it but I would look first to see if you can do it a different way.
@@IAmTimCorey it's actually for a design element only used by me for saving items into a json string that players will never use... so figured it would be appectable.. any examples you can point me towards?
Hey i'm a little bit lost, at 11:37 you use a list of type Person, what does that mean and what does it do as usually in my program.cs file I only use List's of type int or string
Great video and explanation. I have trouble learning a lot of advanced C# like this though. Even if i understand it i need to use it in practice multiple times to actually make it stick in my head. And when its things like this that has very rare use cases its very hard. You get a long way with the very basics of C#, and that can become a problem.
Thanks Tim I really like the details you cover in every video. 1. Am I correct in saying that the T and U are like placeholder, which get replaced when the call to a generic method is made. 2. Does that mean all the classes from ./Models folder must have same number of properties (but their data type can be different).? 3. If there were methods in these classes should they have same signature?
1. Yes. T and U represent the object being passed in, whatever type that is. 2. No, those classes can be totally different - different number of properties, different methods, etc. Our LoadFromTextFile method gets all of the properties in the passed in object and does work based upon that. 3. No. A generic object can be anything you want. In our case, we specified that it must be a class that can be instantiated. That's all of the criteria we applied. That means it can be any class type with any number of methods/properties/events in it of any type.
very very awesome , you are so great, yesterday i was creating method to write and read xml files and i couldn't make them generic, know i now why and thanks to you many many thanks
Quick question: Is using $"{var1}, {var2}" kind of the same thing as using String.Format? For example could you have used lines.Add(String.Format("{0},{1},{2}",p.FirstName, p.IsAlive, p.LastName)); ? Not sure why you would use one and not the other. Or is the former simply a more compact version of the latter?
You are such a great teacher. Many blessings to you. Simplicity is born out of a deeper understanding. Your tutorials are brilliant, like a breath of fresh air.
Thank you for the kind words.
I agree. Every lesson is very consistent which helps in the learning process.
"Simplicity is born out of a deeper understanding" .........deep
And yes, Tim Corey is the best
Glad you're still with us. Sounds like a crazy experience, that tsunami... Hopefully one day I will learn French or find a translated copy of your book. Interesting to see you coding!
And his voice as well 😍
the beauty of this channel is it shows the practical usage of the theoretical concept.
Thanks!
In India today (5th September) we are celebrating Teachers day. And for me, you are one of the best teachers I came across.
Happy Teachers Day Tim!!
Thank you!
You're my fav C# instructor. Period! I don't know what moment or who sparked the idea in your head that you decided to share your knowledge with the world, I'm just grateful that you did :-)
You're hands down the best teacher I've ever seen. Nothing is left unexplained, everything is always very clear and simple to understand. Thank you so much for inspiring other programmers through your awesome videos!
I appreciate the kind words.
Some people are born to teach, you one of them. Big thanks
Thank you!
Tim, great course.
I like the way you explain "why" we would use Generics in real-world scenarios as opposed to just giving us "high-level" examples. Note that this teaching method sets you apart from other teachers.
Also, you showed us an example where originally we don't use generics and then where (and why) we would use Generics (code reuse and decoupling logic implementation from actual data types).
I am glad you found it helpful.
I haven't come across a better teacher for C# programming online. Thank you so much for what you are doing!
You're very welcome!
I agree
0:00 - Intro
1:33 - Creating a List of T
4:03 - Why not to use ArrayList and why generics are useful
11:10 - Demo app walk through pt1
22:56 - The problem: repetition
28:55 - Solving the repetition with generics; Demo application walk through pt2
47:50 - When to use generics
50:41 - Passing in more than one type generic
Thanks! I added it to the description.
what I iike about your tutorials like this one, is you don't over complicate things and I believe you always consider the level of skill of your watchers, explaining how and why things are done in a certain way. thanks Tim.
Glad you like them!
The professor who doesn't assume understanding of some specific part of the explanation makes my understanding much better. Thank you a lot Tim Corey, for providing such a good content and yet free. Thanks from Brazil.
You're very welcome! ... from Texas USA
Good one. Restriction and mentioning empty constructor was new to me. Thank you
Thank you!
Nice video as always Tim. Just a note on 35:20 for anyone interested in reflection:
You can still grab the properties of a class, using reflection, without creating an instance of that class. This will compile and perform the same task: *var cols = typeof(T).GetProperties();*
The instance was still needed in Tim's example though, since he's returning instances of that class in the Load method.
Yep, thanks for pointing that out.
That is an excellent and simple explanation. I had some confusion about Generic methods, which are cleared now.
Thank you.
Glad it was helpful!
Best C# generics tutorial I have come across. Thanks, Tim. Really appreciate it.
You are most welcome. Thanks for watching.
I had no problems whatsoever understanding why it was done this way and how generics work, and I forsee it saving me a lot of work in the future. Thanks a lot Tim....
Very good teaching, the best part is that first you explain what most of us do and show the best thing. Learnt a lot
Glad to hear that
Best Video in Advance Topics Playlist up till now. I loved the generic methods because I faced this problem in my previous organization.
Glad it was helpful!
Tim, again, an older but very timeless video. Thanks for the clear explanation on generics!
You are welcome.
Fantastic video Tim. What shortcut did you use at 23:46 to rename p to log in just that method? I tried web searching for it and cant find that same menu option you have with "Rename 'p' to 'log'".
I renamed it manually and then used the Ctrl+. (Quick Actions and Refactoring) to do the rename everywhere.
@@IAmTimCorey Thank you Tim. You're an awesome teacher.
Adicted to IAmTimCorey channel. Learning makes easy when we find the right person who can answer our questions without asking them. You are a Great teacher and your efforts are really amazing. Thank you so much Sir. Love from India
Thanks for trusting Tim with your time.
I have been using generics for a quite long time, but never managed to understand how to make one. you explained it very well.
Many thanks Tim Corey
Awesome! I'm glad I could add to your knowledge.
Very clever example and code Tim. Just the right amount of complexity. Liked the reflection thrown in too. Thank you.
You are welcome.
Everyone on here has benefitted from Tim in one way or another. Please subscribe to this man's Patreon, even if it's just the $1, that's nothing compared to the value he provides us for FREE! Support this guy!!!
I appreciate the kind words and the support.
Or sign up his courses to support him..
I have no idea how anyone could possibly give this video a thumbs down. Thanks Tim! You are awesome. I'll be heading over to Patreon real soon. Appreciate all you do to make our lives easier and wealthier!
I appreciate the kind words.
Agree. One of the best teachers that I've found so far. Really clear, in-depth, not going on too fast (like some others just rushing on), so it's easy to follow and grasp. Brilliant! Thanx a lot. :)
You are most welcome. Thanks for watching.
thanks a lot for this excellent and wonderful tutorial about generics.
I made some changes on reflection parts and I would share with you guys:
public static List LoadFromTextFile(string filePath) where T : class, new()
{
var lines = System.IO.File.ReadAllLines(filePath).ToList();
List outputList = new List();
var properties = typeof(T).GetProperties();
if (lines.Count < 2)
throw new IndexOutOfRangeException("The file was either empty or missing.");
// Splits the header into one column header per entry
var headerColumns = lines[0].Split(',');
lines.RemoveAt(0);
foreach (var row in lines)
{
T entry = new T();
var rowValues = row.Split(',');
foreach (var column in headerColumns.Select((columnName, columnIndex) => new { columnName, columnIndex }))
{
var propertyRef = properties.SingleOrDefault(property => property.Name == column.columnName);
if (propertyRef != null)
{
object typedValue = Convert.ChangeType(rowValues[column.columnIndex], propertyRef.PropertyType);
propertyRef.SetValue(entry, typedValue);
}
}
outputList.Add(entry);
}
return outputList;
}
public static void SaveToTextFile(List lstData, string filePath) where T : class
{
List lines = new List();
if (!(lstData?.Count > 0))
throw new ArgumentNullException("data", "You must populate the data parameter with at least one value.");
var properties = typeof(T).GetProperties();
lines.Add(string.Join(",", properties.Select(c => c.Name)));
foreach (var row in lstData)
{
var rowValues = properties.Select(c => c.GetValue(row)).ToList();
lines.Add(string.Join(",", rowValues));
}
System.IO.File.WriteAllLines(filePath, lines);
}
Thanks for sharing.
Thanks Tim for giving so much to the community.
You are welcome.
This was a very helpful tutorial. Thank you!
You are welcome.
Man been watching and liking all your vids. They are solid. As a person finishing up a year's worth of c# classes, I still find your way of teaching really easy to understand, and the tips and way in which you deliver information is extremely helpful. Many thanks buddy!
You are most welcome. Thanks for watching.
Very helpful video. Generics explain in a practical way. Good teaching methodology. Not overcomplicated way of sharing your knowledge. Keep it simple Tim!
I am glad it was helpful.
This is great. You concisely explained a concept that i originally perceived to be intimidating and confusing. Bravo
I am glad it was helpful.
Köszönjük!
Thank you!
Thank you Tim! This video improved my understanding of the use of generics.
Excellent!
Merci bien for your hard efforts to enlighten us Tim! You are an inspiration to start making a good code.
You are welcome.
Great video helped a bunch. Wish my teacher would take the time to explain like this instead of using PowerPoint presentations from 10 years ago, while talking for 2 hours yet explaining nothing. xD
Thanks for the feedback. Tim believes in giving context for what he is teaching and that takes time. His goal is not entertainment or just to dump code on you but true education. Very happy you appreciate that!
This is excellent and simple tutorial on C# generics. Thank you for your efforts and sharing your precious knowledge.
I am glad you enjoyed it.
wish you could go around the world to teach the teachers how to teach... wow, I feel super happy to have came across your channel. "ke a leboga, thata"(Thank you very much(all the way from RSA))
You are welcome.
I learned generics before. But today I learned why and when I should use it. Thank you !
You are welcome.
Nice explanation of restriction part (where T : class etc). Am now clear understand . Thanks buddy.
Excellent!
Great work Tim! Your syllable timing is perfect and I can run your video at 1.25 or 1.5 times and it still seems normal to my fast Brain.
Great to hear!
36:00 For Example If I don't have to write T entry =new T(); in other any methods then I don't need to specify new() key word in method signature right.
We are using T because we don't know the specific type. Pretend for a minute that T was PersonModel. See how that would look? Now remember that we are creating a generic method where we don't know what the type being passed in will be. We name that type T.
IAmTimCorey I’m asking about new() keyword where save method does not have
Thank you for your videos, there are amazing. You help me so much to learn, and your sound and spelling is so clear to make it easy to understand for people that english isnt their native language.
I am glad my content has been so helpful.
You are the greatest instructor I have ever seen. You are just awesome.
I appreciate the kind words.
Well, thank you Tim for the great content you provide for free to us, the C# developers community. I have an old habit I took when learning C language, a long time ago when I was a student. I always put my checking code at the beginning of my methods, before any declaration or usage of variables and objects. So that I get rid of incorrect or incomplete values before going further, for instance by raising an exception or returning an error code. I don't know if it's a good practice, but I'm sure data is correct after that checking step.
Interesting, thanks for sharing that approach.
Very helpful, using reflection in the code is interesting.
Glad it was helpful!
This opened my mind to a lot of things that Ive seen on your other videos but which I did not fully appreciate - until now
Excellent!
makes it easier to understand generics than most books or bloggs offer.
That is high praise. Thank you.
Finaly an example where this is actualy useful. Now I understand the whole thing much better. Thanks a lot!
You are welcome.
Hi Tim, I don't know if this is important, but in my csv-file every line is put into one Excel-cel instead of 3 as it is in your csv-files. Perhaps this is an ignorant question but do you know why this happens?
CSV stands for 'Comma-Separated Values', so do you have a comma between the items you want in separate cells? Just a place to start your investigation.
I've been working with .NET, and primarily C#, since before it was even publicly available and I still learn great things from your videos. Thank you!
You are most welcome. Thanks for watching.
It's really helpful. Sir, only with your video did I learn why, I have to use generic. Thanks a lot.
Great!
Yes, Generic is useful, it can reduce duplicate code. Thank you very much. Very precise explanation.
You are welcome!
I was busy watching your other Videos, but today was the Time, yay.
I've been using a separate class like processor for every model like you said :) where i was doing queries with Dapper and Today was the day when I put them all in one place. I was allways feeling that I'm repeating my self, and I really was!
Thank you very much Tim
I'm glad you were able to figure that out and improve. Well done.
But still a Tutorial with Generics and Dapper will be great :)
thanks tim corey for the sharing, hopelly continue share for next videos
We appreciate you making Tim a part of your development journey
You are so good sir, you explain it clearly. Even the topic is pretty advance for me, I can imagine things by your words. Thanks for making this video:)
You are welcome.
Excellent video, Generics have always been a bit confusing to me and it helps me best when there is a practical demo like in this video. So thanks for that
You are welcome.
I have always struggled to understand generics and how to use collections and this video just broke it down for me in the simplest way. You are awesome at how you approach topics and i jsut subscribed to you channel so i can learn more
Glad it was helpful! Thanks for the sub!
Great tutorial, thanks very much for your efforts on these - especially when it's 12:48 AM.. wow dedicated!
Thanks! That's actually a pretty common time for me to be recording. I only get a few hours a day where I can record right now (from about 10pm to 2am). I am actually working on some soundproofing and other things so that I can record earlier in the day without degrading the sound quality. Once I get that in place, I can record starting at about 9pm. Once I quit my day job (that is based upon the amount of income I bring in from videos), I can record all day long. That will GREATLY increase the amount of content I can put out. That is also when I'll start being able to put out a video per week in other languages that complement C# like SQL, HTML, CSS, JavaScript, etc. My first priority will be C# but once I have more time, I can support developers more fully in the other areas as well.
Tim ,If that's the route you wanna go, I honestly think you need to put out a lot of your content on Udemy and other sites and make them paid courses. Your explanation is just fantastic and you deserve to get paid for it!
Well, I will be doing more paid courses in the near future (and long-term). I have a few at IAmTimCorey.com but I'll be adding a few more soon. I've looked at Udemy but they really take a lot from teachers (50% plus they set pricing so your $40 course might be sold for $10 without your say). I really don't want to go down that road. I'll stick with my own platform where I can charge a reasonable amount and get about 95% of the asking price.
I appreciate the kind words.
IAmTimCorey ah true! See I don't know what their cut is, but yes that's a lot. But you're a real good teacher and would do great doing this full time! Will take some time to get there for sure. Good luck ! :)
Thanks!
You are welcome.
Wonderful content Tim. Kudos to you!
Thank you!
Best free C# tutorial videos online !
Thank you Sir !
Keep up the good work !
Thank you for the kind words.
I have to say this is the best generic courses.
Thank you!
@@IAmTimCorey Just let you know I purchased your course today haha
Thank you Tim! I work at company where we use C# and MVVM pattern, I learned some new things from you. :)
Excellent!
Hey Tim! I am a very big fan of your videos! Thank you for helping me learn C#!
I was wondering if you plan to make a follow-up on generics and speak about how we can use generics and dependency inversion together as principles to make dynamic interfaces that we can reuse?
I think it is a very interesting and challenging topic that most people would appreciate.
Added to the list, thanks.
Really nice. You make C# much easier to understand.
That's the goal. I'm glad it is working.
IAmTimCorey yes, it's working. It will be great if you make a mvvm series. I don't know why I can learn mvvm.
I do have an add-on course to my C# Application from Start to Finish course where I replace the WinForm UI with WPF (using Caliburn Micro and MVVM) if you want to check that out: iamtimcorey.com/courses/tournament-tracker-wpf-user-interface/
I don't know why I didn't see this course before! Thank you Tim!
@ 50:14, line 11, couldn't you instead have "public static List LoadFromTextFile(string filePath, Type T) where T : class, new()"? if what I wrote is valid, what is the difference, if any, compared to your line 11?
You still need to declare the in the name. You wouldn't need to pass in the type when calling the method explicitly because the added parameter specified the type but then you are creating an extra parameter (extra overhead) for no extra benefit.
Notes that i took:
Generics are helpful to for example not create mutliple methods doing the same thing.
Imagine having an array of type int, an array of type double and array of type string.
If you'd want to print out the contents of these arrays, you would normally have to create three methods with three different parameters to display them. One with an int parameter etc.
Instead, you can create a Generic Method.
A Generic Method is created by putting " " at the end of the Method name. Then the parameter.
Instead of putting a data type as a parameter, you can instead put "T" as a parameter and then call it three times with the different arrays.
So instead of having 3 different Methods to call these three different arrays with different data types, you can create one generic method which accepts all data types.
You can call your generic whatever you want, it doesnt have to be "T".
------------------------------------------------------
The T in generics specifies which type we are talking about.
I'm glad you were following along.
Thank you so much sir! That was a very clean explanation and a brilliant example! Now I understood.
She glad I found this channel!! Thank you Tim!
We are pleased you did also.
Very helpful, thank you.
You are welcome.
Great material, bravo Tim!
Thank you!
It was very helpful for me. Thank you Tim.
Glad it was helpful!
am impressed, i wanna do more generics with different class properties.
Great!
Tim, 12,114 views and 418 likes and "0" dislikes as on date, That speaks quality of this video. :)
Thank you.
In the load LoadTextFromFile function The that you pass in is a string, but then you say "Where T : class, new()". Wouldn't that "Where" statement require you to pass in something like a Person instance or LogEntry instance rather than a string?
Best tutorials on C#! Keep going!
Awesome! Will do.
Tak!
Simple and usefull example from you. Elegantly touching Generics. Good video! Wanna show my support and hope that others will follow my example! Brilliant work Tim!
Thank you!
Great video, and correct pace
Thanks!
time 13:15
the PopulateLists() takes up two argument, how can the stuff we added to that new argument people and logs in the function affect the actual variables people, logs in the Main(). is the function calling passing the value or adress of the value??
Great explanation, greetings from Argentina
Thank you!
Danke!
Thank you!
Tim, you say don't use reflection, but I don't see another option when I am using T to send different list of classes to component. I have a blazor component where I sending over a generic list of data to populate a table. The type is T so all I know is its a class(the class can be different). I pass the column names so I am using this to get each object col value .
@foreach (var item in Items) //Items is a list of the class item is one row/class.
@foreach (var cname in headerColumnNames)//list of columns name passed
var displayValue = (item.GetType().GetProperty(cname.ColumnName).GetValue(item, null));
I am only reading values not setting anything.
The application is working fine, but if there is a better option I would like to implement it.
Thanks
Rich
There is a case to use reflection. Just don't use reflection when there is almost any other option. In this case, I'm curious about the eventual use-case. However, it sounds like this might be a case for reflection. Just note that it will increase the response time on the client. Another option to consider might be to serialize your object to JSON to see if you get any performance benefits doing so (not sure you will because of how you would deserialize it but it is an idea to try).
The funny thing is, as for performance, its super fast. That is why I questioned using it. I don't see any speed issue. I am querying the DB and rendering the grid using reflection and its fast, (love Blazor server side). The only other option would be create a component for each grid and not make it a generic component. I would have to have 7 copies of the same component with the only difference being I am defining the model type in each component, instead of reusing it with T. It would increase the size of the project, but it would eliminate the reflection. Your thoughts? Thank you again for all your help!
UPDATE: To test it, I made a copy of the component and removed all the reflection code. I replaced all the reflection code with ( var displayValue = item.mclient_notes) . That's as simple as it gets. I pulled 6400 rows from db to be rendered in a table using the component. Both versions reflection and no reflection gave me the same results in speed. My thought is because I am providing the getproperty "name" for the column and its not looking up the name, its not slowing down. I also read that dot.net core is caching the reflection when it has a repeated value so it doesn't have to look it up again. For now I just going to leave it in.
Nice work! Yeah, it sounds like the caching of the reflection is working since in the .NET Framework you would notice at least a little slowdown with that many records. I'm going to have to add that to my suggestion list for possible video topics. Thanks for testing it out and letting me know the results.
When we decided to make any feature to our application, I assuming it would be almost impossible to realize we would need generics to avoid DRY before we defined our feature?
We don't use generics to avoid DRY. We use them because we want to be DRY. As for knowing ahead of time, there are lots of times when you will know ahead of time that generics would be useful. However, you do need to understand what your feature is doing before you can start writing code for it.
What if you want to set the class to the generic method dynamically if you have a string of the name of the class... something like
Type t = Type.getType("aClass");
SomeMethode(valueA,valueB);
Haven't been able to get something like this to work.
You would need to use reflection, which is expensive. You can do it and there are reasons to do it but I would look first to see if you can do it a different way.
@@IAmTimCorey it's actually for a design element only used by me for saving items into a json string that players will never use... so figured it would be appectable.. any examples you can point me towards?
Hey i'm a little bit lost, at 11:37 you use a list of type Person, what does that mean and what does it do as usually in my program.cs file I only use List's of type int or string
I created the Person class, so now I can use Person as a type.
@@IAmTimCorey thanks :)
Great video and explanation. I have trouble learning a lot of advanced C# like this though. Even if i understand it i need to use it in practice multiple times to actually make it stick in my head. And when its things like this that has very rare use cases its very hard. You get a long way with the very basics of C#, and that can become a problem.
Practice is definitely important. The more you practice it, the more you will grasp it.
Appealing tutorial.
Thanks!
Heh, I needed 6 minutes of Your video to understand what I need.
Truly great content.
Thanks!
Your videos are insanely good. Love it.
Thank you!
Good job! I appreciate you posting your videos.
Thanks!
Thanks Tim I really like the details you cover in every video.
1. Am I correct in saying that the T and U are like placeholder, which get replaced when the call to a generic method is made.
2. Does that mean all the classes from ./Models folder must have same number of properties (but their data type can be different).?
3. If there were methods in these classes should they have same signature?
1. Yes. T and U represent the object being passed in, whatever type that is.
2. No, those classes can be totally different - different number of properties, different methods, etc. Our LoadFromTextFile method gets all of the properties in the passed in object and does work based upon that.
3. No. A generic object can be anything you want. In our case, we specified that it must be a class that can be instantiated. That's all of the criteria we applied. That means it can be any class type with any number of methods/properties/events in it of any type.
@@IAmTimCorey Thanks for the clarification!
Another great video clearly explaining an area that is often misunderstood!
Thank you!
Great job!
Thanks!
As always - clear, concise, great. Thank you Tim!
You are welcome.
very very awesome , you are so great, yesterday i was creating method to write and read xml files and i couldn't make them generic, know i now why and thanks to you
many many thanks
Great!
Quick question: Is using $"{var1}, {var2}" kind of the same thing as using String.Format?
For example could you have used lines.Add(String.Format("{0},{1},{2}",p.FirstName, p.IsAlive, p.LastName)); ?
Not sure why you would use one and not the other. Or is the former simply a more compact version of the latter?
It is a more compact, easier-to-read version. That's really the only difference in terms of performance.
Bow to the king.
I'm glad you enjoyed it.
nice teacher....can i do like a method wich takes a list or single object as and print whatever inside that list or object?
That you very much. Has really improved my understanding regarding this topic. You are an excellet teacher
Awesome! I'm glad you were able to increase your understanding of the topic.
What is the shortcut key for this @23:46?