C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML
Number: This is an int property. Number provides get { } and set { } implementations.
Get: The get { } implementation must include a return statement. It can access any member on the class.
Set: The set { } implementation receives the implicit argument "value." This is the value to which the property is assigned.
ValueC# program that uses public int property
using System;
class Example
{
int _number;
public int Number
{
get
{
return this._number;
}
set
{
this._number = value;
}
}
}
class Program
{
static void Main()
{
Example example = new Example();
example.Number = 5; // set { }
Console.WriteLine(example.Number); // get { }
}
}
Output
5
Types: Like a method, a property can act on any type, even enum types like DayOfWeek. Many properties will use string or int.
C# program that uses enum property
using System;
class Example
{
DayOfWeek _day;
public DayOfWeek Day
{
get
{
// We don't allow this to be used on Friday.
if (this._day == DayOfWeek.Friday)
{
throw new Exception("Invalid access");
}
return this._day;
}
set
{
this._day = value;
}
}
}
class Program
{
static void Main()
{
Example example = new Example();
example.Day = DayOfWeek.Monday;
Console.WriteLine(example.Day == DayOfWeek.Monday);
}
}
Output
True
Then: We can only get the property in the Program.Main method by using an Example instance.
C# program that uses private setter in property
using System;
class Example
{
public Example()
{
// Set the private property.
this.IsFound = true;
}
bool _found;
public bool IsFound
{
get
{
return this._found;
}
private set
{
// Can only be called in this class.
this._found = value;
}
}
}
class Program
{
static void Main()
{
Example example = new Example();
Console.WriteLine(example.IsFound);
}
}
Output
True
Private: The Display method in the example shows how to use the private property.
Note: This syntax is less useful in most programs. But it exists, and may be helpful in a complex class.
ClassC# program that uses private property
using System;
class Example
{
int _id;
private int Id
{
get
{
return this._id;
}
set
{
this._id = value;
}
}
public void Display()
{
// Access the private property in this method.
this.Id = 7;
Console.WriteLine(this.Id);
}
}
class Program
{
static void Main()
{
Example example = new Example();
example.Display();
}
}
Output
7
Count: This property has a side effect. It causes the field to be incremented upon each access.
Caution: Side effects are not usually a good design feature in programs. They can make the logic hard to follow.
Setter: This is omitted. This makes sense for a property that computes a value entirely in memory, or based on other fields or properties.
C# program that uses static property
using System;
class Example
{
static int _count;
public static int Count
{
get
{
// Side effect of this property.
_count++;
return _count;
}
}
}
class Program
{
static void Main()
{
Console.WriteLine(Example.Count);
Console.WriteLine(Example.Count);
Console.WriteLine(Example.Count);
}
}
Output
1
2
3
Expression: The *= operator is used to multiply the property by itself. This is the same as "example.Number = example.Number * 4".
Tip: Because properties are meant to look like fields, this is allowed. Obviously methods are not allowed to do this.
C# program that uses automatically implemented property
using System;
class Example
{
public int Number
{
get;
set;
}
}
class Program
{
static void Main()
{
Example example = new Example();
example.Number = 8;
example.Number *= 4;
Console.WriteLine(example.Number);
}
}
Output
32
Note: The error reported by the C# compiler reads: "Automatically implemented properties must define both get and set accessors."
C# program that uses private setter, auto property
using System;
class Example
{
public Example()
{
// Use private setter in the constructor.
this.Id = new Random().Next();
}
public int Id
{
get;
private set;
}
}
class Program
{
static void Main()
{
Example example = new Example();
Console.WriteLine(example.Id);
}
}
Output
2077325073
C# program that uses default value
using System;
class Medication
{
public int Quantity { get; set; } = 30; // Has default value.
}
class Program
{
static void Main()
{
Medication med = new Medication();
// The quantity is by default 30.
Console.WriteLine(med.Quantity);
// We can change the quantity.
med.Quantity *= 2;
Console.WriteLine(med.Quantity);
}
}
Output
30
60
C# program that uses expression-bodied properties
class Program
{
private static int test;
public static int Test { get => test; set => test = value; }
static void Main()
{
// Use the property.
Program.Test = 200;
System.Console.WriteLine(Program.Test);
}
}
Output
200
Version 1: This code uses a property. It sets a property, and then gets the value of the property.
Version 2: This version of the code uses a field directly. It performs the same logical steps that version 1 does.
Result: There was no difference in performance with the property and the field. It is apparent the property access is inlined.
Tip: The JIT compiler can inline properties that don't have logic inside of them. So they are as efficient as fields.
C# program that benchmarks properties
using System;
using System.Diagnostics;
class Program
{
static string _backing; // Backing store for property.
static string Property // Getter and setter.
{
get
{
return _backing;
}
set
{
_backing = value;
}
}
static string Field; // Static field.
static void Main()
{
const int m = 100000000;
for (int x = 0; x < 10; x++) // Ten tests.
{
Stopwatch s1 = new Stopwatch();
s1.Start();
// Version 1: test property.
for (int i = 0; i < m; i++)
{
Property = "string";
if (Property == "cat")
{
}
}
s1.Stop();
Stopwatch s2 = new Stopwatch();
s2.Start();
// Version 2: test field.
for (int i = 0; i < m; i++)
{
Field = "string";
if (Field == "cat")
{
}
}
s2.Stop();
Console.WriteLine("{0},{1}",
s1.ElapsedMilliseconds,
s2.ElapsedMilliseconds);
}
Console.Read();
}
}
Output
Property get/set: 604.6 ms
Field read/assign: 603.6 ms
Instead: A property is just a method. It has special syntax that looks more like a field.
Quote: Unlike fields, properties do not denote storage locations. Instead, properties have accessors that specify the statements to be executed when their values are read or written (The C# Programming Language).
Then: Change the fields as needed. We get an automatically implemented property.
Snippets