Just wondering in the below function
public Dictionary<string, List<TrainingItem>> TrainingItems
{
set
{
trainingItems = SanitizeTrainingItems(value);
Results_Repeater.DataSource = trainingItems;
Results_Repeater.DataBind();
}
}
How does the value of (value) get past here and what is it. I mean there is no parameters to function but yet I am still passing a value in function I just don't understand where it comes from ?
A property in C# simulates a data member when in reality it's a set of accessor methods, specifically a get accessor and a set accessor (unless the property is read-only). In most cases, a property is used to read, write or compute the value of a private field.
A common use for a property would be:
private string _firstName;
public int FirstName
{
get { return _firstName; }
set { _firstName = value; }
}
The get and set blocks within the property definition represent the accessor method bodies that either read or write the value of _firstName. In the set accessor, value is a contextual keyword representing the parameter of the set_FirstName accessor method generated by the compiler.
Without properties, you would have to write these methods yourself, i.e., you'd have a public string getFirstName(); and a public void setFirstName(string value); and you would call each method accordingly. A C# property is just a shortcut and gives you an easy to use mechanism to invoke the correct accessor.
set accessor uses implicit parameter called value, whose type is the type of the property. In the following example, a set accessor is added to the TrainingItems property
When you assign a value to the property, the set accessor is invoked by using an argument that provides the new value.
See it here - http://msdn.microsoft.com/en-us/library/w86s7x04(v=vs.90).aspx
Related
IN VB.NET you can change the name of this variable. Can you do this in C# too or is it always called value?
Example:
Private _SomeVariable As String
Public Property SomeValue() As String
Get
Return _SomeVariable
End Get
Set(ByVal foo As String) ' This is what I mean
_SomeVariable = foo
End Set
End Property
I'm used to write code in VB.NET, but want to change to C# eventually and trying to learn all the differences and peculiarities of C#.
I know this is no big deal, but Telerik for example isn't aware of it while converting VB.NET to C#, which could lead to a missbehaviour in case you have a class variable named foo too (for the above-mentioned example).
The set parameter is always named value, and you cannot change it. If you happen to have a conflicting name in your code, you can use the fully-qualified name in order to use it:
class MyClass
{
private string value;
public string Value
{
get { return value; }
set { this.value = value; } // this.value is the private field
}
}
In C#, the new value is always accessed via value. There is no syntax to write a setter to accept a custom name.
See Using Properties (C# Programming Guide).
The set accessor resembles a method whose return type is void. It uses an implicit parameter called value, whose type is the type of the property ..
The value is keyword, so it cannot be changed
So it says that this:
public int HoursWorked { get; set; }
is the equivalent to...
private int hWorked;
public int HoursWorked
{
get
{
return hWorked;
}
set
{
hWorked = value;
}
}
I have two questions...
How does doing the easier command that simply calls "HoursWorked" bring "hWorked" into it?
I also don't fully understand what the value of the "value" is meant to be
Thanks for all the help!
First, some terminology:
HoursWorked is a property. hWorked is a field.
The first example is called an auto-implemented property. In that case, the compiler generates a private backing field that's invisible to you.
value is a C# language keyword. It is the value that's passed in when you set the property. You can't change it, only assign it. So if you assign HoursWorked = 10;, value is equal to 10.
In general, if you don't need any additional logic in to your property (for example, validation of allowed values), you should just use an auto-implemented property. It's cleaner, easier to read, and easier to maintain.
MSDN
Properties combine aspects of both fields and methods. To the user of
an object, a property appears to be a field, accessing the property
requires the same syntax. To the implementer of a class, a property is
one or two code blocks, representing a get accessor and/or a set
accessor. The code block for the get accessor is executed when the
property is read; the code block for the set accessor is executed when
the property is assigned a new value. A property without a set
accessor is considered read-only. A property without a get accessor is
considered write-only. A property that has both accessors is
read-write.
private int hWorked; // the name field. It will be used internally to hold to value.
public int HoursWorked // the Name property. User will use with object of class.
{
get
{
return hWorked;
}
set
{
hWorked = value; // "value" is the actual value (here int) which is assigned by user while accessing this property from somewhere in other class or same class.
}
}
So, HoursWorked is a property. hWorked is a field.
1. How does doing the easier command that simply calls "HoursWorked" bring "hWorked" into it?
It is called auto-implemented property and there is one invisible backing field generated by compiler.
2. I also don't fully understand what the value of the "value" is meant to be
"value" is the actual value (here int) which user assigns / sets. e.g.: user assigns HoursWorked = 50; then value = 50 as well.
check msdn for more details.
This question already has answers here:
Closed 10 years ago.
Possible Duplicate:
In C# what does this code with “get” mean?
I'm using open source project. In this project there is function.
public virtual ICollection<Customer> AffiliatedCustomers
{
get
{
return _affiliatedCustomers ?? (_affiliatedCustomers = new List<Customer>());
}
protected set { _affiliatedCustomers = value; }
}
I don't understand what is the meaning of "get".
Can you please explain this function.
AffiliatedCustomers is a property.
The get defines the property getter, which is a method used internally to return the value by the property. It allows you to use this given an instance of the class like so:
var customers = theClass.AffiliatedCustomers; // Looks like a field, but is a property
Properties can also have a set section, as well, as this one does (protected set { _affiliatedCustomers = value; }), which gives you control over what happens when you set the value via the Property.
For details, see Properties in C#.
This is not a function. It is a property. A property is basically a fancy wrapper for some variable. For example, declaring the following property:
public string SomeProperty { get; set; }
will actually compile to something like this:
private string backing_SomeProperty;
public void set_SomeProperty(string value)
{
backing_SomeProperty = value;
}
public int get_SomeProperty()
{
return backing_SomeProperty;
}
That's an example of an automatic property. Of course, you can also define the getter and setter methods yourself like this:
public string SomeProperty
{
get
{
// some logic code here
// then return some value
}
set
{
// some logic code here
// then set some value
}
}
This is a property,
Quoted by msdn:
Properties are members that provide a flexible mechanism to read, write, or compute the values of private fields. Properties can be used as though they are public data members, but they are actually special methods called accessors. This enables data to be accessed easily while still providing the safety and flexibility of methods.
Please refer to this link for more:
http://msdn.microsoft.com/en-us/library/x9fsa0sw(v=vs.80).aspx
Properties have a getter and a setter - their purpose is obvious (to get and set the value of the property).
When you use auto properties, there is still a get and a set, but the backing variable is automatically implemented for you. In the example you have given the author of the code has chosen to have their own implementation of the get - in this case to automatically initialise the member variable the first time the property is accessed.
I saw some get set method to set values. Can anyone tell me the purpose of this?
public string HTTP_USER_NAME
{
get
{
return UserName;
}
set
{
UserName = value;
}
}
public string HTTP_USER_PASSWORD
{
get
{
return UserPwd;
}
set
{
UserPwd = value;
}
}
Actually why use these things. For global access, or is there some other reason for this type of thing?
They are just accessors and mutators. That's how properties are implemented in C#
In C# 3 you can use auto-implemented properties like this:
public int MyProperty { get; set; }
This code is automatically translated by the compiler to code similar to the one you posted, with this code is easier to declare properties and they are ideal if you don't want to implement custom logic inside the set or get methods, you can even use a different accessor for the set method making the property immutable
public int MyProperty { get; private set; }
In the previous sample the MyProperty will be read only outside the class where it was declared, the only way to mutate it is by exposing a method to do it or just through the constructor of the class. This is useful when you want to control and make explicit the state change of your entity
When you want to add some logic to the properties then you need to write the properties manually implementing the get and set methods just like you posted:
Example implementing custom logic
private int myProperty;
public int MyProperty
{
get
{
return this.myProperty;
}
set
{
if(this.myProperty <=5)
throw new ArgumentOutOfRangeException("bad user");
this.myProperty = value;
}
}
It seems as though you understand the functionality of getters and setters, and others answered that question. "Normal" class variables (without getters and setters) are called "fields", and "properties" (which have the getters and setters) encapsulate fields.
The purpose of properties is to control outside access to fields. If you want a variable to be read-only to outside logic, you can omit the setters, like so:
private int dataID;
public int DataID {
get { return dataID; }
}
You can also make the setter private and achieve the same read-only functionality.
If an object has a chance of being null (for whatever reason), you can guarantee an instance always exists like this:
private Object instance;
public Object Instance {
get {
if (instance == null)
instance = new Object();
return instance;
}
}
Another use for properties is defining indexers.
//in class named DataSet
private List<int> members;
public int this[int index] {
get { return members[index]; }
}
With that indexer defined, you can access an instance of DataSet like this:
int member = dataSet[3];
Check these links,.. they gives clear explanation.
http://www.dotnetperls.com/property
http://code.anjanesh.net/2008/02/property-getters-setters.html
if UserName and UserPwd are class variables, better to use like this
_userName
_userPwd
Standard way to implement properties in C#. UserName and UserPwd are private member variables (string type) of the class where these 2 methods are defined.
HTTP_USER_NAME and HTTP_USER_PASSWORD are the public properties of your class. UserName and UserPwd could be your private field. And you are allowing other people to set or get the values via these public properties. No direct accesss to private propeties. Also you can do some logic inside the get method of the property.Ex : you will have a public property called Age and in the get method of that, you may read the value of your private field called "dateOfBirth" and do some calculation ( CurrentYear-dateOfBirth) and return that as the Age.
Properties are just accessors over fields. They allow to do certain operations (if needed), and provide controlled access to fields.
If you want to know when to use Properties, and when to use Only fields, Check the link Properties vs Fields – Why Does it Matter? (Jonathan Aneja)
From Properties (C# Programming Guide)
A property is a member that provides a flexible mechanism to read, write, or compute the value of a private field. Properties can be used as if they are public data members, but they are actually special methods called accessors. This enables data to be accessed easily and still helps promote the safety and flexibility of methods.
In this example, the TimePeriod class stores a time period. Internally the class stores the time in seconds, but a property named Hours enables a client to specify a time in hours. The accessors for the Hours property perform the conversion between hours and seconds.
Example
class TimePeriod
{
private double seconds;
public double Hours
{
get { return seconds / 3600; }
set { seconds = value * 3600; }
}
}
class Program
{
static void Main()
{
TimePeriod t = new TimePeriod();
// Assigning the Hours property causes the 'set' accessor to be called.
t.Hours = 24;
// Evaluating the Hours property causes the 'get' accessor to be called.
System.Console.WriteLine("Time in hours: " + t.Hours);
}
}
// Output: Time in hours: 24
Properties Overview
Properties enable a class to expose a public way of getting and setting values, while hiding implementation or verification code.
A get property accessor is used to return the property value, and a set accessor is used to assign a new value. These accessors can have different access levels. For more information, see Restricting Accessor Accessibility (C# Programming Guide).
The value keyword is used to define the value being assigned by the set accessor.
Properties that do not implement a set accessor are read only.
For simple properties that require no custom accessor code, consider the option of using auto-implemented properties. For more information, see Auto-Implemented Properties (C# Programming Guide).
why do we do this:
private string StatusText
{
set { toolStripStatusLabel1.Text = value; }
}
instead of just this?
private string StatusText
{
toolStripStatusLabel1.Text = value;
}
i do not understand the point of using set?
These are two completely different things.
This is a method:
private string StatusText()
{
toolStripStatusLabel1.Text = value;
}
which is called like this:
StatusText();
(and which will not compile, because the local variable value cannot be found). To make it work, you would need to write it like this:
private string StatusText(string value)
{
toolStripStatusLabel1.Text = value;
}
and call it like this:
StatusText("bla");
On the other hand, this is the definition of a property:
private string StatusText
{
set { toolStripStatusLabel1.Text = value; }
}
whose setter (hence the keyword set) is called like this:
StatusText = "bla";
Because there could also be a get:
get { return toolStripStatusLabel1.Text; }
Properties are syntactic sugar. When compiled you will have two methods get_[property name] and set_[property name]. If you only have the set method, only the set_[propety name] will be in the IL.
In a little more detail, since the OP has said she doesn't understand gets and sets:
The get and set keywords are used to define a "property". A property is a pair of methods - a "getter" and "setter" - that are used behind the scenes when the property is used or written to by other code. The advantage of a property over explicitly defining getter and setter methods is that you can use the property as if it were a "field" (a simple, publicly-visible member variable). The advantage of using a property instead of a field is that a property allows you to customize the behavior of assigning or using a variable. You can create "calculated fields" that are evaluated when needed based on other data in the object, or include basic validation or other business logic when reading or writing a value.
To define a property, you start by declaring it like you would a field, but then add a code block with get and set sub-blocks. You then define its read behavior in the get block, and the write behavior in the set block. You can choose to define only one accessor (making a "read-only" or "write-only" property), or you can define more limited visibility for one function or the other; for instance, you can make the getter public but the setter protected, so everyone can examine the property's value but only the class's other members and derived types can set its value.
The most common property implementation uses a "backing field", a private variable that acts as the store for the value exposed by the property. To streamline this implementation, .NET 3.0 included the concept of an "auto-property"; if you didn't define the code bodies of the getter and setter, the compiler would generate a basic implementation using a backing field.
First will not compile for value isn't valid unless you have set.
private string StatusText
{
toolStripStatusLabel1.Text = value;
}
Check out MSDN on Accessors here.
Setting and Getting fields and properties...
Example:
private string statusText;
public string StatusText
{
get { return this.statusText;}
set { this.statusText = value;
toolStripStatusLabel1.Text = this.statusText;
}
}
private String StatusText
{
get { ... }
set { ... }
}
The get/set tokens are to distinguish between the get and set accessors.
The latter wouldn't compile. The set part shows that it's the setter part of a property.
An alternative is to just write a method:
private void SetStatusText(string value)
{
toolStripStatusLabel1.Text = value;
}
To enable you to apply more complex logic, when the need will arise.