艾伟_转载:经典讲解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的简单介绍。

目录
相关文章
|
1月前
|
缓存 监控 Java
ThreadLocal 源码解析get(),set(), remove()用不好容易内存泄漏
ThreadLocal 源码解析get(),set(), remove()用不好容易内存泄漏
49 1
|
1月前
|
网络协议 API C#
C# 中模拟 POST 和 GET 请求的原理与实践
【1月更文挑战第4天】在现代网络应用中,HTTP请求是客户端与服务器交互的基础。其中,GET和POST是最常用的两种请求方法。本文将介绍如何使用C#语言模拟这两种请求,并解释其背后的工作原理。我们将利用.NET框架中的HttpClient类来发送请求,并处理服务器的响应。通过本文,读者将能够理解HTTP请求的基本构成,学会在C#中编写代码来模拟这些请求,进而在开发过程中实现与Web服务的交互。
|
1月前
idea快速生成get set 构造方法的快捷键
idea快速生成get set 构造方法的快捷键
95 0
|
1月前
|
存储 NoSQL Ubuntu
在Ubuntu上安装Redis并学习使用get、set和keys命令
在Ubuntu上安装Redis并学习使用get、set和keys命令
|
10月前
|
JavaScript
TypeScript get 与 set 的使用
TypeScript get 与 set 的使用
139 0
|
22天前
|
缓存 NoSQL 关系型数据库
Redis第二课,1.set key value(设置对应的key和value)2.get key(得到value值)Redis全局命令(支持很多的数据结构)3.keys(用来查询当前
Redis第二课,1.set key value(设置对应的key和value)2.get key(得到value值)Redis全局命令(支持很多的数据结构)3.keys(用来查询当前
|
1月前
|
druid Java
Error attempting to get column ‘createTime‘ from result set的异常
Error attempting to get column ‘createTime‘ from result set的异常
138 0
|
1月前
|
XML Java 数据库连接
mybatis和mybatiplus中Error attempting to get column ‘xx‘ from result set
mybatis和mybatiplus中Error attempting to get column ‘xx‘ from result set
76 0
|
8月前
|
Java
Java-----抽象类为什么不能实例化?抽象方法为什么不能被static修饰?set和get方法的使用方法
Java-----抽象类为什么不能实例化?抽象方法为什么不能被static修饰?set和get方法的使用方法
|
1月前
|
存储 监控 NoSQL
搞定 Redis 数据存储原理,别只会 set、get 了
搞定 Redis 数据存储原理,别只会 set、get 了
55 0