代码改变世界

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

  狼人:-)  阅读(183)  评论(0编辑  收藏  举报

  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的简单介绍。

编辑推荐:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
点击右上角即可分享
微信分享提示