Properties look like fields from the outside, but internally they contain logic.
A property is declared like a field, but with a get
/set
block added.
Here's how to implement CurrentPrice
as a property:
public class Product {
decimal currentPrice; // The private "backing" field
// w w w .j av a 2 s .c om
public decimal CurrentPrice // The public property
{
get {
return currentPrice;
}
set {
currentPrice = value;
}
}
}
get
and set
are property accessors.
The get
accessor runs when the property is read.
It must return a value of the property's type.
The set
accessor runs when the
property is assigned.
It has an implicit parameter named value
of the property's type
that you typically assign to a private field.
We can write code for properties to control getting and setting its value.
Properties allow the following modifiers:
Item | Modifier |
---|---|
Static modifier | static |
Access modifiers | public internal private protected |
Inheritance modifiers | new virtual abstract override sealed |
Unmanaged code modifiers | unsafe extern |
A property is read-only if it specifies only a get accessor.
A property is write-only if it specifies only a set accessor.
A property typically has a dedicated backing field to store the underlying data.
However, a property can also be computed from other data. For example:
decimal currentPrice, sharesOwned;
public decimal Worth {
get { return currentPrice * sharesOwned; }
}
An automatic property declaration instructs the compiler to provide the implementation.
We can redeclare the first example in this section as follows:
public class Product
{
public decimal CurrentPrice { get; set; }
}
The compiler automatically generates a private backing field of a compiler-generated name that cannot be referred to.
The set
accessor can be marked private
if you want
to expose the property as read-only to other types.
The get and set accessors can have different access levels.
public class Product {
private decimal x;
public decimal X{
get { //from w w w . jav a 2s .c om
return x;
}
private set {
x = Math.Round (value, 2);
}
}
}