艾伟_转载:经典讲解C# get set

简介:   C# get set函数很常用,但是用好还是需要很多经验的,下面的文章就是帮你积累C# get set函数经验的。  C# get set不提倡将域的保护级别设为 public而使用户在类外任意操作--那样太不OO,或者具体点说太不安全!对所有有必要在类外可见的域,C#推荐采用属性来表达。

  C# get set函数很常用,但是用好还是需要很多经验的,下面的文章就是帮你积累C# get set函数经验的。

  C# get set不提倡将域的保护级别设为 public而使用户在类外任意操作--那样太不OO,或者具体点说太不安全!对所有有必要在类外可见的域,C#推荐采用属性来表达。属性不表示存储位置,这是属性和域的根本性的区别。下面是一个典型的属性设计:

  using System;  
class MyClass
{
int integer;
public int Integer
{
get {return integer;}
set {integer=value;}
}
}
class Test
{
public static void Main()
{
MyClass MyObject
=new MyClass();
Console.Write(MyObject.Integer);
MyObject.Integer
++;
Console.Write(MyObject.Integer);
}
}

  一如我们期待的那样,程序输出0 1。我们可以看到属性通过对方法的包装向程序员提供了一个友好的域成员的存取界面。这里的value是C# get set的关键字,是我们进行属性操作时的set的隐含参数,也就是我们在执行属性写操作时的右值。

  属性提供了只读(get),只写(set),读写(get和 set)三种接口操作。对域的这三种操作,我们必须在同一个属性名下声明,而不可以将它们分离,看下面的实现:

  class MyClass  
{
private string name;
public string Name
{
get
{
return name;
}
}
public string Name
{
set { name = value; }
}
}

  上面这种分离Name属性实现的方法是错误的!我们应该像前面的例子一样将他们放在一起。值得注意的是三种属性(只读,只写,读写)被C# get set认为是同一个属性名,看下面的例子:

  class MyClass  
{
protected int num=0;
public int Num
{
set
{
num
=value;
}
}
}
class MyClassDerived: MyClass
{
new public int Num
{
get
{
return num;
}
}
}
class Test
{
public static void Main()
{
MyClassDerived MyObject
= new MyClassDerived();
//MyObject.Num= 1; //错误 !
((MyClass)MyObject).Num = 1;
}
}
由于属性的方法的本质,属性当然也有方法的种种修饰。属性也有5种存取修饰符,但属性的存取修饰往往为public,否则我们也就失去了属性作为类的公共接口的意义。除了方法的多参数带来的方法重载等特性属性不具备外, 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;
}
}
}

  这个例子集中地展示了属性在继承上下文中的某些典型行为。这里,类A由于抽象属性Z的存在而必须声明为abstract。子类B中通过base关键字来引用父类A的属性。类B中可以只通过Y-set便覆盖了类A中的虚属性。

  静态属性和静态方法一样只能存取类的静态域变量。我们也可以像做外部方法那样,声明外部属性。以上就是对C# get set的简单介绍。

目录
相关文章
|
9月前
|
C#
C#属性的get与set
C#属性的get与set
|
9月前
|
C#
对C#中set{} get{}的一点理解
对C#中set{} get{}的一点理解
C#——set和get
在面向对象编程(OOP)中,要求把是不允许外界直接对类的成员变量直接访问的,既然不能访问,那定义这些成员变量还有什么意义呢?所以C#中就要用set和get方法来访问私有成员变量,它们相当于外界访问对象的一个通道,一个“接口”。先来看一段代码:
C#——set和get
|
C#
c# 多显示器设置主屏幕(Set primary screen for multiple monitors)
原文 http://www.cnblogs.com/coolkiss/archive/2013/09/18/3328854.html 经过google加各种百度,终于找到了一个有效的解决方案,下面是两个主要类,方便后人使用   1.
1190 0
|
Java C#
C#和JAVA GET,SET对比
转自博客:http://www.cnblogs.com/Handos/archive/2012/08/18/2645721.html 使用GET,SET方法的好处: 隐藏内部成员,但又想外部能够以某 种正确的方式来访问和修改内部成员的属性, 因此通过构造GET,SET访问器来控制访问成员,确保数据的一致,完整和正确性。
923 0
|
1月前
|
C#
24. C# 编程:用户设定敌人初始血值的实现
24. C# 编程:用户设定敌人初始血值的实现
19 0
|
2月前
|
SQL 数据库连接 应用服务中间件
C#WinForm基础编程(三)
C#WinForm基础编程
73 0
|
2月前
C#WinForm基础编程(二)
C#WinForm基础编程
55 0
|
2月前
|
C# 数据安全/隐私保护
C#WinForm基础编程(一)
C#WinForm基础编程
60 0