You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
234 lines
4.2 KiB
Markdown
234 lines
4.2 KiB
Markdown
# Static Members, Methods and Classes
|
|
|
|

|
|
|
|
---
|
|
|
|
# Static Members
|
|
|
|
So far, we have used __non-static__ fields in our classes
|
|
|
|
This means, that each instance of the class holds its own version of the field, and changing the value of it only affects that instance:
|
|
|
|
class MyAwesomeClass
|
|
|
|
{
|
|
|
|
public int MyProperty { get; set; }
|
|
|
|
}
|
|
|
|
class Program
|
|
|
|
{
|
|
|
|
static void Main(string[] args)
|
|
|
|
{
|
|
|
|
MyAwesomeClass instance1 = new MyAwesomeClass();
|
|
|
|
MyAwesomeClass instance2 = new MyAwesomeClass();
|
|
|
|
instance1.MyProperty = 100;
|
|
|
|
instance2.MyProperty = 200; // instance1.MyProperty is still 100
|
|
|
|
}
|
|
|
|
}
|
|
|
|
# Static Members (continued)
|
|
|
|
Likewise, non-static class methods _have to _ be called through an instance:
|
|
|
|
class MyAwesomeClass
|
|
|
|
{
|
|
|
|
public void PrintText(string text) { Console.WriteLine(text); }
|
|
|
|
}
|
|
|
|
class Program
|
|
|
|
{
|
|
|
|
static void Main(string[] args)
|
|
|
|
{
|
|
|
|
MyAwesomeClass instance = new MyAwesomeClass();
|
|
|
|
instance.PrintText("Hello World"); // Outputs "Hello World"
|
|
|
|
MyAwesomeClass.PrintText("Hello World"); // Results in an error
|
|
|
|
}
|
|
|
|
}
|
|
|
|

|
|
|
|
__Static fields are shared between all instances of a class__
|
|
|
|
Let's declare "MyProperty" property with the __static __ keyword. Now it can be referenced through the class type name, but not through the instance, as shown below:
|
|
|
|
class MyAwesomeClass
|
|
|
|
{
|
|
|
|
public static int MyProperty { get; set; } = 100;
|
|
|
|
}
|
|
|
|
class Program
|
|
|
|
{
|
|
|
|
static void Main(string[] args)
|
|
|
|
{
|
|
|
|
MyAwesomeClass instance = new MyAwesomeClass();
|
|
|
|
Console.WriteLine(MyAwesomeClass.MyProperty); // Outputs "100"
|
|
|
|
Console.WriteLine(instance.MyProperty); // Results in an error
|
|
|
|
}
|
|
|
|
}
|
|
|
|

|
|
|
|
# Static Members - Example
|
|
|
|
In this example, a static field is used for keeping count on how many times the class has been instantiated:
|
|
|
|
class Person
|
|
|
|
{
|
|
|
|
public static int totalPersons = 0;
|
|
|
|
private string name;
|
|
|
|
public Person(string personName) // Person Constructor
|
|
|
|
{
|
|
|
|
name = personName;
|
|
|
|
++totalPersons;
|
|
|
|
}
|
|
|
|
public void PrintInfo()
|
|
|
|
{
|
|
|
|
Console.WriteLine("This person is called " + name + ".");
|
|
|
|
Console.WriteLine("There are " + totalPersons + " persons total.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
# Static Members - Example (continued)
|
|
|
|
Now let's instantiate a couple of persons and print their info:
|
|
|
|
class Program
|
|
|
|
{
|
|
|
|
static void Main(string[] args)
|
|
|
|
{
|
|
|
|
Person steve = new Person("Steve");
|
|
|
|
Person wendy = new Person("Wendy");
|
|
|
|
steve.PrintInfo();
|
|
|
|
wendy.PrintInfo();
|
|
|
|
}
|
|
|
|
}
|
|
|
|

|
|
|
|
# Static Methods
|
|
|
|
Methods can also be static
|
|
|
|
What happens when you try to call a non-static method from a static method?
|
|
|
|
class Program
|
|
|
|
{
|
|
|
|
void PrintHelloName(string name)
|
|
|
|
{
|
|
|
|
Console.WriteLine("Hello, " + name);
|
|
|
|
}
|
|
|
|
static void Main(string[] args)
|
|
|
|
{
|
|
|
|
PrintHelloName(); // Will throw an error
|
|
|
|
}
|
|
|
|
}
|
|
|
|

|
|
|
|
---
|
|
|
|
This is why until this point all example methods have been inside of the main function
|
|
|
|
# Static Classes
|
|
|
|
* Classes can also be made static
|
|
* Static classes cannot be instantiated
|
|
* All members of a static class also have to be static
|
|
* static class Styling
|
|
* {
|
|
* public static string fontFamily = "Verdana";
|
|
* public static float fontSize = 12.5f;
|
|
* }
|
|
* class Program
|
|
* {
|
|
* static void Main(string[] args)
|
|
* {
|
|
* Console.WriteLine
|
|
* ("Using font " + Styling.fontFamily + " " + Styling.fontSize + "px");
|
|
* // Outputs "Using font Verdana 12.5px"
|
|
* Styling = new Styling(); // Results in an error
|
|
* }
|
|
* }
|
|
|
|
# Exercise 1
|
|
|
|
Create a class Message which has two __static __ properties int TotalMessages and string LastMessage, and a __non-static __ property string MessageText.
|
|
|
|
Add a constructor which takes a string message as a parameter, increases TotalMessages by one and sets the value of LastMessage to message which is the parameter
|
|
|
|
Create a main loop which keeps asking the user for a new message. A new Message instance is then created with the user input message as an argument:
|
|
|
|
Message newMessage = new Message(message);
|
|
|
|
newMessage is then added to a list of messages, allMessages
|
|
|
|
Finally the static values Message.TotalMessages and Message.LastMessage are printed
|
|
|