Csharp/CSharp Tutorial/Class/Properties
Содержание
- 1 Add Length property to MyArray
- 2 Add statement to the getter and setter of a property
- 3 A simple property example
- 4 Combine readonly and read only property
- 5 Define accessors for Properties with get and set
- 6 Do calculation with Property
- 7 Invoke Indexed Property Demo
- 8 Properties and its Restrictions
- 9 Property And its associated Field
- 10 Property Getter and Setter
- 11 Put logic to property setter
- 12 Readonly property
- 13 throw Exception from property setting
- 14 Use properties to set and get private members.
Add Length property to MyArray
<source lang="csharp">using System;
class MyArray {
int[] a; int len; public bool errflag; public MyArray(int size) { a = new int[size]; len = size; } public int Length { get { return len; } } public int this[int index] { get { if(indexCheck(index)) { errflag = false; return a[index]; } else { errflag = true; return 0; } } set { if(indexCheck(index)) { a[index] = value; errflag = false; } else errflag = true; } } private bool indexCheck(int index) { if(index >= 0 & index < Length) return true; return false; }
}
class MainClass {
public static void Main() { MyArray myArray = new MyArray(5); int x; for(int i=0; i < myArray.Length; i++) myArray[i] = i*10; for(int i=0; i < myArray.Length; i++) { x = myArray[i]; if(x != -1) Console.Write(x + " "); } Console.WriteLine(); }
}</source>
0 10 20 30 40
Add statement to the getter and setter of a property
<source lang="csharp">public class A {
private int myValue; public int MyValue { get { System.Console.WriteLine( "Getting myValue" ); return myValue; } set { System.Console.WriteLine( "Setting myValue" ); myValue = value; } }
} public class MainClass {
static void Main() { A obj = new A(); obj.MyValue = 1; System.Console.WriteLine( "obj.Value = {0}", obj.MyValue ); }
}</source>
Setting myValue Getting myValue obj.Value = 1
A simple property example
<source lang="csharp">using System;
class SimpProp {
int prop; public SimpProp() { prop = 0; } public int MyProp { get { return prop; } set { prop = value; } }
}
class MainClass {
public static void Main() { SimpProp ob = new SimpProp(); Console.WriteLine("Original value of ob.MyProp: " + ob.MyProp); ob.MyProp = 100; Console.WriteLine("Value of ob.MyProp: " + ob.MyProp); Console.WriteLine("Attempting to assign -10 to ob.MyProp"); ob.MyProp = -10; Console.WriteLine("Value of ob.MyProp: " + ob.MyProp); }
}</source>
Original value of ob.MyProp: 0 Value of ob.MyProp: 100 Attempting to assign -10 to ob.MyProp Value of ob.MyProp: -10
Combine readonly and read only property
<source lang="csharp">using System; public sealed class Value {
public int intValue = 10;
} public sealed class MyController {
public MyController( Value pimpl ) { this.pimpl = pimpl; } public int IntValue { get { return pimpl.intValue; } } private readonly Value pimpl;
} public sealed class MainClass {
static void Main() { Value someNumber = new Value( ); }
}</source>
Define accessors for Properties with get and set
<source lang="csharp">class MyClass {
private string name; public string Name { get { return name; } set { name = value; } }
}</source>
Do calculation with Property
<source lang="csharp">using System; public class SomeClass {
private int num; public SomeClass(int i) { num = i; } public int Num { get { return num; } set { num = value; } }
}
public class CompoundAssPropApp {
public static void Main(string[] args) { SomeClass sc = new SomeClass(42); Console.WriteLine("{0}", sc.Num); sc.Num = sc.Num + 5; Console.WriteLine("{0}", sc.Num); }
}</source>
Invoke Indexed Property Demo
<source lang="csharp">using System; using System.Reflection; using System.Globalization;
class Class1 { DateTime[] dateTimes = new DateTime[10]; public DateTime this[int index] { get{ return dateTimes[index]; } set{ dateTimes[index] = value;} } private DateTime dateOfBirth; public DateTime DateOfBirth { get{ return dateOfBirth; } set{ dateOfBirth = value; } } public void Test() { Console.WriteLine("Test method called"); } private string field; public string Property { get{ return field; } set{ field = value; } } }
class MainClass{ static void Main(string[] args) { Type type = typeof(Class1); Console.WriteLine(type.FullName); object o = Activator.CreateInstance(type); type.InvokeMember( "Item", BindingFlags.Instance | BindingFlags.SetProperty | BindingFlags.Public, null, o, new object[]{0, new DateTime(1966, 2, 12)}); Console.WriteLine(((Class1)o)[0].ToString()); } }</source>
Properties and its Restrictions
- A property consists of a name along with get and set accessors.
- The accessors are used to get and set the value of a variable.
The general form of a property is shown here:
<source lang="csharp">type propertyName {
get { // get accessor code } set { // set accessor code } }</source>
- A property cannot be passed as a ref or out parameter to a method.
- You cannot overload a property.
- A property should not alter the state of the underlying variable when the get accessor is called.
(Quote from C# The Complete Reference, Publisher: Osborne/McGraw-Hill, March 8, 2002, Language: English ISBN-10: 0072134852 ISBN-13: 978-0072134858)
Property And its associated Field
<source lang="csharp">using System;
class MyClass {
private int privateInnerValue = 10; public int MyValue { set { privateInnerValue = value; } get { return privateInnerValue; } }
} class MainClass {
static void Main() { MyClass c = new MyClass(); Console.WriteLine("MyValue: {0}", c.MyValue); c.MyValue = 20; Console.WriteLine("MyValue: {0}", c.MyValue); }
}</source>
MyValue: 10 MyValue: 20
Property Getter and Setter
<source lang="csharp">using System;
class Address {
protected string city; public string City { get { return city; } } protected string zipCode; public string ZipCode { get { return zipCode; } set { zipCode = value; city = "Atlanta"; } }
}
class PropertyApp {
public static void Main() { Address addr = new Address(); addr.ZipCode = "30338"; string zip = addr.ZipCode; Console.WriteLine("The city for ZIP code {0} is {1}", addr.ZipCode, addr.City); }
}</source>
Put logic to property setter
<source lang="csharp">using System; using System.Collections.Generic; using System.Text; class MainClass {
static void Main(string[] args) { Person person = new Person(); person.SetName("A", "B"); Console.WriteLine("The person"s full name is {0}",person.FullName); person.FullName = "A b c"; Console.WriteLine("The person"s full name is {0}",person.FullName); }
} class Person {
private string _lastname; private string _firstname; public void SetName(string lastname, string firstname) { _lastname = lastname; _firstname = firstname; } public string FullName { get { return _firstname + " " + _lastname; } set { string[] names = value.Split(new string[] { " " },StringSplitOptions.RemoveEmptyEntries); _firstname = names[0]; _lastname = names[names.Length - 1]; } }
}</source>
The person"s full name is B A The person"s full name is A c
Readonly property
<source lang="csharp">using System; class MyClass {
public double A = 3; public double B = 4; public double MyValue { get { return A * B ; } }
} class MainClass {
static void Main() { MyClass c = new MyClass(); Console.WriteLine("MyValue: {0}", c.MyValue); }
}</source>
MyValue: 12
throw Exception from property setting
<source lang="csharp">using System; using System.Collections.Generic; using System.Linq; using System.Text;
public class MyClass { public readonly string Name; private int intVal; public int Val { get { return intVal; } set { if (value >= 0 && value <= 10) intVal = value; else throw (new ArgumentOutOfRangeException("Val", value,"Val must be assigned a value between 0 and 10.")); } } public override string ToString() { return "Name: " + Name + "\nVal: " + Val; } private MyClass() : this("Default Name") { } public MyClass(string newName) { Name = newName; intVal = 0; } } class Program { static void Main(string[] args) { MyClass myObj = new MyClass("My Object"); Console.WriteLine("myObj created."); for (int i = -1; i <= 0; i++) { try { myObj.Val = i; } catch (Exception e) { Console.WriteLine("Exception {0} thrown.", e.GetType().FullName); Console.WriteLine("Message:\n\"{0}\"", e.Message); } } } }</source>
Use properties to set and get private members.
<source lang="csharp">using System;
class Shape {
double pri_width; // now private double pri_height; // now private // Properties for width and height. public double width { get { return pri_width; } set { pri_width = value; } } public double height { get { return pri_height; } set { pri_height = value; } } public void showDim() { Console.WriteLine("Width and height are " + width + " and " + height); }
}
class Triangle : Shape {
public string style; // style of triangle public double area() { return width * height / 2; } public void showStyle() { Console.WriteLine("Triangle is " + style); }
}
class MainClass {
public static void Main() { Triangle t1 = new Triangle(); Triangle t2 = new Triangle(); t1.width = 4.0; t1.height = 4.0; t1.style = "isosceles"; t2.width = 8.0; t2.height = 12.0; t2.style = "right"; Console.WriteLine("Info for t1: "); t1.showStyle(); t1.showDim(); Console.WriteLine("Area is " + t1.area()); Console.WriteLine(); Console.WriteLine("Info for t2: "); t2.showStyle(); t2.showDim(); Console.WriteLine("Area is " + t2.area()); }
}</source>
Info for t1: Triangle is isosceles Width and height are 4 and 4 Area is 8 Info for t2: Triangle is right Width and height are 8 and 12 Area is 48