系列一:c#语言元素(属性,常量,转换,条件化编辑)
1.使用属性代替可访问的数据成员。.NET的数据绑定类只支持属性绑定。对于我们在类中的公有字段不会理会。我们在绑定一个数据项的时候是通过反射的机制查找对象中是否有特定的属性实现的。
2.由于属性的本质是方法,所以有下面的几个好处
1)能利于我们在程序中实现多线程编程的好处。
2)实现虚属性,方便继承类对属性的重写。
3)设置为抽象属性,也可以作为接口的一部分(平常我们写接口的时候只是方法的抽象,很少对属性进行抽象,其实属性本质既然是方法,那它也可以放在接口中或者抽象类中定义一定的标准,让继承类去实现它)
     public interface INameValuePair
    {
       object Value
       {
         get;
         set;
       }
   }
同样我们也可以设置属性的访问权限
  public class Customer
  {
    private string _name;
    public virtual string Name
    {
        get
        {
            return _name;
        }
        protected set  //设置了保护修饰符属性
       {
          _name = value;
       }
   }
}
4)学会怎样设置索引
索引其实和属性一样,都是生产一对方法(get,set),不同之处是它是用this关键字,并且带有参数;它主要是根据索引提供的参数返回类中的字段的方法。
定义格式:访问类型 返回类型 this[参数列表]{get{}set{}}
注意它的参数可以使任何类型,也可以有任意个参数(我们可以设置其为数组,字典或哈希表)。实例如下:
public class Class1
{
    string[] m = new string[]{ "dd", "fdf", "ddfe", "dsd", "dd",  };
    public Class1()
 {
  //
  //TODO: 在此处添加构造函数逻辑
  //
 }
    public string this[int i, int j]
    {
        get 
        {
            if (i + j == 3)
            {
                return m[3];
            }
            else
                return m[2];
        }
        set 
        {
            if (i + j == 3)
            {
                m[3] = "ddddddddddddd";
            }
        }
    }
}
调用:
    protected void Button1_Click(object sender, EventArgs e)
    {
        int i =Convert.ToInt16(TextBox1.Text);
        int k =Convert.ToInt16(TextBox2.Text);
        Class1 c = new Class1();
        Label1.Text = c[i, k];
}
实例二:
using System.Collections;
class IndexClass
{
private Hashtable ht = new Hashtable();
public object this[object key]
{
get { return ht[key]; }
set { ht[key] = value); }
}
}
3.常量
常量分运行时常量(readonly)和编译时常量(const)
readonly很灵活,而const的值一开始就定下来了不能再修改了,但是速度稍微快一些,但是我们推荐用readonly。
当我们定义版本的时候,特性类的参数,枚举定义以及一些不会变化的东西的时候才用const其他时候用readonly
4.操作符is或as优于强制类型转换
.net是一种强类型语言,我们最好少用强制类型转换,我们更应该用is做个测试然后在用as操作符或强制类型转换。但是还是多用as少用强制类型转换。注意as和is不执行任何用户自定义的转换,只有当运行时类型与目标类型匹配时才转换。
看下面的例子比较as和强制转换的异同:
       object o = Factory.GetObject( );
        // 第一个版本:
       MyType t = o as MyType;
      if ( t != null )//判断是否转化成功
       {
          // 处理t, t现在的类型为MyType。
       }
      else
      {
           // 报告转型失败。
      }
    或者,也可以像下面这样来做:
      object o = Factory.GetObject( );
      // 第二个版本:
     try {
             MyType t;
             t = ( MyType ) o;
            if ( t != null )
             {
                 // 处理t, t现在的类型为MyType
              }
             else
             {
                 // 报告空引用失败。
             }
          } catch
         {
             // 报告转型失败。
          }
第一个版本的转型代码更简单,也更容易阅读。其中没有添加额外的try/catch语句,因此也就避免了其带来的负担。注意,第二个版本中除了要捕捉异常外,还要对null的情况进行检查,因为如果o本来就是null,那么强制转型可以将它转换成任何引用类型。但如果是as操作符,且被转换对象为null,那么执行结果将返回null。因此,如果使用强制转型,我们既要检查其是否为null,还要捕捉异常。如果使用as操作符,我们只需要检查返回的引用是否为null就可以了。
as操作符主要用于继承关系的转换,不能对值类型进行转换,因为值类型没有null的情况
对于需要值类型转换的我们为了避免进行异常处理我们可以先进行is判断它的类型,在用强制类型转换的方法对其进行转换,要得到一个对象的真实类型推荐用getType();
5.conditional代替#if条件编辑
conditional使用在单独的方法上面,并且是放在没有返回值的函数上面
我们不能在一个方法内的代码块上应用Conditional特性,也不可以在有返回值的方法上应用Conditional特性。
   [Conditional( "DEBUG" )]
   private void CheckState( )
   {
        // 代码保持不变。
   }
应用了Conditional特性之后,C#编译器只有在检测到DEBUG环境变量时,才会产生对CheckState方法的调用。Conditional特性不会影响CheckState()方法的编译,它只会影响对该方法的调用。如果定义有DEBUG符号,上面的LastName属性将变为如下的代码:
public string LastName
{
get
{
CheckState( );
return _lastName;
}
set
{
CheckState( );
_lastName = value;
CheckState( );
}
}
否则,将得到如下代码:
public string LastName
{
get
{
return _lastName;
}
set
{
_lastName = value;
}
}
我们创建的方法也可以依赖于多个环境变量。当我们应用多个Conditional特性时,它们之间的组合关系将为“或(OR)”。例如,下面的CheckState方法被调用的条件为定义有DEBUG或者TRACE环境变量:
   [Conditional( "DEBUG" ),Conditional( "TRACE" ) ]
   private void CheckState( ){}
为了应用Conditional特性,我们需要将具有条件性的行为单独放到一个方法中。虽然我们仍然需要注意那些Conditional方法可能给对象状态带来的负面效应,但Conditional特性的隔离策略总归要比#if/#endif好得多。使用#if和#endif代码块,我们很有可能会错误地删除一些重要的方法调用或者赋值语句。
 
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号