 StackOverflow.com is a Q&A site for engineers where anyone can go ask a question and anyone can go answer a question. StackOverflow functions from a pool of applications and from the beginning, we've depended on .NET to drive all of our applications. And when we heard about the advancements in .NET Core, we were really excited at the idea. We've been working on porting our entire application over to .NET Core. One major place that we've seen improvement is performance. .NET Core 3.0 has allowed us to build a much faster application and get information to our users faster than before. With .NET Core 3.0, we can build the app and run it on our Windows developers' machines, our designers with Macs and an enterprise in the cloud on Linux and build it one way. And that's tremendous. Right now we live on our own servers in different areas throughout the country. And something we've always wanted to do is be able to use the cloud and .NET Core allows us to do that. Azure is the best cloud platform for hosting .NET. Cloud deploys are also much simpler because there's just far fewer moving pieces for us to manage and deploy when we do upgrades. Right now StackOverflow's application exists as a large application. And through .NET Core 3.0, we can add more modularity to different sections of the application. So that allows us to host the different modules in different areas, which allows us to experiment with things like Kubernetes and Docker. .NET Core 3.0 lets us run any container. This lets us ship an appliance to enterprise customers, dramatically lowering our support costs and making it easier to onboard customers. We can take a few of our auxiliary applications and just make them middleware, which means fewer apps to deploy and fewer apps to manage. It's the testability that really draws us to .NET Core. We can test a method end-to-end server client and do things we could never do before in the old system. .NET Core being open source and on GitHub is very empowering to the community. We can find and fix issues and make suggestions for the benefit of everybody. It's amazing to be a part of the .NET Foundation. What the .NET Foundation is here to do is support .NET developers throughout the world. With .NET Core, I'm just not fighting all of the meta of building software. We can actually just go build the software. Hi, I'm Scott Hunter and I'm here today with my team to announce .NET Core 3. To start off, let's talk about what .NET is. .NET is this platform we built for building any kind of application you have, whether it's a desktop application, a web application, cloud, mobile, gaming, IoT, AI. .NET is a general purpose framework for building all of these types of applications. I'm super excited to talk about .NET Core and how far it's progressed. It's only been out for a few years and we've already grown to over a million active .NET Core developers. .NET Core is our first fully open source .NET framework. In the short time, we've actually been open source. We've already taken 100,000 PRs. We're building this not just by ourselves but with the community. Of course, Visual Studio 2019 is the fastest adopted version of Visual Studio ever. Here's a couple of our customers to build on top of .NET. We have an awesome page on the .NET website you can go to to see all of these customers and read the stories behind them. I highly recommend you go and check that out after the conference. Let's talk about .NET Core 3. You can actually download this right now. You can go to the .NET website and get it right now. The bits are available. There's a bunch of awesome enhancements to .NET Core. First off, we brought desktop support for WPF and Windows Forms. Any .NET Core application gets the ability to be fully side-by-side and self-contained, meaning .NET doesn't have to be on the machine. We're going to introduce a brand new way of building web applications where every web application is a spy application. Of course, we're always making you more productive with Visual Studio, C-Sharp. We're going to talk about a lot of these things today with my team. To start off as well, Visual Studio 2019 16.3 just shipped as well, along with Visual Studio 2019 for Mac 8.3. Both of these versions of Visual Studio support .NET Core 3, C-Sharp 8. They have a ton of productivity improvements, performance improvements. And if you're a mobile developer, they support iOS 13 and Android 10. So they support all the latest stuff. A bunch of our partners have released brand new tools today for .NET Core 3. If you're a web developer and you're going to use Blazor, our new spy application, there's controls by DevExpress, Telerik and more that are available today. So please try these things out as well. So the first thing I want to talk about is microservices. Microservices is a new developer phenomenon that's taken over in the last couple of years. When I first started doing development, we built these what we call monolithic applications where you build your database and your front end and your back end all together in a combined application. That was great when we had small teams building applications, but as these applications have gotten bigger and crossed into more spaces, it's more important to break them out into smaller pieces so those individual teams can actually work on those pieces. So not only can you build microservices, but you can also host microservices really, really well in Kubernetes. What Kubernetes does for you is it's an orchestrator and that orchestrator will basically take your application and manage all the components, whether it's configuration, whether it's scaling, whether it's making sure the application is still running well. And we have an awesome one of these called Azure Kubernetes that runs in our Azure Cloud. Now with .NET Core 3, it's the first version of .NET Core that really, really, really enables you to build microservices. So what we've done is we've added a bunch of new features. One is we have something called GRPC. What GRPC is, it's a form of communication that gives you strongly typed contracts between the application. But what makes it unique is it actually works across all developer technologies. We're going to show it in the context of .NET and C Sharp today. But what's cool is you can actually build a microservice using GRPC and you can call it from Java, you can call it from Node, you can call it from Python. Any of the languages you want will support this. The next thing is worker services. While we built great web frameworks the last couple of years, as you start thinking about microservices, you want these long running applications that handle responses, request and responses. And so we now have a first class template inside of Visual Studio in .NET Core 3 that lets you build these worker services. What's cool about this is you get all the same features. You get the configuration, the dependency injection, all the logging, all those things that .NET Core brings are available there as well. We're going to show that a little bit later on. And then finally, as you build these APIs, you want to make sure they're super secure. And so what we've done is we've actually worked with one of our partners to make sure that you can actually securely secure your endpoints using identity server. And so with that, what I'm going to do next is we're going to have Glenn Condron come on stage and we're going to build a .NET Core 3 microservice and host it up in Azure. Hello. Hey, Glenn. Hi, how's it going? It's going great. Why don't you switch to your machine and let's show us a microservice? Yeah, so a bit of context for what we're going to do here is I am going to build this weather microservice, this service. And then all of my friends after this, they're all going to come in and they're going to consume this thing from an AKS cluster. So I am going to encapsulate the logic of going and grabbing the weather data. I'm going to cache it locally, make sure I honor expires headers. It's not complicated, but it's not trivial. We're going to make our own service for it instead of having everybody talk to the weather API themselves. So what I have here is I have a just a normal file new GRPC service. I have a console app and I have a not standard class library we're going to use later, but they're all standard except that in my weather app, I have already set up some config for the URI and I've put in some user secrets and stuff so that you all don't try and steal all of my tokens. So first thing we need is a worker. So I am going to add this class. We're going to call it weather worker. And this thing's responsibility is going to be to go and grab the weather data and get it in the cache locally. And like this. So I have some snippets for pretty much all of my code. And so this inherits from background service, which we had a little while ago. This is how you can add a service that will run forever. I've got to do some logging, some config. I need config to get my URI and then in Kubernetes, it actually uses the Kubernetes config provided to grab all the secrets from Kubernetes secrets, which is kind of cool. I have a hard-coded location ID because, you know, you don't need any other weather than that what's in Redmond. And then the meaning of this is this execute async method. And all it's going to do is loop for as long as the app is going, make a HTTP client, going to go and call the weather API, get some JSON response, use the new system text JSON that we added to deserialize that to a type and then cache it. And then it's going to do that every 10 minutes forever for as long as the app's running. And so I'm missing this forecast data. This is how does the weather endpoint I'm hitting represent the weather? And so I'm going to add another class to represent that. Call it weathermodel.cs, you know, if I can not put some extra caps in. So what I did to generate this, I have a snippet here for this now. What I did to generate this and what you can do is, I just grabbed an example JSON payload from the API and I just copied and pasted it as C sharp into Visual Studio and just made this whole thing for me. And I'm just going to ignore it. That's a cool feature. Visual Studio can basically take your JSON and convert it to C sharp types. Yeah, absolutely. It's a super cool feature. Then, okay, so now I have a worker. This is done. I'm good now. But except I need to tell the app that it's going to run that worker service. So now over here, I'm going to start doing some code. I'm going to add dot ad hosted service, which is the name of this feature, ad weather worker, right? And then this needed a few things. It needed like HTTP and like caching, right? So services dot ad HTTP client. So I can inject the HTTP client. And then I'm going to add the memory cache, memory cache so that it has a memory cache. This now when I boot this app, it's going to go into every 10 minutes to go and get some more weather data. Pretty simple, pretty cool. Now I need an endpoint. So Scott talked earlier about GRPC and some strongly typeness. So this GRPC is a very contract driven approach to RPC. So I have a snippet here, which gives me this proto file, which is the contracts for a GRPC service. And so I have this proto file that says I'm going to make a weather service. It's going to have a get weather streaming endpoint, which should stream weather constantly. And it has a get weather that just returns you a single whatever the current weather is. And it also defines what the actual response type is. Nice thing about making our own like proxy for this weather data is we get to choose the actual surface for our clients and make it relevant and not have too much extraneous data, right? So if we just call this weather dot proto and then in here, the way this actually works is in my CS prodge, I have this proto buff element, which references that weather proto. My name worked, good job team. And it says it's going to generate server because the way that GRPC works is you create a contract and then you generate a lot of code and you just implement the bits that matter and you leave all the rest to be generated. Right. I write that contract and I generate either a client or a server using the tools. Yeah, exactly. And so then we're going to go create a weather service now from my snippet. And so what we have here is a service that implements this weather base. That generated code that we just talked about. So we just control dot my weather glory here. I have the base class. I have a memory cache because I need to get the data out of the memory cache. And then GRPC doesn't want you to have empty method calls, but because I'm hard coding the weather for Redmond in this case, I've just got this empty type to fill in for the request type. You would probably in most cases have an actual type here that has your data, right? Yeah, past your location or something. Yeah, something, yeah. And then I just have this get current weather response. All it does is left hand, right hand code to say take that pasted code, the pasted model earlier, convert it to the one that we want to actually give to all of our friends later. And then get weather returns one. And then forget where the stream, it just loops for as long as the person is connected. It just grabs the data out of whatever's in the cache currently and then loops, right? And then this is every 10 seconds just so that it's easy so you can see something for the sake of the demo. We might actually even make this two seconds just so you can see some data constantly changing. We know the data will only actually change every 10 minutes or so, but you want to kind of keep a constant stream happening, right? And then that's it, that's greater service. So if we'll rename this to weather service so that, you know, just because we can't have a class with a different file name, it'd be terrible. And then in our start-up CS, the way you register these services is we have a map gipc service endpoint, right? So now I can change this to weather service. And that's it. At this point, my app can run and it'll go do its job. And so now you want a client to go grab some of this weather data to test it out. So I added this console app earlier, conveniently. But I also added this weather client lib. So I could go over here to my client console and then add a ref to the proto file and have it generate the client code straight into my console app or any of the, like, .NET stuff that we're going to show today. But what I could also do is I can come over here. I have a completely empty nest standard class library except for, like, the default class, which I'm going to delete, right? And then I can right click on this and say add service reference. And then click add new gipc service reference, browse to the proto file that I had earlier that are the same proto file that my weather app is using to generate the server code. And then I can say generate client, though, here in this dropdown, right? Instead of, there's some other options for what you can generate. I'm generating a client in this case. And then just going, okay. This is going to go install all the new getty goodness that you need to make gipc generate code and generate all the types that you need. So this is pretty cool. So you built a service. We built our first microservice. We installed gipc into that. And now you want to write a client. So all you had to do is basically reference that same proto file from your service and your client and we'll generate all the code for you. Absolutely, yeah. And you just, then you generate you kind of the base, yeah, generate you all the codes for the client's class. Yeah, absolutely. Then all you do is new it up and start making calls. Yeah, and so let's look at what that looks like. So I'm just going to add a normal project reference now to my client class library because everybody can now share this net standard class library that has the client code generated in it. Or they can choose to reference it directly. And then in my program CS I have another snippet here where the client, right? And I think it's actually the whole class at this time. And then what I'm, so yeah, you can see here, like as you just said, this weather client was all generated for me. I just knew it up. I'd use this channel type to give it the address. And then I have a strongly typed method for get weather async, which is my contract file. You just start calling the methods and give the results back and write them out to the console. Absolutely. So now I can like control F5 this weather service. It'll spin up on my local machine. You'll see that we'll see the console output in a sec. It's going to see the output, go fetch the data and then sit there and be a GRPC endpoint. And then, so here you can see it going and getting the data and then being ready. And then over here, I can then like go debug, start a new instance of my client console. And my client console will ping up. It's going to grab a single weather and then just say done in this case, because I'm just grabbing a call in a single weather endpoint. Asynchronously, I'm using Async, like a console app that we added a little while ago. And then it's like, apparently 53 seems reasonable. So that's pretty awesome. So in just a few minutes, we built a brand new project using the worker service. Yeah. Long running process, like you would build a microservice. Yeah. It goes out and fetches weather from an endpoint somewhere. And then we actually add a GRPC to that service. So a client can call into that and get that weather data back. Yep, absolutely. Well, let's switch back to the slides for a second. And we'll talk about C-Sharp. So along with that, Necore 3, we're also shipping the next version of C-Sharp, C-Sharp 8. It has a bunch of new stuff and we kind of broke it down into buckets. One of the things we think about is we always want to make your code safer to write. We want to make it easier for you to catch the errors early or prevent the errors from ever occurring. And so there's some new features called Nullable and C-Sharp 8 that try to address some of that stuff. Modern as well, as we look at language, we always are looking at other languages and we're looking at the patterns that developers are using today. And so one of the cool features we have in C-Sharp 8 is async streams. And we're going to show those in a little bit. And then productive. We always want to make you more productive. The goal of C-Sharp is to add the right features and stuff to make it easier for you to write code and write code faster with less text in the screen. At the same time, also tooling all that with Visual Studio family so you can actually be more productive. So what I'm going to do next is I'm going to bring Mads on and we're going to take the demo that Glenn had and Glenn didn't really write it the best way you could. We're going to make it use async streams. Well, I think Glenn did a fantastic job. It's just that when he Switch back to the laptop. Let's switch back to the laptop and look at the the prototype that Glenn put up there. There were actually two endpoints here. There was the get weather that he used that he called just before from the client and there's a get weather stream which continues to stream weather down. So that's the one we're going to investigate now and find my way back to the program here. So there's, if you look at the client here it also has a get weather stream method. So that's probably the one we're going for and that can't be awaited. Instead we get something that we're going to explore a little bit. So let's just call it response for now and let's start drilling into it. So if we say response dot we see that it has a response stream. That sounds streaming. Let's do that. And that one has a read all async. That sounds streaming and async. That sounds pretty good, right? Let's do that one. So if I call that, then what do I get back? We can actually drill into that as well. Let's try to adjust F12 our way through. There's read all async. It returns something called iasing enumerable of T. And iasing enumerable, if people remember ienumerable is a core type and ienumerable of T is a core type in .NET that you can reach and produce new ones from the language as well with your return with iterators. And so iasing enumerable is just an async version of that. And we can actually, if we take a very quick look down the rabbit hole here, iasing enumerable, just like enumerable has a get enumerator, this has a get async enumerator. And if we drill into that, you can see that it has a current property for the value that we're currently looking at and it has a move next method, but this one is async, right? So if you think about it, this is a stream where you can pull elements, anytime you pull a new one, you do it asynchronously, so it might take time and you might, you have to wait it. Okay. So that's how that works under the hood. Now, at the language level, we would like to support for reaching over these. So let's try to reach over there. The thing that we got back from our drilling here, so let's call that four casts with an S because we hope there are multiple. And then we can, let's try to reach over it. Reach over it for each var forecast in forecasts. And now what we get is, oh, this thing can't actually be for each. And that's because in C-sharp, we decided you shouldn't just be able to reach over async things because then you can't look at your code and see. And know the racing. And know that you're doing something async, right? We want every weight to be visible in the source code so you can know that you're sort of getting off the thread, you're doing an async thing, it's a point where a context might switch and so on. So what we have instead is an await for each syntax that then you use when you have an I async enumable and let's just put the right curlies in there for the beauty contest and we're good. So now we've actually called the streaming endpoint and now we sat in an async loop around that endpoint. Yes. The code, honestly to me, MADS, you just took a four each and added a weight in front of it. Yeah. It works. I tried to make a big deal of it but it's actually pretty simple. Pretty amazing. I mean, it's a complicated feature but it looks so simple when you actually use it. Right. And some, you know, there's more to it. You can actually yield return in an async method as well now, returning I async enumable. So we have, you know, async yield return, that's pretty useful, right? Amazing. And also there's cancellation built in that I kind of skipped over here. So that's a little more to it. The idea is it should be simple. Later today you're going to have more talks on C-sharp bait. We're going to drill into more and more features than just the async stream that we showed you. That's exactly right. Yeah. So just after the, a little after the keynote, there'll be two talks. Perfect. Thank you. Let's go back to the slides and we're going to talk about desktop. So today we have still millions of developers building desktop applications. You might ask why. Well, because desktop applications are simple to write. Web applications are hard. They require knowing HTML, CSS, JavaScript, and a bunch of stuff. Desktop applications in .NET, you can just drag some controls to a form, write some code. They're very quick and simple. We've made them much, much better in .NET Core 3. So in .NET Core 3, we've brought WinForms and WPF to .NET Core. But you get all the benefits of .NET Core. So one of those benefits is side-by-side deployments. You no longer have to worry about an update of the framework breaking your application. You can even take the app or the framework and compile it directly into a single X before your application. So you just hand that application to any machine. It doesn't even have to have .NET Core on it. That's a cool feature in .NET Core 3. We've made all of the Windows 10 APIs available to these applications as well. So you can call all the things. If you want to get Bluetooth or something like that, you can do that from a WinForm or WPF application. And then finally, because it's .NET Core, we do all of it open-source. And so we've open-sourced WinForms and WPF. Now, what I'm going to do next is talk about AppCenter. This is a new announcement today. I started off as a web developer. And AppCenter for desktop applications really excites me. Because for the first time ever, if you're a web developer, you can just add some kind of analytics to your website and you're going to know how many people called it, where they're from, how long they were on the site. Wouldn't you want that same information for your desktop applications? If you're building a desktop application, you likely want to know how many times it's been used. Are all the features being used? And so by adding AppCenter to your application, you get all those benefits. AppCenter can also be used to deploy the application, including beta versions of the applications to a smaller set of people. So super excited to announce that. What I'm going to do next is I'm going to bring Ali on stage and we're going to go build a .NET Core 3 desktop application and then we're going to actually hook it up with AppCenter so we can get telemetry on it as well. So let's switch to the machine here. And a theme we're going to have today is as we start building applications, we built that microservice. Now what you're going to see us do is basically build more applications on top of that thing, showing you can build .NET everywhere and share your code. Right. So I happen to have a weather application myself and that's application. It's a WinFarms app that sits on your desktop and shows you what is the weather right now. Let me show it to you. It's very simple, but it has one problem. I haven't actually finished development of that app. I put together UI. I put some dummy data that shows the weather on Alderaan planet right now. I was going to say that planet doesn't exist anymore so I'm asking dummy data. That is why it is so cold, yes. But I would like to actually show the real data for say Seattle. And I just heard that Glenn has amazing service running in Kubernetes and he also has a client library that I can just use in my WinFarms application. Let's do that. Right. And not only that, we can actually use it from any .NET application. Mobile, web, WPF. So let's take a look at the library that Glenn created for us. If I right-click on properties, I can see that this library is targeting .NET standard 2.1, which is great because it's the latest version of .NET standard. .NET standard 2.1 ships with .NET Core 3. So it's the latest version of .NET standard that supports .NET Core 3, but it also only runs on .NET Core 3. So that probably means... Yes, exactly. Is your application a .NET Core 3 desktop app or is it a .NET framework? No, it's framework because I developed it a while ago where I did not have a choice between core and framework. So if we go to properties, we can see that my app is targeting .NET framework 4.8. I cannot reference the library right now, but what I can do, I can port my framework application to .NET Core, and then I will be able to use Glenn's library. And to do that, we created a tool called TriConvert that will take your .NET framework project file and it will try to convert it to new SDK-style .NET Core project file. It's a simple command-like tool. I'm going to type TriConvert.exe and as a parameter, I'm going to send the pass to my project file. So if people understand, for .NET Core, the project files are different than they are for .NET framework. Right. And so what we built is we built a global tool that can be installed on a machine, the sample, to help people convert their CS Proj from an old-style CS Proj to a .NET Core-style CS Proj. Yes, exactly. And now when I click on Properties in my Visual Studio, I can see that now my application is targeting .NET Core 3.1. Right? So in just a few seconds, I ported my framework application to .NET Core. Cool. So now I can reference the library. And to do so, I'm going to right-click on Dependences, Add Reference, Find Weather Client Leap, click OK. And once I did that, let's go ahead and update my code that is pulling dummy data at this moment. So I have this method pull weather that just gets dummy data. And I'm not going to need this code anymore. I will also not need the get dummy data. And here I was using the local weather response class, but I'm going to be using the one from the client library. So I'm going to delete that code as well. Now I will insert a few lines of code. I will add usings and I will talk to those lines. So first thing that I do here, I'm creating a client from the library. Then based on that client, I'm creating gRPC weather forecast service. And for this forecast service, I'm calling Get Streaming Weather. So every time the service on Kubernetes is sending out the weather data every two seconds, I'm getting the data on my app. And let's see how that works. So this code looks almost exactly like the same code that Linda Anderson used a second ago when they were calling the same way, the same stuff. So we're showing sharing.net code across all my application types. Awesome. And that looks like a real data, Seattle 53 degrees. And weather doesn't change that often, but you can see that I'm actually receiving new data every two seconds. So once I build the application now, I probably want to share it with my friends, maybe even community, right? I'd love to have us look at that new feature we talked about, single-exe. That's a great idea. So I'm going to publish it as a single-exe file. And to do that, I'm going to go to Project File. And let me move everything down so it doesn't distract us. And I'm going to insert three lines of code. The first line, publish single file, will make package my application and .net core in a single-exe file. And the same all .net core, all your application into one single-exe. So nothing has to be on the machine that you give the version. Exactly. Yes. It's completely independent from the environment it's going to be running on. Super cool. The second one, runtime identifier, specifies which platform my exe should target. And by default, .net core can run on any platform, but if we're publishing it as a single-exe file, we need to specify runtime identifier. And the third one is publish-trimmed. That is a new feature that will trim out all assemblies from your .net core that are not used by your application. So that way you don't get the entire .net core, you get only assemblies that you need for your app. Cool. Which makes the size much smaller. Right. Once I edit that to my project file, I'm going to right-click and go publish. And publish one more time. And while it's publishing, we can see that here you can specify the password where that single exe will be put. You can also specify configuration, target framework, target runtime. All those settings can be set from this page as well. And it takes a while because right now Trimmer feature is working, so it's actually analyzing what we can throw away. Right. It basically goes and looks at your app, figures out what the dependencies are as best as it can. Yes. It's not perfect. We call it experimental at this point. Yes. So you might find that it actually trims too much stuff out, and you have to go back to your CS project and manually add a reference to whatever it trimmed out too hard. That is true. We'll build better tech around this in the future, and we'll build better tooling. But it is a first step that we wanted to ship in .NET Core 3. Yes. And as you said, if it trims something out, it's very easy to add it back to your project file. Right. Okay. So we've published our single exe. And here it is. Just one exe file that I can send to my friends, that I can put out for the community. And they will be just able to run it and use the app. On any computer that has, it doesn't even require .NET Core. Yes. Yes. So the last thing that I would like to show today is integration with App Center. Yes. Because as you mentioned, web developers have been spoiled for a few years where they could see analytics for their websites. They could see how many users they got, which devices that was accessed from, and so on. And we would like to enable our desktop developers with the same features. So for that, you can use App Center. Let me go to my App Center portal. It's appcenter.ms. I created an account. And here you can create a new application. You can configure it. But I already did it for my app. It's Weather WinForms app. Once you do it, you will get very detailed instructions on how to add integration with App Center in your program. And it's super simple. You just add a few Nuget packages, and then you add a few lines in your program.cs file. So I will do exactly that. I'm going to first go and add Nuget packages that are required, which are Microsoft App Center Analytics. And the second one is Microsoft App Center crushes. Right. Once I edit it, I'm going to go to program.cs file, and I will add some usings. And this is how I enable App Center in my app. Two lines of code. That's all you're going to do. Yeah. It's basically just one line App Center.start, and I send the key that I get from the console, and I specify what I want from my App Center. It's analytics and crushes. Now you'll get detailed crash analytics, and you're going to get monitoring as well, letting you know that people actually tried the project. Exactly. And I'm going to run it, but it will take the portal a few seconds. So if we go here and we go to analytics, you can see some analytics. So you can see that I was testing that demo on September 20 and September 23, just today. And you can see a few spikes. We will have another demo later today with Daniel and Matt that will go deeper and dive into all details of all the great features that App Center can offer. And with that. Awesome. So to recap, what you can do now is you can basically build desktop applications with .NET Core 3, WinForms and WPF. You can make them into single-legsies. They can easily be distributed. You can add rich analytics with Azure App Center. Awesome. I'm so excited about this. So let's move back to slides. Next I want to talk about mobile apps with Xamarin. So Xamarin is awesome technology that lets you take all the goodness of .NET and make it available to all the mobile devices. So the idea here is you can build any iOS and Android app with C-Sharp. And why would you want to do this? Because .NET's got all this rich libraries that you can share across all these applications. So for example, that microservice that we showed before. We probably can share that across Android and iOS. That's one of the tenets of .NET and C-Sharp. And Xamarin is being able to actually share the same logic across all your app types, Android or iOS. Another cool part of it is we have a library for building apps called Xamarin Forms. Basically you build it once and it runs on all the devices. And of course also all the Xamarin tech is open source like the rest of .NET. Today we have two awesome announcements. The first one is XAML Hot Reload. Imagine you're in your application and you're going to change some of the XAML files. Well you don't really want to recompile and republish and wait for all that kind of stuff to happen. What you want to do is you want to basically save your XAML file and have your device refresh immediately. Even better than that, Xamarin Hot Restart, which is the ability to also change the source code. Normally when you change the source code, that's a full recompile, copy back to the device. I want to be able to change that code and refresh very fast as well. And so this one's in private preview today. You can go to the URL and sign up and you might get access. The hot reload is actually available to download today. And so next what I'm going to do is I'm going to bring up James and he's going to show us how to build some Xamarin apps. Oh, awesome. Thank you, Scott, so much. Now you're in my way because you know I need to get to my Mac. Get to your Mac. Okay, awesome. Well, like Scott said, I love .NET development with Xamarin inside of Visual Studio. What I love is that, like Scott said, you can share all of your C-Sharp and .NET knowledge across all of your applications. And that's what we've done. I decided that I wanted to take that weather app, import it to iOS and Android, and at the same time, leverage that same exact GRPC logic that Olia used and that we're going to use throughout the rest of the day. Now, two important things to remember. Like Scott said, we have all sorts of different pieces of technology for cross-platform development. But with Xamarin, you have access to 100% of the APIs in iOS and Android and always up to date. We just shipped iOS 13 and Android 10 support. So on top of that, we have Xamarin forms for cross-platform UI and Xamarin Essentials for cross-platform native API access. So let's go ahead and import that exact same weather application to iOS and Android taking advantage of mobile features. So here I am on my Mac. This is the Mac, yes. This is my Mac, boom. And of course, I need to get started with a great design. I'm not a designer, Scott, sorry. But Guzman Barquin was nice enough to have this amazing weather application on Uplabs, which is one of my favorite websites to use for mobile design. And reached out to him, super happy that we're able to use it. And I'm super happy that he's an amazing designer. So that's what we're going to do. And I'm over inside of Visual Studio for Mac. We just launched a brand new version with all sorts of new tech. So I want to show that off too. But where you get started is File New Project. You have cross-platform apps. You have iOS, Android, .NET Core Apps, Azure Functions, Mac, TVOS, WatchOS, everything is possible with Xamarin and .NET. So what I've done over here is I've added an Android and an iOS project. And I also have this mobile core. It's a .NET standard library, just like we can use to share across all things of .NET. But it has Xamarin forms in there. And this is my mobile specific code. So this is things like my user interface with Xamarin forms, my models, my view models, my app state. But notice that I have that weather client lib that Olia used that Glenn had created. So it's inside of Visual Studio for Mac. And I can reuse it right here inside the weather app. So that mobile core, that's the differentiator for Xamarin, right? That mobile core is the code that is shared across the iOS and the Android apps. So you write it once and it gets to be used in all the devices. You can think of it. Most of my apps have two different .NET standard libraries. One that can be shared with anything. So RESTful service calls, models, things that are just, hey, this is .NET code. Then I have my platform-specific code or mobile-specific code. And this UI runs on iOS and Android. So for instance here, if we take a look at how I built this app, is I have a weather page and a weather view model. So here up top, I have a view model. I have a weather client and this GRPC weather forecast service. The same exact code that Olia was showing earlier. And since I'm going to be using XAML and data binding, I have some backing fields. So for instance, I have a useCelcius, a temperature, condition, timestamp. These are things that my user interface is going to display. And I can tell it to update via set property. But here, if we look at this, message weather service get streaming weather. Same code. The only difference here is that I'm telling it how to render the user interface. So here's a bunch of items I want to display in a list. And then when I want to update the UI, I use Xamarin Essentials to say begin invoking this logic on the UI thread, because that GRPC could be coming in from anywhere. So let me just go ahead and run this really quick. So I'm just going to hit debug. This is going to take my application logic, compile up my Android application, and then deploy it to an Android emulator right here running on my Mac. So there we go. My application is starting up. And what we should see, hopefully, is a beautiful weather application that I built inside of XAML. All right. It's doing some stuff. But let's go ahead and fill this in a little bit more. So I have my user interface code down here. And let's see here. I have a pancake view, which is a beautiful third-party control that will allow me to do the gradients in the background. But I think I'm missing some stuff. Okay, so I have a label with nothing in it. So let's just put in Seattle. Now I'm going to use that XAML hot reload. So I'm going to hit command save. It's going to save that and push the changes over into my device. So Seattle right there. Now what we can also note down here is I'm missing some other things in my UI. So for instance here, we can go ahead and maybe put in a new column. And then I'm going to say binding. And the brand new XAML IntelliSense will kick in and I can say temperature. There we go. Now it does look like for some reason my internet has stopped. So that's good. And I'm getting no updates. So things are working exactly as planned because we're doing it all live. Which is super great. But I have zero degrees. So it did show up. So that's really good. All right. It's very cold in here. It's very cold in here. Yeah. So other things that we can do inside of here for instance is like this Monday here. So that's just showing a blank. So if I look here on the date, what we can see is that I have current weather conditions. I have this date property here. And maybe I want to change this to a capital casing. So I can say use a case converter, say true, hit a save. And now that Monday is completely updated 100%. Now what I'll do here because I did change internet right before, we're going to go ahead and stop and redeploy again and bring up a new emulator and see if we can get our internet back on our machine. Which would be very helpful if so. You can see actually how fast the emulator rebooted here. So let's go ahead and see if this is going to spice up for me because having real data would be useful. It's always fun to show the real data. Microservice. But you can see how rapidly iterating I was on that user interface using XAML Hot Reload inside my application. So there we go. We have weather. Oh, hey. Cool. So one last thing I want to do down here, actually two things, is I like this collection view, which is like all the different humidity, UV down here. And that's a brand new feature inside of Xamarin Forms. So here I can say horizontal or vertical. But I'm using a pancake view. I'm going to add a fancy corner radius here and hit save again. Again, XAML Hot Reload kicks right in. Boom. I got beautiful rounded. So fast. So fast. But you know, I like teardrops, which are new hotness. I think everyone's going to pick up. Boom. Look at that. And I can prove that this is running in real time because down here, if I wanted to, I could go ahead and say time stamp, large. And now we can see the time stamp from that GRPC client updating in real time right there, which is super awesome. And that's XAML Hot Reload right there inside of Visual Studio for Mac with all that GRPC client, beautiful user interface. Boom, right there. Now, what I need to do though is also deploy this to iOS. So normally I would just say, set that as my startup project, go into my iOS simulator, boom, good to go. But I want to show off some brand new features of Hot Restart. So I'm going to actually head to my Windows machine right now and do iOS development. So let's swap places over here. I love this. Here we go. Android on the Mac and iOS on the Windows machine. That's correct. So I'm right over here. Now, what I want to talk about though is that it is the same projects, same solutions that I just had open in Visual Studio for Mac. So no matter where you're working, you're good to go. I know you're Mac guy, I'm a Windows guy, so ideal setup right here. So it's going to make it really easy to go back and forth. And again, I have my shared code and I also have that iOS project and that shared code and everything else that I have in here. Now, what we wanted to do with Hot Restart is that every once in a while you're changing C-sharp code. For example, Hot Relo, user interface code. You need to be able to rapidly iterate on your app. But what happens when you want to get it on your device? And that's some of the cool tech built into Hot Restart. So what you're able to do and what I have here is my iPhone, right here, my iPhone 7, that's plugged in to my Windows machine, okay? And what I have up top is my iPhone right there. It's connected. So it's good to go. And what's nice here is that all I have to do is hit Debug. If you've ever done this before, you've got to worry about configurations and connections and profiles and all this stuff. But what we're able to do with this technology is restart your application directly onto your device. So here, for instance, I have my device that should be screen mirroring. Let's go ahead and see if it's going to cooperate with me. Let's go ahead and maybe shut it down and reopen it. Let's do this really quick here. There we go. And perfect. So there's my device. I'll put it right over here. So there's my device right there on the screen. Now what's great about this is that I can come into my UI. Let's go ahead and just make this sticky on top. Cool. That looks good. And what I can do is add some new technology into here. So for instance, maybe I want to convert this into Celsius. So again, I'll just uncomment some code. I have a checkbox. I have a label. This is data bound to that use Celsius. I'm going to hit save. Now XAML Hot Reload will kick in. And notice that it's reloaded. I hit a break point. I'm debugging my app right here on my device. So I can go ahead and continue on. Good to go. I'm all right. That's good. I must have made some changes to my code that weren't compatible. But no worries. I can just literally use that hot restart here to redeploy again. So let's go ahead and deploy. There we go. And you just saw like I stopped. Took that. Took some changes. Good to go. I see you back on the phone already. And now it's back on the phone. Yeah. So this is initializing that debug session and XAML Hot Reload. So here's our app. Here's everything is good. And now we have this little back and forth. But as you can see, Scott, we have some issues because our hot reloaded that UI. But the temperature is not changing. It's not converting. Now the background is, so my converters, my code is running. So let's fix this. If I go into my view model here, we have that temperature property. Now it's returning temp. So that's not good. So what I'll do is I'm going to say use Celsius. I have full intelligence, everything here. We're going to use Xamarin Essentials. What's cool about this is it has a bunch of unit converters built in. So you can do like Hertz to degrees, Kelvin to Celsius. Here I'm going to say Fahrenheit to Celsius. And I'll pass it the temp, else just temp. There we go. Make that temp. There we go. Now what we can see is that the UI is telling me that, hey, I've made C sharp code changes to my application. You need to restart your app. And what we can do right here is hit the restart button. And this will take all of my code changes that I made, redeploy it to my device without having to compile it at all. And what's great is that this is literally right to my device in just mere seconds. Those squiggles go away. The application is now back into a debug session that I would expect earlier. And what we should hopefully see here once hot reload initialize. I can hit Celsius. Now we're in Celsius. And I can use my app, my real data, use XAML hot reload for my UI. And hot restart when I'm making code changes and play directly to my device in seconds with nothing in between. I have never seen mobile development on either platform, on the Mac or Windows, deploy to devices and restart as fast as I've seen with the hot reload and the hot restart. This is a game changer. We want to focus on developer productivity and make sure that our developers building mobile apps with .NET have the most enjoyable time without anything in between. No big setup and boom. Between those two technologies you're going to be hyper productive and share all of your .NET logic like you've seen before. Across all the devices. All your apps. James, let's go back to the slides. And what we're going to talk about next is building web applications with Blazor. So, the way I like to think of this is if you're building web applications we've had awesome web frameworks in .NET for many, many years. But the web has transitioned to this new place where all apps are spa. And so, what if we could just take the technology we already have today and say, you build any brand new ASP.NET Core Blazor application. It looks like Razor, Blazor-Razor. And those applications just become sparse by default. That's what Blazor is all about. It's full stack web development. You build an application in .NET. It's a spy app using the same frameworks and the same technologies you're used to already. You don't have to re-learn a bunch of new stuff. The cool thing about this tech is it also runs in all the browsers. So, it's compatible with all the browsers that are out there whether it's mobile or desktop. And even cooler there's one final piece which is we have a prototype for in preview thing called WebAssembly. And WebAssembly lets you take your web application and run it directly on the device. That means you don't have to actually it can be completely disconnected. It can be running on a desktop. It can be running on a mobile device and running as a real desktop application. We do that because we can compile your C-Sharp directly into WebAssembly that can run natively in all the browsers. So, what I'm going to do next is I'm going to have Dan Roth come on stage and he's going to show us how to build Blazor app. Hi Scott. With Nicore 3. Yeah, great. Shall we build a single-page web app for our weather application using only .NET and C-Sharp? No JavaScript. No JavaScript required. All right, cool. So, I'm going to get close down some of this stuff so I can see my app. There we go. Okay. So, to get started with Blazor all you need is .Nicore 3.0 because support for Blazor server apps is now in the box. So, I'm going to stop the changes app and I'm going to open up a new Visual Studio instance and we'll just go ahead and create our first Blazor app so we can just get a feel for how it's done. So, I'm going to create a new project and let's create a Blazor app. There it is. Right there in the box. Blazor app one sounds like a great name and then for this app I'm going to pick the Blazor server version. We'll talk more about the WebAssembly version in just a second. All right. And then we'll go ahead and get this running. All right. So, we can take a quick look at this application and the project and see that there's no there's no JavaScript here. Right. It's just razor files and C sharp. Let's go ahead and control F5 so we can see what the application does. These razor files are the same razor files our developers have been using for the last nine years. Yeah. So, these are a combination of HTML and C sharp and it's used to dynamically render your application. So, I want to start. Oops. Sorry. Let's start without the debugger. And we'll get this going and then we'll see what this app does. Now, this will be a simple spa style app. Like it'll have some interactivity, some tabs. You can tap around. There we go. So, we have a homepage, a counter, fetch data page. I can use the back and forward buttons in the browser so I can do client-side routing. All of those navigations are actually being intercepted in the browser by Blazor and then handled in the browser according to the server. The homepage just has a little bit of static HTML, nothing too exciting there. The counter has this button that if I click, the count goes up and there's no page refresh happening there. It's all happening that like a client-side app would normally work. And then we have fetch data and fetch data is conveniently enough showing a table of weather forecast data. Now, how is this working? How is this possible? There's no JavaScript in my project. Well, that's F12 and look at what is going on in the browser dev tool. So, I'm going to refresh. So, we can see the network traffic and if you look here we can see that there's not much being downloaded. It's only about 400 kilobytes of stuff. But if we look a little more carefully we see there's a WebSocket connection being set up between the browser and the server. That WebSocket connection is being used to send all the UI events to our components that are running server-side which then executes the components, figures out how the UI should be updated and sends the updates and that's how it's working. We can see that in action. Let's look at the WebSocket connection a little more closely. We'll clear all the messages that have been sent so far and I'm just going to click. You see that? See the binary messages flying. That's UI events being sent and UI updates being processed. That's how that's all happening. Now, let's go look at how the code is actually implemented for that counter component. Here it is. It's a razor syntax a combination of HTML and C sharp. We can see it's routable because it has this value at the top to say that the route for this component is slash counter. We have some normal HTML markup and then we're using razor syntax to render the value of the current count. We also have a button which has an on click handler. Normally this would have to be JavaScript but here it's C sharp. We're pointing to a C sharp method that whenever time the button is clicked the count gets updated the component re-renders and that's how you see those updates on the screen. Now each of these razor files is actually compiled into a just the rendering logic from the dot razor file and those component classes can be compiled into .NET assemblies they can be then shared on Nougat as Nougat packages you can build reusable component libraries That's how those component vendors we showed earlier can actually have these components and we can actually just drop into our apps. That's right it makes your life so much more productive we can just grab existing components and go. Let me show you how that's done how you can build your own component and this time instead of a blazor app I'm going to pick a razor class library now what is that well a razor class library is actually just a normal .NET standard class library but it's been set up to also be able to compile dot razor files to compile razor components here we have a razor component that's in the new class library it's pretty simple it's just a div but it does have some styling and this is interesting the project has this www root folder with a couple of static files it's got a styles it's got a background image that's also used this is a new feature in ASB.NET Core in .NET Core 3.0 where your class libraries can carry static files that then are made available to the application when the project is referenced or when the new get package is referenced so I'm going to add a reference to that class library like so so I can use that component now to make these files available in my app I do have to add a link to the styles that I want and we use a simple convention to do that I'm going to copy a link and I'm just going to update it so the convention is it's underscore content is the prefix and then the name of the class library so razor class library 1 and then the path to the file that you want so styles.css and that's all you got to do now we can use our component in our app so let's just start typing here component 1 I think is the name yep there's IntelliSense let's close that out we save let's go back to the browser already knows that the app has been changed we just refresh and so we can hopefully see the changes on the home page there is our styled component that came from that component class library so easy so simple so that gives us hopefully the basics let's now go build that weather app I've already started it over here and this solution if we go into the blazer folder I'm going to set the blazer server version of this app as the startup project there we go now this blazer app is a little bit interesting in that like it actually doesn't have like hardly any razor files in the app project like hardly at all that's because it references this blazer weather core project down below that's a razor class library that contains all the components that's used by the app and I'll explain why we did that in just a bit but you can look in here and see there's the forecast that razor page and there's all the razor syntax that renders the app let's go ahead and run this and see what the app looks like this app that James used for the mobile application there it is so it looks pretty good we got the current temperature that's all working now let's look at the code and see how that is done at the top of this page it's got a route just like before it also is injecting an iWeather forecast service that's the same gRPC based service that James used in his mobile app same code power.net all the code runs everywhere browser, mobile, desktop anywhere you want and then we've got the razor markup that's just rendering out the DOM elements for the page down below in this code block here's a component lifecycle event that fires when the component has rendered and this is kicking off this get weather updates async process which is in this method down here here you see that async for each loop that we saw before same loop we seen before so it's getting the live updates from the server we should be able to see that in the app let's zoom in here so 40, 45 yeah so the ticks are coming in from the update all right great now we're missing the temperature units let's go ahead and fix that I already wrote a little temperature unit picker component it's another dot razor file in the class library it's just a div let's expand it again it's just a div that has an on click handler that when it's clicked it will toggle the units from Fahrenheit to Celsius and then it has this parameter temperature unit changed so it can let the parent component know so now we just need to use that so let's go back to our weather forecast page after the temperature let's add the temperature unit picker and we're going to at bind the temperature unit from that component to the temperature unit field in my page and that's all we should need to do I'm going to control F5 again not control F4 I don't even know what control F4 does maybe search or something all right there we go so we're up and running and now we've got this little widget down here by the temperature I can click on it and you can see the temperature automatically and Fahrenheit now that's a Blazor server version of the app but one of the cool things about Blazor I'm going to stop you and say we're going to we're going to stop on the Blazor stuff we can quickly talk about the WebAssembly thing so basically WebAssembly allows you to take these same applications and actually build them where all the code runs on the browser not on the server this is the same app same components it's just instead of running in a Blazor server app on the server this is all executing inside in the browser there's the WebAssembly file coming down with the app so you can host your app on the server or on the client and take advantage of both sides of the wire cool I am super excited with this Blazor stuff this is like you know all my ASP.NET knowledge now let's be built spy applications without using any JavaScript at all if I want so super cool Dan full stack Web development with .NET okay let's switch back to the slides real quick we're going to talk about one more big thing machine learning we introduced ML.NET at build May of this year 1.0 that just shipped and I'm just going to quickly talk about it and we're going to bring Bree up and show a couple of demos the whole idea behind ML.NET is if you're a C-sharp developer you don't want to have to go out and use some other technology or some other language to go and build machine learning into your applications and so you can build ML models and stuff directly in C-sharp or F-sharp without having to go anywhere else we also know that it's hard to actually build you know models and so we have an awesome preview tool called model builder that you can use to actually just point it at some of your data tell it what you want to predict and it'll actually go and write all the code and models for you Bree's going to show that and then finally we want to make sure that anything that we do in ML.NET it can be extended with all the ML buzzwords you've heard like TensorFlow and stuff so what I'm going to do next is bring Bree up on stage and what we're going to do is we're going to build a yeah come on we're going to build a machine learning application that does weather as well yes we are so if we take a look we still have Dan's blazer app up on here but what we're going to do is actually make this app smarter using ML.NET all it does is it right now is it pulls weather data from Glenn's microservice that's hosted in Azure Pubernete's but we're going to use machine learning to take images from around the city and actually predict if it's sunny, cloudy or rainy so it's going to predict as we all know that the weather is not always accurate you're better off going and looking yourself to see if it's actually doing something right exactly so we'll close out of all these over here all right so if we go back to let's see the forecast.razor that we saw before all right so Dan talked a little bit about components which are just UI elements that you can have in your blazer applications and I created one of those for the machine learning and I just called it ML weather cam so right below the weather data that we saw before and then what this does is it if we look at this ML weather cam dot razor right here there's going to be three buttons that are going to link to three separate photos which are then going to be put into this classify weather method and if we go I'm going to go to the app it's going to show me a couple of pictures that we got from cams around the area and then it's going to tell us kind of what it's showing us whether it's rainy or sunny or what not exactly so here you can see there's nothing really implemented right now we just have it returning a string so if we go ahead and run this real quick and give it a second and we'll see that new component added on there it's just when you click on it oh you know what actually we're going to try it on the server version instead because that's where it's implemented so let's retry that it really did let me try this again so we're going to rebuild our solution and it will take just a second just I want to show you that it's implemented without the machine learning so we're going to have machine learning run the application we'll show the pictures and then we'll run model builder to go and create the actual model for us right exactly and so shouldn't have rebuilt the full solution but give it a second it's a big solution it's a big solution yeah so one thing I should talk about is you know while we have the solution we're actually going to make this entire all the demos we have today I'll be available in GitHub later today right exactly anybody that watched the keynote can actually do this themselves and so here are the three pictures that I was talking about here's that new component and of course it's just returning the same text every time so to add machine learning we're just going to use model builder which is UI tool and visual studio it's just an extension that you can download once you download that extension you add machine learning and there's a variety of scenarios here that you can see like sentiment analysis price prediction but we're going to do image classification because we want to predict the weather in images so then we'll choose our training data which is how you create the machine learning model in this case I've already put it in the format that needs to be with three different labels here and we can actually see once we choose that it's for cloudy, rainy and sunny so you gave it a bunch of images to learn from right and I'm going to have it trained for about 90 seconds because it's a small data set with larger data sets you want it to train for a little bit longer so this whole tool kind of makes me laugh I remember a year two ago we were building a demo in the team it was called githubclassifier and what github classifier did is it basically looked at the issues that were being filed in our github repose and would automatically classify them I remember sitting with my team and I was looking at the code and I'm like I don't know if I'd ever be able to write that code and that's kind of the genesis of the model builder thing I couldn't figure out how to write the code and then the next thing was I remember asking the team well how did you choose the algorithm and the answer kind of was well we tried this one and it seemed to work and to me model builder is like taking that to the next step further where you basically instead of doing that give me a data file of existing data run this tool on it it will try things doing it right now it's trying all the different algorithms we have in ML.NET and will write the code for me so you're making ML where I can use the code right yeah so building and fine tuning the performance of a machine learning algorithm can be really difficult especially if you don't have that machine learning knowledge so what model builder does is use automated machine learning or auto ML for short to explore different algorithms and settings so that's the best model based on your scenario and your data so it's really really cool because you don't have to have that machine learning knowledge and as well you're showing the graphical version of this inside a visual studio but if I am on a Mac or on a Linux machine I can also drop the command line and run the same tool that you're running inside a visual studio on all those platforms as well right exactly so if you don't use visual studio you can actually use this ML.NET CLI in any command prompt which is really nice so it's done training we're going to head over to the evaluate screen I actually found this which uses a ResNet neural network architecture for that image classification and we'll move on here so what's really nice is once you have your trained model you can add your projects and if we zoom in here give it a second you can see that there's this console app here which is actually where the model training code is and you have your model consumption code and your actual serialized zip file which is the model so if we come back out here and now if we go back to model builder you can see it gave you the code for consumption right here all you have to do is copy this code and go back to our weather classifier we'll uncomment the namespace that model builder actually adds the reference to the model for you and right here so we've created our input we're going to set the file path here to full path and then we're going to actually load this into here and return result.prediction and so actually we're going to add the reference here because I think it was added to the wrong nope it's there let's see what it's giving us here oh here we go so we've got our weather service ML.model oh what we have to do is actually I think I called it on the wrong one one project yeah the wrong project actually needs to be called on this project so whichever project you add machine learning to it'll add that reference to automatically but since I did it on the wrong one we're just going to add the model here so once we'll go away yep so then sorry it's a mouse I'm not really used to here so we're going to do input.imagePessource equals full path and then we'll be able to debug that alright so now we can see that it detects this image ooh I saw it say cloudy when you clicked that we've got CenturyLink so we're going to run out theaters looking a little bit rainy and Golden Gardens Park is looking sunny so in less than five minutes we were able to use ML.net and Modabiller to add machine learning to this blazer application which is really really cool that's amazing let's go back to the slides and we'll talk about IoT so IoT is kind of a new space in .net .net core kind of enabled this by being able to run on different platforms and architectures and so the big thing here is you can run .net core on Raspberry Pi's including all of .net you can run ASP.net on these things we have a GPIO library for reading and writing data to some cool hardware that Richard's going to show us and you can actually deploy these applications to IoT either directly on the device or using a container on the device so let's switch over here and bring Rich on and let's talk about IoT and .net hey Scott so this is more of a show and tell type of setup today so we have a Raspberry Pi right here so this is a Raspberry Pi 3 actually and it's got this hat on it sometimes they're called shields but this is a hat or a bonnet and this is controlling this set of LED matrices so actually there's four of them here it's really hard to tell because I did such a good job making this setup but there's actually four of these and it's all C-sharp code that is running this from top to bottom and so the libraries that we built actually are able to figure out like the address translation to deal with the fact that there's four of these and they're kind of like in this setup and so it's kind of cool we've got a message here about .net conf that's kind of one row then we have this other one with a time then we built a analog clock an analog clock and you can see this isn't an image this is actually a code driven I'm watching the second hand go around in real time it's amazing yeah so this is how you're staying on track right? so this is actually kind of a canvas and then it's actually raining in Seattle this won't be much of a surprise to you you're calling the same service that we showed everywhere else right? yeah exactly and then so it's showing it's raining so really what this is demonstrating is this device is like really low powered compared to you know the like Intel X64 blah blah blah machines that we've been used to and it's showing that yep you can see people of like doing a lot of things at once that's the cool part about C-Sharp and .NET is you can actually run it on what arm32 arm64 but if you want you can also run it on the big Intel CPUs as well yeah and and it's all the same the other thing is because it's all C-Sharp it means that you can actually use the C-Sharp debugger that you're used to using a lot of the other solutions out there depend on native libraries and some of those are relative to people that work in this kind of ecosystem cool I'm still super excited about this because we never could have done this five years ago oh yeah totally this is definitely new so I'm really happy with it too thank you let's go back to the slides real quick and I want to talk about something really cool .NET Core is all open source and even though it's open source we actually want to consume some of the open source libraries like GRPC GRPC is an open source project and we Microsoft have been contributing to that project our engineers are working on that project to make sure that the C-Sharp support there is first class at the same time I mentioned earlier identity server identity server is an open source project that helps you add authentication to your APIs .NET Core we are actually contributing to identity server we actually are helping fund them the monster of their project giving them money you know GRPC we are giving them code identity server we are giving them money via GitHub and then also Swashbuckle which is a common library for building Swagger for .NET Core projects if you want to if you want to use any of our REST stuff we can generate REST endpoints the same way we generated those GRPC endpoints to do that you have to have a library like Swashbuckle and so I'm happy to announce .NET 5 so we just shipped .NET Core 3 and of course the team is super excited we are working on .NET Core 3.1 right now but I want to briefly talk about .NET 5 too so you know after .NET Core 3 the next big thing is you know we talked about Xamarin and we talked about .NET Core what if we put all that together into a single framework and so .NET 5 is the genesis of this the next iteration of .NET will be .NET 5 and the idea here is all the run times collapse so we have one common set of run times we have one BCL that sits on top of that and then we have all the app models on top of it and so in the .NET 5 wave there will just be one .NET not multiple .NETs let's talk about our schedule so we just shipped .NET Core 3 today .NET Core 3.1 is going to ship in late November early December that will be our LTS that's our one if you want long term support but we are going to go way beyond that we want to make .NET predictable so you can see here now .NET 5 will ship next November .NET 6 will ship to November afterwards so on and so on and so on each of these .NETs every other year will be an LTS so it's very clear which ones are long term supported and which ones are faster but we are trying to make it easier for you to consume .NET and understand the schedule I do want to do one quick thing I'm going to grab my laptop slide it over here I thought I would do one demo some of the tech that we have coming in .NET 5 and so Dan showed the Blazor app Alia showed the desktop app James showed the Xamarin app and Bree showed the ML app well we want to take the step even further so we are going to switch to my laptop here jump out of presenter mode get my laptop back and I want to show a preview of one of the things we are thinking about in .NET 5 so I'm going to run that same Blazor app that Dan showed but now what I've done is I've actually wrapped it in an electron shell electron is the technology we use to make things like visual studio code run on the desktop and so now you see that same exact web weather application running it's a Blazor application so it's web but it's now running in a desktop window it's got file menus I can do file and exit this is one of the examples of the technology we'll bring in the .NET 5 wave so I want to close with one thing here which is we have an awesome unified platform you can build every type of application on .NET Core my advice to customers today with the shipping of .NET Core 3 if you're building new applications build them on top of .NET Core 3 it now has all the capabilities that should be important for modern applications if you have existing applications you likely should keep them off of .NET Framework there's no reason to move them off of .NET Framework .NET Framework is going to be supported forever so new applications on .NET Core 3 leave your existing applications where they are everything that I'm showing here is downloadable today and I want to thank you everybody very much go get the bits and build some new applications on .NET Core thank you very much hey hey guys alright welcome to .NET Comp 2019 woo that was an awesome keynote right oh my god yeah so I just wanted to let you guys know a little bit about the format of this conference we're going to have a super awesome time for you if you look on the party page the .NET Comp website .NET Comp.net slash party there are two virtual attendee parties happening these are all sponsored by amazing sponsors of .NET Comp itself here they are giving away over 40 prizes boxes surface goes bunch of Amazon gift cards the attendee parties one is after the show today and one is on Wednesday at 4 a.m. art time so we can hit all the time zones so you can play answer trivia questions and if you really want to get involved and engage and watch the video Jeff's going to be back there with the partners Twitch TV Hack Visual Studio so that'll be fun it's going to be a ton of fun I think that's fun and the other thing we're doing the new this year is a technical treasure hunt okay so 10 of our partners have created these technical challenges for you where you got to go figure out answers they're going to give you clues throughout the day so watch the .NET Foundation Twitter handle and the hashtag .NET Conf our partners will give you secret clues watch this page we'll give you all the URLs to hit so if you want to try and figure them out read the rules okay so what you do is you'll need a twitch account and you'll whisper to the twitch bot your answer and it will let you know if you got it right or not if you get them all right enter to win for really big grand prize a lot of cool little puzzles and stuff oh yeah they're really cool challenges from our partners so that's actually pretty awesome yeah so watch that also I wanted to say our local events we now have 217 local events and I think there's like 40 watch parties going on right now it's amazing so like if you are if you guys are having a watch party right now make sure you take a picture of your event hashtag .NET Conf we'll get it on the tag board here okay so that'll be awesome so a lot of these actually are .NET foundation meetups right John? they are that's right so .NET foundation meetups have grown they've just grown like crazy so we're at 314 worldwide now 62 countries which is so cool that's amazing I've got a link here too you can join these there's a link on this where you can join the meetups and we'd love to have you so this is a great way where you can get involved locally and like Beth said tweet stuff at .NET Conf and we'll post your pictures .NET foundation's been really busy lately we've got recently this year we launched our community community election so it's an open membership and an open vote for our board of directors so we had a great turn out for the election our new board of directors when they started up we met and we said what is some stuff we want to do what are some things we want to focus on and Beth you're one of the board of director members here I am so we one of the things we decided to do was form some action groups and these action groups are like hey here's some stuff we really want to focus on and get done and then as part of this we make it so that members can join these action groups as well so they can volunteer get involved and you know help get stuff done right so some of these the marketing communication one we've moved to a you know it's all GitHub pull requests people can submit their news items project support we've moved over to a con bond board that's open one oh and the outreach team Sarah chips led a call with people around the world and we had you know we had all these people telling us how we can expand the reach of opensource.net it's actually been really fun trying to pull together a committee and volunteers it's great it's an expanding out from this tiny little team to like this worldwide group one that I'm really excited to talk about today is the technical oversight group so when we first met we the team especially like John Skeet and Ben Adams and the Orin of Otney they were saying you know there's some stuff we could do to make to just improve the project ecosystem to make it so that you can depend on projects they'll stay around that there will be a little more structure to them so I'm really excited to announce today that we've got three new programs launching under this so one is a maturity model and I'll dive into that in a second that really defines these quality levels we're also announcing to support that some training and support and a project forage and that project forage is focused at identifying some kind of key strategic areas for things like shouldn't there be a library shouldn't there be a project for this and then dive in and do it so yeah this project maturity ladder is it's totally opt in if it doesn't fit your project totally fine but if it does this can really open up some things so we've started you know up till now we've really where we've been at for our projects and that foundation has been kind of in the two and three level here so it's been you know you'd contribute your IP we'd say here's some general best practices and we'd support the project but you're kind of on your own it also was difficult for a project to join it could kind of take a while so what we've done now is we've added this easier level this incubator level and this is a really easy on-ramp project to join not a lot of legal paperwork it's just kind of like hey we'll hook you up with a mentor we'll help market you then as you move up we're adding in some structure around things like you know bringing in some basic security practices at level two level three really focusing on things like continuity and sign packages make it easy for enterprise to trust you you know and for other for interdependencies between libraries and then finally at level four is this trustworthy project that built from source on certified build infrastructure so yeah like .NET Core is yeah yeah exactly and so we've got a blog post going through this there's actually a lot of information here we've got a repo that's live today with tons of information on this also as you mentioned the .NET team is involved we're also we've got several pilot projects so we worked with we reached out to a lot of our kind of top community projects and we said you know what would you like to get involved so they worked with us to kind of look at our draft of the proposal and get it right you know so we're really excited about this we're working with Dapper Identity Server Mini Profiler Stack Exchange Redis what's that okay Newtonsoft Jason and then the .NET team like you said so they're actually building on the certified infrastructure awesome so yeah cool and also let me see am I still what am I doing here great nothing's happening there it is so oh we've also under the .NET Foundation we've got a corporate sponsor program so we launched that in December we've got several corporate sponsors so in December we added on Pivotal, Progress Telerik and Insight right and so these are these are companies that you know business is invested in open source .NET to the point that they really they're chipping in financially they're getting involved in supporting things super excited today to announce that AWS is joining so AWS is a corporate sponsor of the .NET Foundation and we're just so happy to have them join so we've got awesome to have them on board and help in there absolutely and this is something you know where they can help they can be involved and help review things you know and so it's pretty significant we now have all three major cloud vendors as sponsors corporate sponsors of the .NET Foundation that's pretty huge absolutely so I think what you see with this is you know huge investment from Microsoft and .NET and the community the entire you know worldwide community with the meetups and stuff and then also the corporate sponsorship shows just support all over the place it's great to see .NET growing like this absolutely and so now we want people to become a member of the foundation you know you have to be like a super duper coder you can become a member even if you're just like contribute to docs run a meetup you know you know help out the community in any way right yeah so there's information here on this become a member page and it really is something where you know if you've contributed you know we've got people that have contributed just a few lines to docs or they've spoken at their local meetup you know like done a short little presentation if you haven't even if you're not at that level let us know on the next step because then we can get you involved with these action groups action groups that are doing things like that you know that maturity ladder that I talked about that's going to take some work to get that all set up it's exciting though right it's a new opportunity and so this is your ground floor to get in and so like we're actually all open on github our discussions everything that we're doing like around the because those committees so as you when you join become a member you can actually contribute to just the discussions as well you know I mean would love to have a checklist things like these things you know right can you can you review the membership applications sure but it's exciting because it has a huge worldwide impact right so things like that that newsletter right moving that to something where anyone in the world can submit a news item and as soon as we open that up our newsletter not so much better so we're open sourcing basically are or opening up the way that we run the foundation to all of our members and that's what these action committees and groups are about really excited about that alright so right now we're going to get started with some amazing sessions alright these are going to be we have like 78 sessions for you over the course of three days it's absolutely insane so in order to make these sessions awesome we want you to ask your questions on twitter just use the hashtag dot net conf because this year we have some amazing live in studio hosts and this year we've got Kendra Havens and Scott Hanselman take it away guys thank you so much thank you Beth and John yeah we're hosting this is our twitter board so we'll see everything that you submit and be able to read those out to our speakers and answer them yep so make sure that you tag all of your tweets with hashtag dot net conf and we'll go ahead and bring them up on the big board here you can see that folks are doing viewing parties so some huge nerds there here we go some folks here are doing a live streaming party as well so I'd love to see photographs pictures of your of your parties of your viewing parties we have folks all over the place we've got we got some pizza at x spirit so I want to see photographs I want to see photographs of you and your friends and your coworkers and colleagues all checking out dot net conf live and hashtag those things and of course questions in a few minutes we're going to go to the board and Kendra and I will and make sure that they get answered one other thing I want to call out and maybe they'll put those up on the board for us is some new videos that we did as well so when the fun and excitement of dot net conf wears off with over 80 different videos and sessions it's a lot to take in in one day we got together with our friends and we put up some great stuff on YouTube if you go to dot net slash videos there's in fact how to do C sharp how to do ASP and ML desktop all kinds of stuff maybe our friends that are running the board here will send me a picture of that tweet I tweeted it on my Twitter but you can check that out at dot net slash videos and all of those are available let's see what we got here and then we're going to bring that up for me I don't see them yes this is the great thing about live television yeah we wanted to share that tweet with you let's click this button here oh there we go I forgot about that one that's what we should have been doing see look at this oh hang on Hacker space Mumbai nice ooh what else we got here there's some enthusiasm here about dot net yeah a lot of people excited to be a dot net developer oh look at this there's our folks in Bingo LaRue she's the next three see what's here what else you got here do I see there's so many tweets I'm actually not even sure our tweets right see folks are just bringing them in okay well they're going to come in faster than I can deal with them but we're going to have all kinds of information about dot net and the future of dot net and I think that right now we're going to be jumping over to Mads Torgerson who's going to do actually a two part session yeah all C sharp 8 goodness I'm excited all right let's jump over to Mads and we'll see you on the big board soon hey we're doing the first of these two sessions about C sharp 8 the other session is actually going to be Bill Wagner who writes about C sharp for a living so we're both deeply involved there there's a bunch of new features in C sharp 8 so that's why we kind of cheated a little bit here and got ourselves two of these short sessions but this first one here is going to be devoted exclusively to to know so this is going to be 25 minutes talking about nothing null is one of these things that we've learned to live with but we aren't really super happy it's been an object going to programming forever null is actually about 53 or 54 years old and the problem with it is that it poses as an object you can always get null but you never know where it's coming from and eventually you accidentally dereference it and it'll blow up and circle it but once you're beyond the event horizon you know you get the you get the gist here so I'm going to switch into visual studio and we're going to we're going to blow some things up so here's an absolutely innocent looking little program I create a person I call a method and I print out the result of that method that method gets the length of the person's middle name and returns it so it's absolutely no code nothing to see here would pass any code review but of course if we run it then we wait for a while and then we get a nice little explosion because it turns out that middle name was null but we were dereferencing it and at least now debugger tools can tell us what it was that was null but it doesn't tell us where the null came from why is it there should it have been a person API that I was calling that's all really muddled and unclear and so that is what the feature is for that we call nullable reference types in C-sharp 8 it's one of those features that is about telling you new things about your existing programs it's telling you it's giving you new warnings where your behavior isn't what we could call null safe so it's attempting to catch places where you do things that might are likely to lead to some problems since it's adding new warnings it's a feat that's sort of like a breaking change if all of a sudden we start adding warnings to existing code so don't do that automatically it's a feature that has to be turned on and the most sort of sweeping way of turning it on I'm going to turn it on here for the the person library well I'm going to go into the solution explorer and turn it on I just go into the project file that's this thing right here and it's set to disable and I'm going to I'm not going to enable the feature but it's disabled by default so you have to go do this manually now that I do that let's go look at this person class it has you know straightforward auto properties and it has this constructor I was calling with a first and a last name and what we see now is that now it gets a warning after I turn the feature on and the warning says that the non-nullable property middle name is uninitialized that essentially it means that it could apparently now it considers middle name to be non-nullable in other words reference types as we know and love them are now considered to be non-nullable they're not supposed to have null in them and it catches the fact that since it's it comes pre-initialized to null we don't change that to something non-null we could of course initialize it kind of cheekily we could initialize it to null and then that warning would go away it goes away but now we get another warning saying hey you can't assign null in there nice try and so we're faced with this design question actually this forces a design question that we probably we should have asked ourselves earlier but had no way of expressing in the in the language should these strings actually be null or not like is it part of the API to handle it they're null or is it not now sort of by default the feature is saying they're not they're not they want them to be null what if it what if it makes sense for middle names to be null actually you know it probably makes sense for all of these to be null but we're just going to do the middle name today you know symmetry exercise for the reader but I can put a question mark on string and it's now a nullable reference type which is the name of the feature as well I'm signaling that middle names can be string or null it can be they can actually be null the API and I absolve myself from having to make sure it's not null and I get no more warnings than the API here so now I've come clean with my API I've told the consumers what's null and what isn't and now if I go back to the program here as a consumer of the API I now get a warning saying hey this thing here you're referencing it even though now inferred to be of type string question mark because the middle name property returns string question mark, nullable string, okay? So we're propagating this potential nullness through the system and now I get a chance. So now the API is saying, hey, it's your problem to deal with nulls, but I'm also getting help from the language dealing with the nulls. I get advanced warning instead of luckily catching it maybe from an exception that gets thrown before I accidentally shipped to customers. So what can I do? Well, what are the usual things I would do about a null? I should just do the same things here. So if middle is null, this is how I would usually write it, return zero and what you see is that the warning goes away now. Actually, a little aside here, as of patterns in C-sharp seven, I prefer to say middle is null because that checks for null even when you've overwritten the equality operator which wouldn't necessarily work otherwise. So if the middle is null, return zero, otherwise return middle.length. Now the warning went away and that's because the compiler understands that if we get to this point in the code, at this point, middle will not be null. You just checked and if it was null, you went down a different branch. So that's doing essentially what we call a flow analysis, which is potentially pretty advanced. It will follow the different branches of your code and will track in all these different places where nulls may be and where they may not be. It's similar to definite assignment analysis which is already in the language, but again, tracking the state of a variable as you go through. Actually, it's a bit smarter than just tracking the locals and parameters here. If we go and sort of cut out the middle man, if you will, inline the temporary variable and we use person.middleName directly twice. You see that there's also no warning. If we remove the if here just to see, you get a warning on person.middleName potential being null, but if I check that property of that parameter, then we track the state of that as well. So we track chains of properties and fields. This is not actually entirely safe. If you think about it, if another thread is running, they could change the middle name between the test and the de-reference here, or I could call some innocuous looking method here that actually goes and changes the middle name behind the scenes or whatnot and the compiler can't see it. So this is a bit dangerous, but the way we think about the nullable feature is it gives you warnings, warnings are places where we warn you if we're pretty certain that you have a problem. There's a lot of existing code out there that looks like this, that works just like this. If we were to flag all of that with this feature, it would be impossible for you to upgrade your existing code to use a nullable feature. So we give you a pass on this probably safe thing, and there are a couple of other places where the feature isn't iron clad, it will let through things that could potentially be wrong and not give you warnings there. It's not a guarantee against null reference exceptions, it's just going to find you most of them. So that's good to know, but if you want to avoid that kind of situation, you can write code that's sort of correct by construction, you can try to do that. We had that local variable before, that's a good way of doing that. You can also use things like the question.operator, that not there, but here, that checks for null and only does the dereference if the thing wasn't null. Now, of course, we get an in question mark, but then we can use the null coalescing operator to take any nulls that come out of that and turn them into zero. So that's correct by construction in the sense that you only read the variable once, and you don't depend on its state remaining the same from check to consumption. If you go back to this version here, another couple of ways that you can be correct by construction, if we just go and, well, actually let's look at what happens if you also had a nullable person coming in. Now, we have two potentially nullable things. We could use the person question mark dot here in the condition, and that actually checks that the person is not null and the middle name is not null, and sure enough, you don't get any warnings down here, the compiler tracks that they're both not null, whereas if that check hadn't been there, both would have been a problem. There's actually two sets of squiggles on top here. So let's go and invert the condition here. I've got an invert if, and talk about what if I want to check that something isn't null rather than is null. So the new features that are added to pattern matching actually help a bit here. I don't have to write it like this with a not and a parenthesis here. Instead, there's a new pattern in town that I can use to check that something is not null, it looks like this. So it means is an object, is a thing, is something. So think about this as meaning something. That means that if that thing is something, then go down the true branch. So what's nice about that is we can actually name the something. So this optionally, you can give it a name and this pattern here, this something pattern. I don't actually call it that, but I'll get back to that in a second. We give the something a name that can be used in the true branch where it isn't null, and then we could say middle.length here. Again, we get no warnings because we are in the true branch. We could also go a step further. What this actually is is a degenerate form of a new pattern, recursive pattern called a property pattern. So a property pattern is one where you can drill, we check for null, but then you can drill down into properties of the object that we're currently matching on, and then we can apply further patterns at the next level down. So this string here has a length, and I could just use a var pattern to grab that length into a local variable, and I could actually just return that local variable. So just return the length, and now I don't need the middle anymore. So I'm using pattern matching here now to dig in in case everything is not null, I get the right thing out and return it. Of course, now I could easily turn this into a conditional expression, and it starts getting nice, and you can make it an expression body method as well. So you can play with this, but the off-shot is you can use these newfangled pattern-based methods of null checking if you want to, and these features interoperate very well, the pattern matching, the question.operator, and the null reference types. But if you just use the old-fashioned if, that's perfectly fine too, and we will check your code as best we can. So that's a core of the nullable reference types language feature. You get warnings when you put null into non-nullable reference types, you can then annotate things to become nullable reference types, and then you get warnings when you dereference those without a check, as in our code here. Now there are a couple of refinements that we've added to the feature we've found as we were annotating the core libraries, for instance, that there are places where you want to know better than the compiler or help the compiler a little bit. There's actually a feature that we used to call the Dammit operator but we're not allowed to. It's the bang, the PostFix exclamation mark here, which means I know better than what you think about this expression here. So you might think that middle is null, but I as a programmer know better, so just shut up with your warnings. I think we call it the null ignoring operator or something instead. It's not exclamation mark dot there, those aren't a single operator, the exclamation mark is its own operator. So you could just say, I know better. That would be really bad to do here and usually it's bad to do because usually you don't know better, you just think you do. So let's not use that one. But then there are ways in which certain helper methods for instance, they have special behavior around null that it will be really nice to communicate. So before when I said if something was a null here or something was null, I relied on the fact that the compiler could see that there was a null check. But what if that null check is inside of a helper method? For instance, what if we use string dot is null or empty? To check whether this string should just return zero as its length. Let's do that for a second. What we see is, well, we see that if string dot is null or empty. I should pass it an argument. Of course, if the middle name is not null or empty, return zero and what you see now is that the warning goes away. So somehow the compiler knows that this method, that when that method returns false, then the thing is not null. The way it knows it is that it's annotated with a special attribute. So we have a handful of attributes that signal special null behavior that you can put on members and parameters and so on. In this case, it's an attribute on the string question mark type to value parameter here that says that this thing is not null when the result of the method is false. There's a little set of like 10 of them you can read in the docs what they are. They can use to refine your APIs if they have special null behavior and we do that a lot around the core libraries where a lot of utility methods are. I think it's probably going to be less common in most other code actually. But here and there it's really useful to tweak the null ability behavior that the compiler sees in the public API. So those are a couple of ways of tweaking. Now, I mentioned a couple of times you know existing code and when you have a feature that when you turn it on for existing code, it lights up with all these warnings for potentially a large project for instance. It's not really feasible to convert it all over in one go. I think most people would find it a little daunting. You get like 10,000 warnings on a large project and go and fix them all. So you want to do a piecemeal and the way you can do a piecemeal is that you can actually turn the nullable feature on and off at a file level as well. So I can say nullable as a new directive in C-sharp. I can say nullable, disable, and now for the rest of this file, the nullable feature is disabled. Now, you can see I also get a warning on the question mark here because when I disable a feature, I don't get to use nullable reference types in my code. I could say, let's say that I wanted to, I wanted to annotate my library and give my consumers good nullable annotations, but I don't have the time to fix all the warnings that show up in my internal implementations of it. I could disable just the warnings and let's actually, let's introduce a, that's fine. I can disable the warnings and now the annotations are still allowed, but warnings are turned off. I can also, conversely, I could disable just annotations and now, I still get the warnings, but the public API is not affected. Of course, I can do this not just at the top of the file, I can do it anywhere in the file. Now, the warnings or the annotations rather are enabled until I get down here, and now after that, I'm no longer allowed to say put a question mark down. I start getting a warning for that. So this is a way that you can take chunks of file by file or even chunk by chunk of your files and get the nullable warnings and annotations handled for those bit by bit. You don't have to look at all the warnings at once. Speaking of adoption, I think that another feature, a feature that actually or a property of this feature that is a little reminiscent of when we did Async, is that in order to make use of the feature, to make good use of the feature as like an end user or an app writer or something like that, you really rely on the libraries that you have a dependency on to adopt this feature also, because if you interact with a library that didn't have the nullable feature on, then you won't get any warnings from interacting with that library. And only later when they do get around to adding these annotations, you start getting warnings maybe for any null on safe use you have of that library. And so there's a bit of sort of an ecosystem adoption thing where this language feature, it's useful in and of itself, but it certainly gets more and more useful. The more of the world starts adopting it. And so in order to talk about that, let's go back to slides quickly here. So essentially what we want to suggest, and this is of course is up to you out there, but we kind of want to suggest that if you're a library author, and that includes Microsoft by the way, as a big time library author, if you're a library author, maybe consider the time between now and .NET 5, which is slated for November of next year, treat that as the nullable adoption phase. This is the time where it would be a really good idea for you to adopt a null in your public API and the surface area that your clients consume. And then on the flip side, if you're a client of these APIs, expect there to be some churn in that period of time. So expect that you won't get nullable annotations from your favorite libraries tomorrow. It might be whenever it's natural for them next to ship a version, when they've had time to go through and do the work and roll out normally. So let's give everyone a breather and think about the next year and a bit as the nullable adoption phase where there will be some churn and if you adopt this as a client, you should be okay with your library sort of gradually coming online and therefore, warnings gradually may be popping up in your code. That might still be the best way for you to go. That's certainly how I will go. But if you don't want that churn, maybe wait until .NET 5 before you turn the nullable feature on as a client and then hopefully most of the ecosystem has settled and you get the finished nullable annotations for most of the libraries. And this goes for Microsoft as well. We haven't adopted these for all our libraries because we also kind of want to learn from the adoption phase and expand a knowledge just here and there. And it's also a lot of work just to go and update the entire .NET BCL. So we've updated the core libraries with nullable annotations but we actually consider them in preview a little bit that we will try to keep them stable but we will change if we did something wrong, if we thought about something wrong or just messed up, we want to reserve the right to fix those up until .NET 5. So that's just a way that we can kind of soften the blow of something that introduces new warnings and existing code and not making it a big sort of green squiggle jungle for everyone out there. I also, for library writers, a lot of library writers don't just target .NET Core 3.0, right? You want reach and you want to target .NET Stana 2.0 maybe so you can get .NET Framework and that broad set of things you can target that way. And so we're cognizant of that and what we recommend to do say if you're using Visual Studio is you know, multi-target between .NET Core 3.0 and .NET Stana 2.0. That means you can't turn on C-Sharp 8 in the UI of Visual Studio for instance because lots of C-Sharp 8 things won't work properly when you do that but if you consider yourself an expert, you can go and manually do it in the project file and that's probably the best way to go as you try to both, this should work just fine, that you try to both get the nullable annotations that are in .NET Core 3.0 and get the warnings for those but you also want to generate code that reaches all of .NET Stana 2.0. So this is how we recommend that you go. And if you want to check out more things, there are blog posts out there that have come out over the last couple of years around it and the docs are already excellent around nullable reference types. So here's a set of links that you can follow and get the docs. And with that, I want to turn it over to you out there and your questions and we've got five minutes, so shoot away. Yeah, so we've had a lot of buzz on Twitter. People are really excited about the nullable reference types. So how about, let's see, what's our first one? Oh, I had it picked out and then I, okay, let's see. Definitely doesn't look like the C-Sharp we're writing in 2001. People are pretty pumped about that. I hope that's a positive remark. So if we use, it is totally, the language is always going. So if we use nullable with older versions of .NET, will it throw an error or warning? Oh, that's right, I should click on it. So unless we update it to .NET 3, is that when the warning appears? The, you need to run C-Sharp 8. That's the only thing you really need for the nullable feature to work. Now, if you use .NET Core 3.0, then A, C-Sharp 8 is on by default in Visual Studio, and B, you get those annotations that I talked about in the core libraries, because those are only part of .NET Core 3. They aren't, they don't exist for the other versions of the framework, for older versions of the framework. But that, but you can still use the feature. And the only thing is, if you wanna use C-Sharp 8 against older things, then it's not supported, right? It's not something that you can just go and select from a menu in Visual Studio, because many other C-Sharp 8 language features will not work properly. But this is one that actually works pretty neatly downstream. So if you have the guts to go and turn it on manually in the project file, then we're not gonna stop you. All right, so you can use it with .NET Framework. That's correct. Sweet. All right, so that was part one of C-Sharp 8. I think we're ready for part two with Bill. I can hand it over to you now. All right, thank you very much, Kendra. Thank you, Mads. So, Mads talked primarily about nullable reference types, which we devoted an entire half hour to, because that's the one that is going to change how you code the most. It's gonna affect those warnings that he talked about. It's gonna affect the libraries that you use in terms of how we work with the code that you have. I get to talk about all the fun stuff. It's just things that you can adopt that will just make your life better. But they're not gonna introduce warnings as soon as you turn them on. So, there's a couple different themes that are really true about what was added in C-Sharp 8 outside of nullable reference types. We're gonna talk about it as being more modern and more productive. We're gonna increase your productivity and we're gonna add features that make it easier for you to work with modern development scenarios. Primarily those are cloud-based, device-based, programs that run across multiple machines. So, let's look quickly at that catalog of features and then we're gonna dive right into code. So, the ones that are gonna support these modern cloud scenarios. We're gonna be talking about async and numerables. We're gonna talk about more patterns in more places and how you can use pattern matching, which will do a lot more different things as we're combining applications.