类成员的访问类型(又称访问修饰符)
应该有四种,但我能理解的先只有两种:public与private。
private定义的成员在外部无法访问到,如果外部强行访问,编译器告错,示例代码如下:
1using System;
2
3class m
4{
5 static void Main()
6 {
7 point p=new point();
8 Console.WriteLine("x=" + p.x.ToString());
9 }
10}
11
12class point
13{
14 private double x=10;
15}
16
2
3class m
4{
5 static void Main()
6 {
7 point p=new point();
8 Console.WriteLine("x=" + p.x.ToString());
9 }
10}
11
12class point
13{
14 private double x=10;
15}
16
编译时出错提示如下:
p.cs(8,30): error CS0122: “point.x”不可访问,因为它受保护级别限制
p.cs(14,17): (与前一个错误相关的符号位置)
如果第14行改为public就不会出错了。
默认是什么?
当我把14行的private去掉,只写double x=10;,编译结果与private一样,由此可以感觉出默认情况下是private的。
在VB6的控件编程中,我也是把控件的属性存在私有变量中,而用Let(或Set)与Get这两个特殊子程序来与外界沟通。如果把它移到C#中,Let与Get变为set与get。代码则写成如下:
//前面相同,省略
class point
{
double m_x=10;
public double x
{
get { return m_x; }
set { m_x = value; }
}
}
class point
{
double m_x=10;
public double x
{
get { return m_x; }
set { m_x = value; }
}
}
这样就没问题了,其中我自己设定私有变量全部用m_为开头。VB中Let是有带参数的,C#中却把参数都省了,将要设的值就是value,任何类型都用value来代替,统一,我喜欢。但与VB的代码对比一下,却发现VB的Let有时还可以多带一个索引,C#中索引如何表达?
另外,我还在IDE环境中试一了下,如果类型为枚举值,在set中使用value能不能智能感知出其取值的可能性。结果是可以的,IDE中value的类型与x的类型保持一致。
//前面相同,省略
class point
{
enum POS_X
{
P_LOW = 10,
P_MID = 20,
P_HIG = 30
};
POS_X m_x=10;
public POS_X x
{
get { return m_x; }
set { m_x = value + POS_X.P_LOW; }
}
}
class point
{
enum POS_X
{
P_LOW = 10,
P_MID = 20,
P_HIG = 30
};
POS_X m_x=10;
public POS_X x
{
get { return m_x; }
set { m_x = value + POS_X.P_LOW; }
}
}
当你输入到“set { m_x = value +”时,IDE自动弹出POS_X及相应内容。