C# get set不提倡将域的保护级别设为 public而使用户在类外任意操作--那样太不OO,或者具体点说太不安全!对所有有必要在类外可见的域,C#推荐采用属性来表达。属性不表示存储位置,这是属性和域的根本性的区别。下面是一个典型的属性设计:
1 using System;
2 class Demo
3 {
4 int integer;
5 public int Integer
6 {
7 get {return integer;}
8 set {integer=value;}
9 }
10 }
11 class Test
12 {
13 public static void Main()
14 {
15 Demo test =new Demo();
16 Console.Write(test .Integer);
17 test .Integer++;
18 Console.Write(test .Integer);
19 }
20 }
属性提供了只读(get),只写(set),读写(get和 set)三种接口操作。对域的这三种操作,我们必须在同一个属性名下声明,而不可以将它们分离,看下面的实现:
class Demo
{
private string name;
public string Name
{
get
{
return name;
}
}
public string Name
{
set { name = value; }
}
}
上面这种分离Name属性实现的方法是错误的!我们应该像前面的例子一样将他们放在一起。值得注意的是三种属性(只读,只写,读写)被C# get set认为是同一个属性名,看下面的例子:
class Demo
{
protected int num=0;
public int Num
{
set
{
num=value;
}
}
}
class Demo: Demo
{
new public int Num
{
get
{
return num;
}
}
}
class Test
{
public static void Main()
{
Demo Test = new Demo();
//Test .Num= 1; //错误 !
((Demo )Test ).Num = 1;
}
}
virtual, sealed, override, abstract等修饰符对属性与方法同样的行为
abstract class A
{
int y;
public virtual int X
{
get
{ return 0; }
}
public virtual int Y
{
get { return y; }
set { y = value; }
}
public abstract int Z { get; set; }
}
class B: A
{
int z;
public override int X
{
get { return base.X + 1; }
}
public override int Y
{
set
{
base.Y = value < 0? 0: value;
}
}
public override int Z
{
get
{
return z;
}
set
{
z = value;
}
}
}
C# get set 详细 讲解