C#类中的属性使用总结(详解类的属性)
程序员文章站
2023-12-19 18:33:10
复制代码 代码如下:private int dd; public int dd { get{ re...
复制代码 代码如下:
private int dd;
public int dd
{
get{ return xx*3;}
set{ xx = value/3;}
}
没有set的属性是一种只读属性,没有get的访问器是一种只写属性。
(1) get访问器用来返回字段或者计算 并返回字段,它必须以return或者throw终结。
复制代码 代码如下:
private string name;
public string name
{
get
{
return name != null ? name : "na";
}
}
(2) set访问器类似返回类型为void的函数,使用value的隐式参数
复制代码 代码如下:
private string name; // the name field
public string name // the name property
{
get
{
return name;
}
set
{
name = value;
}
}
(3) 访问器的限制
属性访问标记可以为public,private,protected,internal,protected internal,因为访问器的访问限制必须比属性的访问限制更加严格,所以
复制代码 代码如下:
private int xx;
public int sxx
{
public get { return xx; }//error
set { xx = value; }
}
不能对接口或者显式的接口使用访问修饰符,因为接口里里面所有的默认是public的;
同时具有get,set访问器时,才允许使用访问修饰符,并且只能有一个使用;
如果属性有override修饰的时候,访问器修饰符必须与被重写的匹配。
访问器的可访问级别必须比属性的可访问级别更加严格
理解:
首先第四条最容易想到,也是很合理的,毕竟是外围的决定内部的。
其次,既然第四条可以理解,那么如果只有一个访问器的时候,访问器访问级别等同属性,如果这个时候再去指 定更加严格的访问级别,那么为何不当初在属性上指定呢?
这条理解了,那么为什么必须同时具有get,set才能添加访问修饰符就更加明确了。
推理:
接口中属性是public的,那么如果接口中只有一个get或者set的时候,我们可以在继承中指明另一个访问器的属 性。但是如果接口中同时具有get,set,那么按照派生和继承的匹配性,这时候就不能这样再指定访问器的访问限制了。
复制代码 代码如下:
public interface isomeinterface
{
int testproperty
{
// no access modifier allowed here
// because this is an interface.
get;
}
}
public class testclass : isomeinterface
{
public int testproperty
{
// cannot use access modifier here because
// this is an interface implementation.
get { return 10; }
// interface property does not have set accessor,
// so access modifier is allowed.
protected set { }
}
}
(4)可以用static 修饰属性,以便随时访问
复制代码 代码如下:
private static int counter;
public static int counter
{
get { return counter; }
}
(5)属性隐藏
复制代码 代码如下:
public class employee
{
private string name;
public string name
{
get { return name; }
set { name = value; }
}
}
public class manager : employee
{
private string name;
// notice the use of the new modifier:
public new string name // use new to hide property in base class
{
get { return name; }
set { name = value + ", manager"; }
}
}
(6)virtual来修饰属性,派生类使用override来重写属性
复制代码 代码如下:
public class parent
{
public virtual int testproperty
{
protected set { }
get { return 0; }
}
}
public class kid : parent
{
public override int testproperty
{
protected set { }
get { return 0; }
}
}
(7) abstract 修饰属性,派生类来实现属性
复制代码 代码如下:
abstract class shape
{
public abstract double area
{
get;
set;
}
}
class square : shape
{
public double side;
public override double area
{
get
{
return side * side;
}
set
{
side = system.math.sqrt(value);
}
}
}
(8)sealed 修饰属性,派生类不能修改属性
(9)接口属性
接口属性不具有函数体
复制代码 代码如下:
public interface inters
{
string name
{
get;
set;
}
}
(10) 自动属性
当属性访问器中不需要其他访问逻辑时候,就可以使用自动属性,使代码更加简洁
复制代码 代码如下:
public double totalpurchases { get; set; }
public string name { get; set; }
public int customerid { get; set; }