 Okay, now let's finally look at real C sharp syntax. We have here a class snake, which is inheriting from class reptile, and implementing an interface called I something. We could have other interfaces that we implement. We just add more commas and list more interface names. But when we're inheriting from a class and implementing interfaces, the class we're inheriting from always comes first, because we can implement multiple interfaces, but only ever inherit from one class. And note that the contents of the class are enclosed in curly braces. And in fact, C sharp is a free form syntax, meaning that white space is basically ignored by the language. So in fact, if I would just like, move this up onto this line, that's still valid code. The compiler is not actually looking really at the new lines of our code to discern what's what. So here when we create fields, well first note that we're putting the type first. Also the built in type names are not uppercase, the float type is written lowercase floats strings written string, integers written int, and static fields are preceded with the word static. And every field has to end in a semicolon. Because again, white space isn't supposed to matter. If I want to put another field up here in why this is totally valid, there's no rule about having just one field or one thing on any line. Though of course, this is the usual style. So I'll just stick with the convention and put one field on one line. Anyway, here's our first method, just like there's no reserved word field that we used to denote our fields, there's no word method to denote our methods. It's just you start with some type, which is the return type before the name of the method. Here the name is foo. And then all the parameters are inside parenz, separated by commas. So here the first parameter is an int called a, and the second parameter is a boolean called b. The body of a method is surrounded in curly braces. And a variable declaration statement doesn't have the reserved word var, you just put the name of the type and the name of the variable. And that is a declaration statement. The compiler recognizes that a line starting with a type must be a variable declaration statement. So this is declaring variable i of type int. We have an if and note that conditions are always inside parentheses. This is not a method call or an operation. This is just the boolean value b, which is our condition. And then the body of the if is in its own pair of curly braces. And in the if we are assigning a to i, that's what the equal sign is. It's the assignment operator. This is an assignment statement. And then in the else clause, we're assigning to i the value of snakes static field x. And the way we access the static field is by putting the class name dot and then the name of the field. Lastly, in the method, we have a return statement returning the value of i. And note that our declaration statements, our assignment statements, and our return statements end in semicolons. That's the case with all kinds of statements except for if statements and loop statements where the body is enclosed in curly braces. Otherwise, the statement always ends in a semicolon. Our second method down here bar returns nothing. And the way that's denoted is with the reserved word void, which is not a real type, it just denotes, hey, this is a method returning nothing. And then here, because the prints are empty, that means this method takes no arguments. It has no parameters. And then first statement inside, we're calling the method foo with the instance this, passing to the parameters to string high and the Boolean value false. This is how we were denoting the method call, but this is the actual syntax. The instance argument actually precedes the name of the method followed by dot. And then we put prints after the name of the method with the other arguments inside separated by commas. The other call here is calling static method act of snake. And so you write the class name dot and then the name of the static method. Act takes no arguments. So we just have a pair of empty prints here. And down here, we have the actual definition of act. It's a static method returning nothing. And it has no parameters. Inside we're declaring a variable s of type snake. We could make this his own standalone statement and then assign to s on the next line, but as a convenience, you can just initialize your declared variables in the same line. So in the declaration, we're assigning to s a new snake. This is the new operator. This is the name of the type we're creating and you put friends after because we're calling in this case, we're calling the default constructor, which the snake class as this class has no explosive constructors. So just as a default constructor, if I had other constructors and we needed to pass in arguments, they would go inside the prints just like when we're calling a method. Finally, down here with our snake instance s, we're calling the foo method passing in the name of s, which at the moment will just be null, but this is still valid. We can pass null to a parameter and we're passing false. So the equivalent expressed in our syntax looked like this. You had the name of the method, the instance, and then to access name of s, we use the get operator, which in actual C sharp is just a dot and then false. So that covers actually most of the core syntax differences. But looking down here, say we have a class cat with fields name, age and weight. And we want to create properties for accessing each of these fields. The syntax for that looks like a field declaration, except you put curly braces after and by convention properties usually have an uppercase name. So for the field age, for example, the field itself, we give a lowercase letter, and then it's corresponding property, we give an uppercase letter, that is the convention. So anyway, this name property, for the getter, we write get and then in curly braces, the actual code of the getter in this case, just returning the name field of this. And then for the setter, we write set, and then the body, which is assigned to this dot name, the value. So in fact, there really is no set operator in actual C sharp, you don't write set this name value or anything like it. It's considered to be a kind of assignment when you're setting the values of fields. The target of the assignment is not a variable. It's a field of this instance. And this is what we're assigning to it. And remember that the name value inside a setter is special. It's not really a reserved word, but it is a special name inside setters. Anyway, that's how we write a property. And remember the code in here doesn't have to be this bare bones and straightforward, we can do whatever we want in these getters and setters. Just in this case, we're doing a straight bare bones getter and setter. And because creating properties with plain getters and setters is common enough, there's a shorthand for this, down here for property age, we just write get semicolon and set semicolon and implicitly, these are equivalent to what you see here. And again, because C sharp syntax is freeform, we don't actually have to put the stuff on separate lines, we can combine that into one line, or just move it up into one line, and that's the most compact way to do it. So in fact, this is probably what you'll see most commonly when a property is written with just plain get and set. Lastly, in this class, we have a constructor, and that's denoted simply by a method that has no return type, and has the same name as the class itself. That's how we denote a constructor. And then you put parens with the parameters inside, separated by commas. And so this constructor here simply takes the parameters name, weight and age, and assigns them to the corresponding fields. As for arrays, say we're in some method here, we create an interay variable nums, and assign a new interay of size nine. And then to store values in the array, much like when we store values in fields, we do so with an assignment where the target specifies the array, and then index inside square brackets. So this is storing 77 at index zero of nums, and this is storing negative 46 at index five of nums. And then to access the values, same syntax just not as the target of assignment. So this is equivalent of get nums three. Now, as for operations, in pigeon syntax, we use prefix notation, and all of our operators have word names. But in C sharp, like in really all mainstream programming languages, the notation style is infix, meaning most operators take two operands and go in between their two operands. And the operators are denoted by symbols. So it's plus sign for addition minus sign for subtraction, asterisk for multiplication, forward slash forward division, two equals signs for an equality test, not to be confused with equal sign used for assignment, exclamation equals sign for not a quality test, a greater than sign for a greater than test, of course, and less than for less than less than followed by equal signs for less than or equals greater than followed by equal science for greater than or equals, the not operator is an exclamation mark. And it's a unary operator, meaning it just has one operand and usual style is to not put a space between the operator and its operand. But we can put as much space here as we like. That's not a requirement. That's just conventional style. And then lastly, we have the end operator, which is two ampersands, and the or operator, which is two pipe symbols. Be clear, this is not an L or one. It's the pipe symbol. And on most American keyboards, it's on the same key as the backslash symbol. So those are the operators. And very last thing, if we want to create a generic class, we use angle brackets after the class name, we specify the type parameters, but we separate them by commas. So here the two type parameters are just simply called t and u, which is a common convention for type parameters often just to use these generic single loader names. And then here in the class, we're using these types, like we would any other type here declaring a field thing of type t and another field other thing of type u. And then in the static method, we're declaring a variable D here, I'll actually separate this into a separate statement, we're creating a variable D of type dog, where int is plugged in for t, and float is plugged in for you. And so when we assign to D, we have to instantiate a dog with those same types plugged in for T and u. So now D is referencing a dog, where the thing field is of type int, and the other thing field is of type float. And so if we assign to D dot thing, again, this is what we wrote as a set operation, we wrote set D thing five, this is the equivalent, but it's written as an assignment and actual C sharp. And here because the thing field of D is supposed to be an int, this is a valid assignment. And then when we assign the other thing of D, that's supposed to be a float. So we're assigning here 3.7. And for a float number, notice, you have to suffix it with an F. Otherwise, the compiler will assume that this is a double value, not a float. A double is like a float. It's also a floating point number. It just has 64 bits, whereas a float in C sharp only has 32 bits. So the double number type can represent more precise values and can represent values of larger magnitude. Anyway, so without the F here, this is a double value and we need it to be a float. So we put an F there.